ESP8266 NON-OS SDK 和 RTOS SDK實現GPIO中斷不同點


ESP8266 Non-OS SDK 和 RTOS SDK 實現GPIO的方法稍有不同:

對於 Non-OS SDK,比如需要把 MTDO 配置成輸入,同時下降沿觸發中斷:

gpio_init(void) { PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15); GPIO_DIS_OUTPUT(GPIO_ID_PIN(15)); //Configure it in input mode. 
ETS_GPIO_INTR_DISABLE();    //Close the GPIO interrupt//Register the interrupt function 
ETS_GPIO_INTR_ATTACH(GPIO_INTERRUPT,NULL); gpio_pin_intr_state_set(GPIO_ID_PIN(15),GPIO_PIN_INTR_NEGEDGE); //Falling edge trigger 
ETS_GPIO_INTR_ENABLE() ;    //Enable the GPIO interrupt
}  

 對於 RTOS SDK,實現相同的功能:

{ GPIO_ConfigTypeDef gpio_in_cfg; //Define GPIO Init Structure
  gpio_in_cfg.GPIO_IntrType = GPIO_PIN_INTR_NEGEDGE;    //   gpio_in_cfg.GPIO_Mode = GPIO_Mode_Input;    //Input mode
  gpio_in_cfg.GPIO_Pullup = GPIO_PullUp_EN; gpio_in_cfg.GPIO_Pin = keygpio;    // Enable GPIO
  gpio_config(&gpio_in_cfg);    //Initialization function
 GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, TRUE); gpio_intr_handler_register(keyinterrupt_cb, NULL); // Register the interrupt function
  _xt_isr_unmask(1 << ETS_GPIO_INUM);    //Enable the GPIO interrupt
} 

特別留意:

在中斷回調函數中,

{ _xt_isr_mask(1<<ETS_GPIO_INUM);    //disable interrupt
 .... GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, TRUE ); //clear interrupt mask
  _xt_isr_unmask(1 << ETS_GPIO_INUM); //Enable the GPIO interrupt
}

在disable interrupt之后,如果有中斷信號觸發中斷引腳,即使還未使能中斷,但interrupt mask仍然會被置為中斷標志,因此,為避免Enable the GPIO interrupt之后,由於受之前中斷位的影響而馬上再次中斷,故在_xt_isr_unmask(1 << ETS_GPIO_INUM);  //Enable the GPIO interrupt之前務必加上GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, TRUE ); //clear interrupt mask

 


免責聲明!

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



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