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

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

    [复制链接]

    签到天数: 414 天

    [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 下一条

    返回顶部