2018年2月20日 星期二

DIY - ESP8266:ESP-12F Interrupt 中斷測試(七十二)

DIY - ESP8266:ESP-12F Interrupt 中斷測試(七十二):

筆者是第一次測試 ESP8266 的中斷(Interrupt)功能,看看能否將來的製作會使用中斷,這次是使用 GPIO4 作測試, GPIO4 會連接到按鍵開關,當按鍵按下,便會產生中斷要求,停止現在執行的工作,跳至中斷程式執行完畢,便會回到執行中的工作,繼續執行。

ESP8266 ESP-12F Interrupt 中斷測試
ESP8266 ESP-12F 中斷(Interrupt)設定程式:
// Initialize all GPIOs
   gpio_init();

// Setup GPIO4
   PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
// Disable internal pullup/pulldown
   PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO4_U);

// Setup GPIO4 Interrupt
// Disable Interrupts by GPIO
   ETS_GPIO_INTR_DISABLE();

 // Attach interrupt handle when GPIO interrupts.
    ETS_GPIO_INTR_ATTACH(gpio_intr_handler, &Interrupt_count);
    gpio_register_set(GPIO_PIN_ADDR(4),
    GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE)  |
    GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) |
    GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE));

// Clear GPIO status
   GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(4));

// Enable interrupt for his GPIO
   gpio_pin_intr_state_set(GPIO_ID_PIN(4), 2); // NEGEDGE
   ETS_GPIO_INTR_ENABLE();
 

ESP8266 ESP-12F 中斷(Interrupt)程式:
LOCAL void  gpio_intr_handler(int * dummy)
{
// Read GPIO
   uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);

// Check  GPIO4 Intereupt
    if (gpio_status & BIT(4))
    {
        // Disable interrupt for GPIO0
          gpio_pin_intr_state_set(GPIO_ID_PIN(4), GPIO_PIN_INTR_DISABLE);

       //Clear interrupt status for GPIO0
        GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status & BIT(4));

       // Display Interrupt Occurred
        at_port_print("GPIO4=0 (D2) Interrupt Occurred .....\r\n");
        os_delay_us(1000);

// Reactivate interrupts for GPIO0
   gpio_pin_intr_state_set(GPIO_ID_PIN(4), 2);
    }
}

volatile int Interrupt_count;
 

ESP8266 ESP-12F Interrupt 中斷試驗
ESP-12F Interrupt 中斷試驗進行中
2018年 2月 20日 天氣報告
氣溫:20.2@ 21:40
相對濕度:百分之 89%
天氣:多雲
 

沒有留言:

張貼留言