最近折腾新项目需要用到GPIO的中断来处理一些逻辑功能,翻看了官网的API开发文档,文档说的比较简单,只是对API方法做了一下解释说明,没有实际的完整例子,没办法,只能问度娘了。度娘果然啥都有,参考了以下这篇文章: 这篇文章不但给出了实例代码,还对api进行了说明,写得非常好,大家完全可以参照这篇代码来做,因为我的项目需要用到两个gpio 管脚 中断,需要在这篇文章的基础上再添加一个 管脚 ,这里就把我在添加过程中遇到的一些问题和难点再进一步说明一下。废话不说,先上代码,然后再来解释说明。
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. //关闭中断
42. if(gpio_status & BIT(4))//判断中断针脚
43. {
44. "111\n");//输出1111
45. }
46. if(gpio_status & BIT(5))//判断中断针脚
47. {
48. "222\n");//输出222
49. }
50. //系统延时
51. //清中断标志
52. //打开中断
53. }
54.
55.
56. void ICACHE_FLASH_ATTR user_init(void)
57. {
58. gpio_init();
59. //设置GPIO功能
60. //设置GPIO5为输入
61. "font-family: Arial, Helvetica, sans-serif;">//设置GPIO功能</span>
62. //设置GPIO5为输入
63.
64. //GPIO5使能上拉
65. //GPIO4使能上拉
66.
67. //关闭中断
68. //设置中断函数
69. //设置中断类型
70. //设置中断类型
71.
72. //打开中断
73. }
因为用的是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使能上拉