ESP8266 SDK開發: 外設篇-GPIO中斷檢測


 

 

 

NONOS(2.2.0)

NONOS(2.2.0)

NONOS(2.2.0)

 1.直接上菜

 

 

 

void gpio0_intr_handler()
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//讀取GPIO狀態寄存器,獲取中斷信息
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清除中斷信息
    if(gpio_status & (BIT(0)))//GPIO0產生的中斷
    {
        if(!GPIO_INPUT_GET(0))//GPIO0是低電平    GPIO0確實是下降沿產生了中斷
        {
            os_printf("GpioDown\r\n");
        }
    }
}

/******************************************************************************
 * FunctionName : user_init
 * Description  : entry of user application, init user function here
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
    uart_init_2(BIT_RATE_115200,BIT_RATE_115200);
    os_printf("SDK version:%s\n", system_get_sdk_version());
    os_printf("hello_ai\n");

    /*配置中斷引腳**********************************************/
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U , FUNC_GPIO0);
    GPIO_DIS_OUTPUT(0);//如果以前設置過GPIO為輸出,則調用此函數關閉GPIO輸出
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//上拉輸入
    //全局關閉GPIO中斷
    ETS_GPIO_INTR_DISABLE();
    //設置中斷函數
    ETS_GPIO_INTR_ATTACH(gpio0_intr_handler, NULL);
    //設置中斷觸發方式
    gpio_pin_intr_state_set(0, GPIO_PIN_INTR_NEGEDGE);//下降沿觸發
    ETS_GPIO_INTR_ENABLE();
}

 

測試

按下按鈕

 

 

 

RTOS(2.2.0)

RTOS(2.2.0)

RTOS(2.2.0)

 1.直接上菜

 

 

 

#include "gpio.h"

//設置GPIO0下降沿中斷

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U , FUNC_GPIO0);//GPIO0做為普通IO使用
    GPIO_DIS_OUTPUT(0);//0:GPIO0    如果以前設置過GPIO為輸出,則調用此函數關閉GPIO0輸出
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//GPIO0上拉輸入

    _xt_isr_mask(1<<ETS_GPIO_INUM);    //關閉GPIO中斷
    gpio_intr_handler_register(gpio0_intr_handler, NULL);//設置中斷函數
    gpio_pin_intr_state_set(0, GPIO_PIN_INTR_NEGEDGE);//0:GPIO0        GPIO_PIN_INTR_NEGEDGE:下降沿觸發
    _xt_isr_unmask(1 << ETS_GPIO_INUM); //使能GPIO中斷

 

//GPIO0中斷回調函數

void gpio0_intr_handler()
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//讀取GPIO狀態寄存器,獲取中斷信息
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清除中斷信息
    if(gpio_status & (BIT(0)))//GPIO0產生的中斷
    {
        if(!GPIO_INPUT_GET(0))//GPIO0是低電平    GPIO0確實是下降沿產生了中斷
        {
            printf("GpioDown\r\n");
        }
    }
}

 

如果使用的NONOS版本請查看文章最后的區別

 

測試

按下按鈕

 

 

 

 

 

擴展:配置GPIO4

//設置GPIO4下降沿中斷

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U , FUNC_GPIO4);//GPIO4做為普通IO使用
    GPIO_DIS_OUTPUT(4);//4:GPIO4    如果以前設置過GPI4為輸出,則調用此函數關閉GPIO4輸出
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4上拉輸入

    _xt_isr_mask(1<<ETS_GPIO_INUM);    //關閉GPIO中斷
    gpio_intr_handler_register(gpio4_intr_handler, NULL);//設置中斷函數
    gpio_pin_intr_state_set(4, GPIO_PIN_INTR_NEGEDGE);//4:GPIO4        GPIO_PIN_INTR_NEGEDGE:下降沿觸發
    _xt_isr_unmask(1 << ETS_GPIO_INUM); //使能GPIO中斷

 

//GPIO4中斷回調函數

void gpio4_intr_handler()
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//讀取GPIO狀態寄存器,獲取中斷信息
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清除中斷信息
    if(gpio_status & (BIT(4)))//GPIO4產生的中斷
 { if(!GPIO_INPUT_GET(4))//GPIO4是低電平 GPIO4確實是下降沿產生了中斷  { printf("GpioDown\r\n"); } } }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM