请选择 进入手机版 | 继续访问电脑版
查看: 183|回复: 1

[单片机资料] ESP8266 GPIO中断使用的总结

[复制链接]

签到天数: 405 天

[LV.9]元老将成

发表于 2018-8-10 21:13:30 | 显示全部楼层 |阅读模式
最近折腾新项目需要用到GPIO的中断来处理一些逻辑功能,翻看了官网的API开发文档,文档说的比较简单,只是对API方法做了一下解释说明,没有实际的完整例子,没办法,只能问度娘了。度娘果然啥都有,大家完全可以参照这篇代码来做,因为我的项目需要用到两个gpio管脚中断,需要在这篇文章的基础上再添加一个管脚,这里就把我在添加过程中遇到的一些问题和难点再进一步说明一下。废话不说,先上代码,然后再来解释说明。
  1. #include "osapi.h"
  2. #include "user_interface.h"
  3. #include "ets_sys.h"
  4. #include "mem.h"

  5. uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)
  6. {
  7.     enum flash_size_map size_map = system_get_flash_size_map();
  8.     uint32 rf_cal_sec = 0;

  9.     switch (size_map) {
  10.         case FLASH_SIZE_4M_MAP_256_256:
  11.             rf_cal_sec = 128 - 5;
  12.             break;

  13.         case FLASH_SIZE_8M_MAP_512_512:
  14.             rf_cal_sec = 256 - 5;
  15.             break;

  16.         case FLASH_SIZE_16M_MAP_512_512:
  17.         case FLASH_SIZE_16M_MAP_1024_1024:
  18.             rf_cal_sec = 512 - 5;
  19.             break;

  20.         case FLASH_SIZE_32M_MAP_512_512:
  21.         case FLASH_SIZE_32M_MAP_1024_1024:
  22.             rf_cal_sec = 1024 - 5;
  23.             break;

  24.         default:
  25.             rf_cal_sec = 0;
  26.             break;
  27.     }

  28.     return rf_cal_sec;
  29. }

  30. static void gpio_intr_handler()
  31. {
  32.         uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
  33.         ETS_GPIO_INTR_DISABLE();//关闭中断
  34.         if(gpio_status & BIT(4))//判断中断针脚
  35.         {
  36.                 os_printf("111\n");//输出1111
  37.         }
  38.         if(gpio_status & BIT(5))//判断中断针脚
  39.         {
  40.                 os_printf("222\n");//输出222
  41.         }
  42.         os_delay_us(10000);//系统延时
  43.         GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清中断标志
  44.         ETS_GPIO_INTR_ENABLE();//打开中断
  45. }


  46. void ICACHE_FLASH_ATTR user_init(void)
  47. {
  48.         gpio_init();
  49.         PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);//设置GPIO功能
  50.         GPIO_DIS_OUTPUT(GPIO_ID_PIN(5));//设置GPIO5为输入
  51.         PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);//设置GPIO功能
  52.         GPIO_DIS_OUTPUT(GPIO_ID_PIN(4));//设置GPIO5为输入
  53.         
  54.         PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5使能上拉
  55.         PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4使能上拉
  56.         
  57.         ETS_GPIO_INTR_DISABLE();//关闭中断
  58.         ETS_GPIO_INTR_ATTACH(&gpio_intr_handler, NULL);//设置中断函数
  59.         gpio_pin_intr_state_set(GPIO_ID_PIN(5), GPIO_PIN_INTR_LOLEVEL);//设置中断类型
  60.         gpio_pin_intr_state_set(GPIO_ID_PIN(4), GPIO_PIN_INTR_LOLEVEL);//设置中断类型

  61.         ETS_GPIO_INTR_ENABLE();//打开中断
  62. }
复制代码
因为用的是1.4的SDK,所以代码中多了
  1. uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)
复制代码
这个函数,不然无法编译。先来说一下代码功能,这里使用了GPIO4和GPIO5两个管脚来做中断,当GPIO4管脚拉低的时候触发中断,终端输出111,GPIO5管脚拉低的时候,输出222,就是这么简单的实验。现在分析一下代码行及注意事项。

  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两个管脚,并把管脚设置为输入。管脚设置好后,通过以下语句来上拉管脚使能,这里要注意,这个很重要,不然一会中断会出现莫名奇妙的问题。

  1. PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5使能上拉
  2. PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4使能上拉
复制代码

接着就可以按照文章里面的方法配置中断处理函数,添加相关的处理方法,我在里面参考其他网友的方法添加了延时。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

返回顶部