筆者是第一次測試 ESP8266 的中斷(Interrupt)功能,看看能否將來的製作會使用中斷,這次是使用 GPIO4 作測試, GPIO4 會連接到按鍵開關,當按鍵按下,便會產生中斷要求,停止現在執行的工作,跳至中斷程式執行完畢,便會回到執行中的工作,繼續執行。
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%
天氣:多雲
沒有留言:
張貼留言