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

[cpp] view plaincopy
  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);<span style="font-family: Arial, Helvetica, sans-serif;">//设置GPIO功能</span>
  52. GPIO_DIS_OUTPUT(GPIO_ID_PIN(4));//设置GPIO5为输入
  53. PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5使能上拉
  54. PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4使能上拉
  55. ETS_GPIO_INTR_DISABLE();//关闭中断
  56. ETS_GPIO_INTR_ATTACH(&gpio_intr_handler, NULL);//设置中断函数
  57. gpio_pin_intr_state_set(GPIO_ID_PIN(5), GPIO_PIN_INTR_LOLEVEL);//设置中断类型
  58. gpio_pin_intr_state_set(GPIO_ID_PIN(4), GPIO_PIN_INTR_LOLEVEL);//设置中断类型
  59. ETS_GPIO_INTR_ENABLE();//打开中断
  60. }

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

[plain] view plaincopy
  1. uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)

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

[plain] view plaincopy
  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 plaincopy
  1. PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5使能上拉
  2. PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4使能上拉

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

关于ESP8266 GPIO中断使用的总结相关推荐

  1. esp8266~GPIO中断和硬件定时器的正确使用

    最近项目需要检测IO口下降沿信号和定时计数,于是就用到了GPIO中断和硬件定时器.有点可惜,github上面RTOS版sdk没有硬件定时器的使用方法,能够参考的只有1.5的sdk,然而我不会移植,只能 ...

  2. LPC1768外部中断与GPIO中断

    LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 ...

  3. unbalanced enable irq 问题的解决 以及共享的gpio中断引起的问题

    点击打开链接 最近在工作中使用irq时遇到如下问题,根据log显示应该是什么所谓的不平横问题,先前也没有仔细研究这个问题,只是定位到是enable_irq函数调用所致. 因为在项目中使用的中断是gpi ...

  4. Omap3530 的GPIO中断设置

    Omap3530 的GPIO中断设置: 1.配置成GPIO,申请GPIO中断 omap_cfg_reg(OMAP3_KBD_GPIO);配置成gpio if (gpio_request(OMAP3_K ...

  5. OpenWrt 之 MT7628 使用GPIO中断

    在支持设备树的系统中使用中断一般有2种方式. 一.DTS配置interrupt节点 这里有个挺好的博客,链接地址:https://biscuitos.github.io/blog/DTS-interr ...

  6. 树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断

    一.SX1278 数字接口状态映射 从官方文档可知sx1278的数字接口状态映射明细,移植的代码中主要用查询的方式来判断在连续模式下是否接收和发送完成,因此只需要用到DIO0.如果要用到CAD,则需要 ...

  7. 将5350 i2c clk设置为gpio 中断模式的方法

    5350和我之前用的三星和全志的芯片在中断这块有点差别,三星和全志的都是有专门的外部中断管脚,并且每个中断管脚对应一个中断号,对管脚寄存器的配置即irq_desc里chip变量,都是bsp里自带的,我 ...

  8. IMX6ULL学习笔记(18)——GPIO中断

    一.中断简介 相比 STM32 的 NVIC,IMX6ULL 的中断控制系统更复杂,它的中断管理器使用的是 GIC V2,GIC V2 的实现方式与我们熟知的 NVIC 差别较大. 1.1 GIC G ...

  9. xilinx zynq 7010/7020 中断/中断向量/GIC向量/GPIO中断

    上图所示GIC左边的称为中断请求源,它们产生中断请求.所有的中断请求都可以发送到GIC通用中断控制器,所以它是一个集中式的中断请求中心.GIC根据请求源的属性(enables, disables, m ...

最新文章

  1. 如何高效入门 PyTorch ?
  2. 谷歌火狐浏览器限制的端口
  3. TortoiseSVN status cache占用CPU高
  4. Java低级编程软件_JAVA语言说低级语言吗
  5. 用xargs处理带空格文件名
  6. python 字符集utf-8|精简版(三分钟了解)
  7. 海西小霸王TD-299Z厂家10芯(密码 2.F2.4.蓝键.下.8)
  8. KK集团完成门店系统一期上云
  9. 【案例】一个超级好用的工具 —— 给程序员用的计算器
  10. java生成顺丰电子面单,顺丰拼多多电子面单设置教程
  11. VHDL——分频器设计
  12. 做程序员久了,你会不会感觉的空虚与迷茫?其实主要原因是这几点!
  13. 华为将安卓系统迁移到鸿蒙OS,真·国产之光!华为鸿蒙OS发布,从安卓迁移只需要2天...
  14. MCAL系列介绍04-GPT
  15. Bribe the Prisoners(2009 Round 1C C)
  16. 微众银行七年,从拓荒者到深耕者
  17. mySQL 错误 3167 - The 'INFORMATION_SCHEMA.GLOBAL_STATUS' feature is disabled; see the document
  18. android核心技术之性能分析工具TraceView
  19. [work]Hackintosh
  20. 求s=a+aa+aaa+aaaa+aa...a的值

热门文章

  1. Java 必看的 Spring 知识汇总!
  2. 史上最全Java多线程面试题及答案
  3. 数据库外键的使用原则
  4. linux宝塔面板配置可道云,使用宝塔面板配合可道云打造私有云
  5. java 获取文件权限_Java中的文件权限,检查权限和更改权限 - Break易站
  6. mysql聚集索引可以多列吗_MySQL使用单列索引和多列索引
  7. 浅谈DCIM平台的6化
  8. python怎么批量移动文件_python中批量移动目录所有文件函数
  9. Tool/IDE之MinGW:MinGW(C++环境)的简介、安装、使用方法之详细攻略
  10. AI之FL:联邦学习(Federated Learning)的简介、入门、应用之详细攻略