关于ESP8266 GPIO中断使用的总结
生活随笔
收集整理的這篇文章主要介紹了
关于ESP8266 GPIO中断使用的总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近折騰新項目需要用到GPIO的中斷來處理一些邏輯功能,翻看了官網的API開發文檔,文檔說的比較簡單,只是對API方法做了一下解釋說明,沒有實際的完整例子,沒辦法,只能問度娘了。度娘果然啥都有,參考了以下這篇文章:
http://blog.csdn.net/qq_15647227/article/details/52218286?locationNum=1
這篇文章不但給出了實例代碼,還對api進行了說明,寫得非常好,大家完全可以參照這篇代碼來做,因為我的項目需要用到兩個gpio
管腳
中斷,需要在這篇文章的基礎上再添加一個
管腳
,這里就把我在添加過程中遇到的一些問題和難點再進一步說明一下。廢話不說,先上代碼,然后再來解釋說明。
#include?"osapi.h"?? #include?"user_interface.h"?? #include?"ets_sys.h"?? #include?"mem.h"?? ?? uint32?ICACHE_FLASH_ATTR?user_rf_cal_sector_set(void)?? {?? ????enum?flash_size_map?size_map?=?system_get_flash_size_map();?? ????uint32?rf_cal_sec?=?0;?? ?? ????switch?(size_map)?{?? ????????case?FLASH_SIZE_4M_MAP_256_256:?? ????????????rf_cal_sec?=?128?-?5;?? ????????????break;?? ?? ????????case?FLASH_SIZE_8M_MAP_512_512:?? ????????????rf_cal_sec?=?256?-?5;?? ????????????break;?? ?? ????????case?FLASH_SIZE_16M_MAP_512_512:?? ????????case?FLASH_SIZE_16M_MAP_1024_1024:?? ????????????rf_cal_sec?=?512?-?5;?? ????????????break;?? ?? ????????case?FLASH_SIZE_32M_MAP_512_512:?? ????????case?FLASH_SIZE_32M_MAP_1024_1024:?? ????????????rf_cal_sec?=?1024?-?5;?? ????????????break;?? ?? ????????default:?? ????????????rf_cal_sec?=?0;?? ????????????break;?? ????}?? ?? ????return?rf_cal_sec;?? }?? ?? static?void?gpio_intr_handler()?? {?? ????uint32?gpio_status?=?GPIO_REG_READ(GPIO_STATUS_ADDRESS);?? ????ETS_GPIO_INTR_DISABLE();//關閉中斷?? ????if(gpio_status?&?BIT(4))//判斷中斷針腳?? ????{?? ????????os_printf("111\n");//輸出1111?? ????}?? ????if(gpio_status?&?BIT(5))//判斷中斷針腳?? ????{?? ????????os_printf("222\n");//輸出222?? ????}?? ????os_delay_us(10000);//系統延時?? ????GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,?gpio_status);//清中斷標志?? ????ETS_GPIO_INTR_ENABLE();//打開中斷?? }?? ?? ?? void?ICACHE_FLASH_ATTR?user_init(void)?? {?? ????gpio_init();?? ????PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,?FUNC_GPIO5);//設置GPIO功能?? ????GPIO_DIS_OUTPUT(GPIO_ID_PIN(5));//設置GPIO5為輸入?? ????PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,?FUNC_GPIO4);<span?style="font-family:?Arial,?Helvetica,?sans-serif;">//設置GPIO功能</span>?? ????GPIO_DIS_OUTPUT(GPIO_ID_PIN(4));//設置GPIO5為輸入?? ?????? ????PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5使能上拉?? ????PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4使能上拉?? ?????? ????ETS_GPIO_INTR_DISABLE();//關閉中斷?? ????ETS_GPIO_INTR_ATTACH(&gpio_intr_handler,?NULL);//設置中斷函數?? ????gpio_pin_intr_state_set(GPIO_ID_PIN(5),?GPIO_PIN_INTR_LOLEVEL);//設置中斷類型?? ????gpio_pin_intr_state_set(GPIO_ID_PIN(4),?GPIO_PIN_INTR_LOLEVEL);//設置中斷類型?? ?? ????ETS_GPIO_INTR_ENABLE();//打開中斷?? }??
uint32?ICACHE_FLASH_ATTR?user_rf_cal_sector_set(void)??
這個函數,不然無法編譯。先來說一下代碼功能,這里使用了GPIO4和GPIO5兩個管腳來做中斷,當GPIO4管腳拉低的時候觸發中斷,終端輸出111,GPIO5管腳拉低的時候,輸出222,就是這么簡單的實驗。現在分析一下代碼行及注意事項。
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,?FUNC_GPIO5);//設置GPIO功能?? GPIO_DIS_OUTPUT(GPIO_ID_PIN(5));//設置GPIO5為輸入??
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5使能上拉?? PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4使能上拉??
[cpp]?view plaincopy
因為用的是1.4的SDK,所以代碼中多了
[plain]?view plaincopy
[plain]?view plaincopy
首先來看這兩行,很多網友可能知道這兩行是干嗎用的,但是有沒有對里面的參數有疑問的,之前筆者就一直對這個一知半解,文檔里面的描述是PIN_FUNC_SELECT(PIN_NAME,FUNC) 一個是管教名稱,另一個是FUNC,那么這個PIN_NAME跟FUNC在哪里找呢,原來在官方SDK包的include/eagle_soc.h文件里有描述,大家可以去看看,然后根據自己的管腳填寫,不然雖然編譯能通過,但是管腳卻不起作用,這里定義了GPIO4跟GPIO5兩個管腳,并把管腳設置為輸入。管腳設置好后,通過以下語句來上拉管腳使能,這里要注意,這個很重要,不然一會中斷會出現莫名奇妙的問題。
[plain]?view plaincopy
接著就可以按照文章里面的方法配置中斷處理函數,添加相關的處理方法,我在里面參考其他網友的方法添加了延時。基本上就差不多這樣了,大家可以根據自己的實際需求進行修改,或者自己添加更多的管腳,希望這篇文章能幫助到大家。有興趣的朋友也可以加入企鵝群(254267969)一起交流
總結
以上是生活随笔為你收集整理的关于ESP8266 GPIO中断使用的总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ESP8266】NONOS SDK开发
- 下一篇: 【ESP8266】使用ESP8266 N