在微處理器(CPU / MCU)的執行程式中,中斷(Interrupt)是非常有用的方法,中斷是可以導致微處理器或微控制器停止執行正在工作中的任務,並且跳至指定的中斷任務,完成中斷任務後,返回中斷之前的任務,繼續執行,不用浪費許多時間在訪問/輪詢(Polling)工作上。
微處理器(CPU / MCU)執行中斷程式 |
ESP8266 I/O 的四種中斷:
- GPIO 中斷
- 計時器中斷
- 串口中斷
- SPI 中斷
- GPIO_PIN_INTR_POSEDGE = 1 //上升沿
- GPIO_PIN_INTR_NEGEDGE = 2 //下降沿
- GPIO_PIN_INTR_ANYEDGE = 3 //雙邊沿
- GPIO_PIN_INTR_LOLEVEL = 4 //低電平
- GPIO_PIN_INTR_HILEVEL = 5 //高電平
- 選擇管腳,除了 GPIO16 引腳,其他引腳都可以使用中斷功能。
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);
GPIO0:PERIPHS_IO_MUX_GPIO0_U
GPIO1:PERIPHS_IO_MUX_U0TXD_U
GPIO2:PERIPHS_IO_MUX_GPIO2_U
GPIO3:PERIPHS_IO_MUX_U0RXD_U
GPIO4:PERIPHS_IO_MUX_GPIO4_U
GPIO5:PERIPHS_IO_MUX_GPIO5_U
GPIO6:PERIPHS_IO_MUX_SD_CLK_U
GPIO7:PERIPHS_IO_MUX_SD_DATA0_U
GPIO8:PERIPHS_IO_MUX_SD_DATA1_U
GPIO9:PERIPHS_IO_MUX_SD_DATA2_U
GPIO10:PERIPHS_IO_MUX_SD_DATA3_U
GPIO11:PERIPHS_IO_MUX_SD_CMD_U
GPIO12:PERIPHS_IO_MUX_MTDI_U
GPIO13:PERIPHS_IO_MUX_MTCK_U
GPIO14:PERIPHS_IO_MUX_MTMS_U
GPIO15:PERIPHS_IO_MUX_MTDO_U - 設置對應管腳為輸入模式
GPIO_DIS_OUTPUT(GPIO_ID_PIN(2)); - 設置對應中斷的觸發方式 觸發方式有5種
gpio_pin_intr_state_set(GPIO_ID_PIN(2),GPIO_PIN_INTR_NEGEDGE); GPIO_PIN_INTR_POSEDGE = 1 //上升沿
GPIO_PIN_INTR_NEGEDGE = 2 //下降沿
GPIO_PIN_INTR_ANYEDGE = 3 //雙邊沿
GPIO_PIN_INTR_LOLEVEL = 4 //低電平
GPIO_PIN_INTR_HILEVEL = 5 //高電平 - 設置中斷的回呼函數
ETS_GPIO_INTR_ATTACH(ext_interrupt_callback,NULL); //設置中斷回呼函數 - 開啟中斷
ETS_GPIO_INTR_ENABLE(); //開啟gpio中斷 - Callback 函數的編寫
void ICACHE_FLASH_ATTR
GPIO_Input_Inter(void)
{
// GPIO 功能定義
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,
FUNC_GPIO4);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,
FUNC_GPIO5
// Disable 輸出功能
GPIO_DIS_OUTPUT(FUNC_GPIO5);
GPIO_DIS_OUTPUT(FUNC_GPIO4);
//GPIO5 中斷配置
ETS_GPIO_INTR_DISABLE(); //中斷失能
ETS_GPIO_INTR_ATTACH(&GPIO_ISR_Handler,
NULL ); //註冊中斷函數
//設置 GPIO5 中斷方式
gpio_pin_intr_state_set( GPIO_ID_PIN(5),
GPIO_PIN_INTR_ANYEDGE );
// 清除該引腳的GPIO中斷標誌
GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS,
BIT(5));
ETS_GPIO_INTR_ENABLE(); //中斷使能
ETS_GPIO_INTR_DISABLE();
ETS_GPIO_INTR_ATTACH(&GPIO_ISR_Handler,
NULL ); //註冊中斷函數
//設置 GPIO4 中斷方式
gpio_pin_intr_state_set(
GPIO_ID_PIN(4), GPIO_PIN_INTR_ANYEDGE );
GPIO_REG_WRITE(
GPIO_STATUS_W1TC_ADDRESS, BIT(4));
ETS_GPIO_INTR_ENABLE();
ETS_GPIO_INTR_DISABLE();
ETS_GPIO_INTR_ATTACH(&GPIO_ISR_Handler,
NULL ); //註冊中斷函數 TTL1
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U); //使能上拉
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);
gpio_output_set(0,0,0,BIT5); //使能輸入
gpio_output_set(0,0,0,BIT4);
gpio_output_set(0,0,0,BIT14);
gpio_output_set(0,0,0,BIT13);
gpio_output_set(0,0,0,BIT12);
}
|
ESP8266 中斷(Interrupt)執行程式:
void GPIO_ISR_Handler(void)
{
u32 pin_status=0;
// 讀取 GPIO 中斷狀態可以判斷是那個埠的中斷
pin_status = GPIO_REG_READ(
GPIO_STATUS_ADDRESS );
ETS_GPIO_INTR_DISABLE(); //關閉 GPIO 中斷
if ( pin_status&BIT(5) ) //GPIO5 的中斷
{
os_printf("GPIO5 觸發中斷\r\n");
}
// 清除 GPIO 中斷標誌
GPIO_REG_WRITE(
GPIO_STATUS_W1TC_ADDRESS, pin_status
); ETS_GPIO_INTR_ENABLE(); // 開啟 GPIO 中斷
}
|
ESP8266 中斷函數:incude\ets_sys.h,include\eagle_soc.h
2018年 2月 19日 天氣報告
氣溫:20.3度 @ 23:10
相對濕度:百分之 83%
天氣:大致多雲
沒有留言:
張貼留言