关于ESP8266 GPIO中断使用的总结

最近折腾新项目需要用到GPIO的中断来处理一些逻辑功能,翻看了官网的API开发文档,文档说的比较简单,只是对API方法做了一下解释说明,没有实际的完整例子,没办法,只能问度娘了。度娘果然啥都有,参考了以下这篇文章: http://blog.csdn.net/qq_15647227/article/details/52218286?locationNum=1 这篇文章不但给出了实例代码,还对api进行了说明,写得非常好,大家完全可以参照这篇代码来做,因为我的项目需要用到两个gpio 管脚 中断,需要在这篇文章的基础上再添加一个 管脚 ,这里就把我在添加过程中遇到的一些问题和难点再进一步说明一下。废话不说,先上代码,然后再来解释说明。

[cpp]  view plain  copy
  1. #include "osapi.h"  
  2. #include "user_interface.h"  
  3. #include "ets_sys.h"  
  4. #include "mem.h"  
  5.   
  6. uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)  
  7. {  
  8.     enum flash_size_map size_map = system_get_flash_size_map();  
  9.     uint32 rf_cal_sec = 0;  
  10.   
  11.     switch (size_map) {  
  12.         case FLASH_SIZE_4M_MAP_256_256:  
  13.             rf_cal_sec = 128 - 5;  
  14.             break;  
  15.   
  16.         case FLASH_SIZE_8M_MAP_512_512:  
  17.             rf_cal_sec = 256 - 5;  
  18.             break;  
  19.   
  20.         case FLASH_SIZE_16M_MAP_512_512:  
  21.         case FLASH_SIZE_16M_MAP_1024_1024:  
  22.             rf_cal_sec = 512 - 5;  
  23.             break;  
  24.   
  25.         case FLASH_SIZE_32M_MAP_512_512:  
  26.         case FLASH_SIZE_32M_MAP_1024_1024:  
  27.             rf_cal_sec = 1024 - 5;  
  28.             break;  
  29.   
  30.         default:  
  31.             rf_cal_sec = 0;  
  32.             break;  
  33.     }  
  34.   
  35.     return rf_cal_sec;  
  36. }  
  37.   
  38. static void gpio_intr_handler()  
  39. {  
  40.     uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);  
  41.     ETS_GPIO_INTR_DISABLE();//关闭中断  
  42.     if(gpio_status & BIT(4))//判断中断针脚  
  43.     {  
  44.         os_printf("111\n");//输出1111  
  45.     }  
  46.     if(gpio_status & BIT(5))//判断中断针脚  
  47.     {  
  48.         os_printf("222\n");//输出222  
  49.     }  
  50.     os_delay_us(10000);//系统延时  
  51.     GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清中断标志  
  52.     ETS_GPIO_INTR_ENABLE();//打开中断  
  53. }  
  54.   
  55.   
  56. void ICACHE_FLASH_ATTR user_init(void)  
  57. {  
  58.     gpio_init();  
  59.     PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);//设置GPIO功能  
  60.     GPIO_DIS_OUTPUT(GPIO_ID_PIN(5));//设置GPIO5为输入  
  61.     PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);<span style="font-family: Arial, Helvetica, sans-serif;">//设置GPIO功能</span>  
  62.     GPIO_DIS_OUTPUT(GPIO_ID_PIN(4));//设置GPIO5为输入  
  63.       
  64.     PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5使能上拉  
  65.     PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4使能上拉  
  66.       
  67.     ETS_GPIO_INTR_DISABLE();//关闭中断  
  68.     ETS_GPIO_INTR_ATTACH(&gpio_intr_handler, NULL);//设置中断函数  
  69.     gpio_pin_intr_state_set(GPIO_ID_PIN(5), GPIO_PIN_INTR_LOLEVEL);//设置中断类型  
  70.     gpio_pin_intr_state_set(GPIO_ID_PIN(4), GPIO_PIN_INTR_LOLEVEL);//设置中断类型  
  71.   
  72.     ETS_GPIO_INTR_ENABLE();//打开中断  
  73. }  

因为用的是1.4的SDK,所以代码中多了

[plain]  view plain  copy
  1. uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)  
这个函数,不然无法编译。先来说一下代码功能,这里使用了GPIO4和GPIO5两个管脚来做中断,当GPIO4管脚拉低的时候触发中断,终端输出111,GPIO5管脚拉低的时候,输出222,就是这么简单的实验。现在分析一下代码行及注意事项。

[plain]  view plain  copy
  1. PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);//设置GPIO功能  
  2. GPIO_DIS_OUTPUT(GPIO_ID_PIN(5));//设置GPIO5为输入  

首先来看这两行,很多网友可能知道这两行是干吗用的,但是有没有对里面的参数有疑问的,之前笔者就一直对这个一知半解,文档里面的描述是PIN_FUNC_SELECT(PIN_NAME,FUNC) 一个是管教名称,另一个是FUNC,那么这个PIN_NAME跟FUNC在哪里找呢,原来在官方SDK包的include/eagle_soc.h文件里有描述,大家可以去看看,然后根据自己的管脚填写,不然虽然编译能通过,但是管脚却不起作用,这里定义了GPIO4跟GPIO5两个管脚,并把管脚设置为输入。管脚设置好后,通过以下语句来上拉管脚使能,这里要注意,这个很重要,不然一会中断会出现莫名奇妙的问题。

[plain]  view plain  copy
  1. PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5使能上拉  
  2. PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4使能上拉  

接着就可以按照文章里面的方法配置中断处理函数,添加相关的处理方法,我在里面参考其他网友的方法添加了延时。基本上就差不多这样了,大家可以根据自己的实际需求进行修改,或者自己添加更多的管脚,希望这篇文章能帮助到大家。有兴趣的朋友也可以加入企鹅群(254267969)一起交流

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值