2018年2月19日 星期一

DIY - ESP8266:ESP8266 Interrupt 中斷介紹(七十一)

DIY - ESP8266:ESP8266 Interrupt 中斷介紹(七十一):

在微處理器(CPU / MCU)的執行程式中,中斷(Interrupt)是非常有用的方法,中斷是可以導致微處理器或微控制器停止執行正在工作中的任務,並且跳至指定的中斷任務,完成中斷任務後,返回中斷之前的任務,繼續執行,不用浪費許多時間在訪問/輪詢(Polling)工作上。

微處理器(CPU / MCU)執行中斷程式
中斷可以分為外部觸發(Internal Interrupt)或內部觸發(External Interrupt),ESP8266 也是具有這兩種中斷方式。

ESP8266 I/O 的四種中斷:
  1. GPIO 中斷
  2. 計時器中斷
  3. 串口中斷
  4. SPI 中斷
ESP8266 外部觸發中斷方法:
  1. GPIO_PIN_INTR_POSEDGE = 1 //上升沿
  2. GPIO_PIN_INTR_NEGEDGE = 2 //下降沿
  3. GPIO_PIN_INTR_ANYEDGE = 3 //雙邊沿
  4. GPIO_PIN_INTR_LOLEVEL  = 4 //低電平
  5. GPIO_PIN_INTR_HILEVEL    = 5 //高電平
ESP8266 外部中斷的配置步驟:
  1. 選擇管腳,除了 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
  2. 設置對應管腳為輸入模式
    GPIO_DIS_OUTPUT(GPIO_ID_PIN(2));
  3. 設置對應中斷的觸發方式 觸發方式有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 //高電平
  4. 設置中斷的回呼函數
    ETS_GPIO_INTR_ATTACH(ext_interrupt_callback,NULL); //設置中斷回呼函數 
  5. 開啟中斷
    ETS_GPIO_INTR_ENABLE(); //開啟gpio中斷
  6. Callback 函數的編寫
ESP8266 中斷(Interrupt)設定程式:
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%
天氣:大致多雲

沒有留言:

張貼留言