ESP8266 GPIO中断学习

    xiaoxiao2026-03-11  14

    前言

    GPIO中断在进行脉宽测量、脉冲计数时能起到极为重要的作用,本文主要介绍GPIO中断的用法,使用一个开关打开或关闭一个LED灯。

    GPIO寄存器介绍

    一、GPIO输入寄存器

    寄存器名称功能说明寄存器大小寄存器属性参数说明GPIO_IN输入状态寄存器16Bit读写对应GPIO0-GPIO15GPIO_PIN12中断类型寄存器16Bit读写0:禁用该GPIO的中断 1:上升沿触发中断 2:下降沿触发中断 3:双边沿触发中断 4:低电平触发中断 5:高电平触发中断GPIO_STATUS中断状态寄存器16Bit读写对应GPIO0-GPIO15GPIO_STATUS_W1TC复位中断标志寄存器16Bit读写对应GPIO0-GPIO15

    二、GPIO输出寄存器

    寄存器名称功能说明寄存器大小寄存器属性参数说明GPIO_ENABLE_W1TS使能输出寄存器16Bit读写对应GPIO0-GPIO15GPIO_ENABLE_W1TC禁用输出寄存器16Bit读写对应GPIO0-GPIO15GPIO_ENABLE输出使能状态寄存器16Bit读写对应GPIO0-GPIO15GPIO_OUT_W1TC输出低电平寄存器16Bit只读对应GPIO0-GPIO15GPIO_OUT_W1TS输出高电平寄存器16Bit读写对应GPIO0-GPIO15GPIO_OUT输出状态寄存器16Bit读写对应GPIO0-GPIO15

    注:GPIO16不支持触发IO中断。

    相关API介绍

    一、引脚复用功能切换函数

    功能介绍配置某引脚的其他功能-函数原型PIN_FUNC_SELECT(PIN_NAME, FUNC)宏函数参数介绍PIN_NAME该引脚的MUX寄存器-FUNC引脚需要配置的功能参数枚举关于PIN_NAME的参数详见eagle_soc.h,关于FUNC的参数详见ESP8266 管脚清单.xlsx(在官网上可以找到当然页可以参考eagle_soc.h)。-示例PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);配置MTDI引脚作为GPIO使用

    二、输入模式配置

    功能介绍配置某引脚为输入模式-函数原型GPIO_DIS_OUTPUT(gpio_no)宏函数参数介绍gpio_noGPIO的引脚号(0-15)示例GPIO_DIS_OUTPUT(0);配置GPIO0为输入模式

    三、上拉模式配置

    功能介绍开启某引脚上拉模式-函数原型PIN_PULLUP_EN(PIN_NAME)宏函数参数介绍PIN_NAME该引脚的MUX寄存器的名称示例PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);开启GPIO4的上拉输入功能---功能介绍关闭某引脚上拉模式-函数原型PIN_PULLUP_DIS(PIN_NAME)宏函数参数介绍PIN_NAME该引脚的MUX寄存器的名称示例PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO4_U);关闭GPIO4的上拉输入功能

    四、获取输入引脚状态

    功能介绍读取某引脚的高低电平状态-函数原型GPIO_INPUT_GET(gpio_no)宏函数参数介绍gpio_noGPIO的引脚号(0-15)示例GPIO_INPUT_GET(0);读取GPIO0的输入引脚状态

    五、GPIO中断状态配置

    功能介绍开启GPIO中断-函数原型ETS_GPIO_INTR_ENABLE()宏函数---功能介绍关闭GPIO中断-函数原型ETS_GPIO_INTR_DISABLE()宏函数

    六、配置中断处理函数

    功能介绍配置中断处理函数-函数原型ETS_GPIO_INTR_ATTACH(GPIO_INTERRUPT,NULL)宏函数参数介绍GPIO_INTERRUPTGPIO的中断处理函数参数介绍NULLGPIO的中断服务函数的参数

    示例

    void GPIO_ISR_Handler( void ) { /** GPIO中断处理函数 */ } void GPIO_ISR_Handler_Config( void ) { ETS_GPIO_INTR_ATTACH(&GPIO_ISR_Handler,NULL); }

    七、配置GPIO中断触发方式

    功能介绍配置GPIO中断触发方式-函数原型void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state);-参数介绍i(GPIO_ID_PIN(n))GPIO的引脚ID(n为GPIO引脚号,范围为0-15)-intr_stateGPIO中断触发方式参数枚举GPIO_PIN_INTR_DISABLE(0)禁用该引脚的中断-GPIO_PIN_INTR_POSEDGE(1)使能该引脚的上升沿中断-GPIO_PIN_INTR_NEGEDGE(2)使能该引脚的下降沿中断-GPIO_PIN_INTR_ANYEDGE(3)使能该引脚的双边沿中断-GPIO_PIN_INTR_LOLEVEL(4)使能该引脚的低电平中断-GPIO_PIN_INTR_HILEVEL(5)使能该引脚的高电平中断示例gpio_pin_intr_state_set(GPIO_ID_PIN(0),GPIO_PIN_INTR_ANYEDGE);配置GPIO0的中断触发方式为双边沿触发方式

    示例

    #include "ets_sys.h" #include "osapi.h" #include "user_interface.h" #include "eagle_soc.h" #include "gpio.h" #include "gpio16.h" /** 开关输入相关 宏定义 */ #define SWITCH_Pin_NUM 5 #define SWITCH_Pin_FUNC FUNC_GPIO5 #define SWITCH_Pin_MUX PERIPHS_IO_MUX_GPIO5_U #define SWITCH_Pin_Rd_Init() GPIO_DIS_OUTPUT(SWITCH_Pin_NUM) #define SWITCH_Pin_Wr_Init() GPIO_OUTPUT_SET(SWITCH_Pin_NUM,0) #define SWITCH_Pin_Set_High() GPIO_OUTPUT_SET(SWITCH_Pin_NUM,1) #define SWITCH_Pin_Set_Low() GPIO_OUTPUT_SET(SWITCH_Pin_NUM,0) #define SWITCH_Pin_State ( GPIO_INPUT_GET(SWITCH_Pin_NUM) != 0 ) /** ******************************************************************************* * @brief GPIO中断处理函数 * @param [in/out] void * @return void * @note None ******************************************************************************* */ static void GPIO_ISR_Handler( void ) { /** 读取GPIO中断状态 */ u32 pin_status = GPIO_REG_READ( GPIO_STATUS_ADDRESS ); /** 关闭GPIO中断 */ ETS_GPIO_INTR_DISABLE(); /** 清除GPIO中断标志 */ GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, pin_status ); /** 检测是否已开关输入引脚中断 */ if ( pin_status & BIT( SWITCH_Pin_NUM ) ) { if( SWITCH_Pin_State ) { gpio16_output_set(0); } else { gpio16_output_set(1); } } /** 开启GPIO中断 */ ETS_GPIO_INTR_ENABLE(); } /** ******************************************************************************* * @brief 输入初始化函数 * @param [in/out] void * @return void * @note None ******************************************************************************* */ static void drv_Input_Init( void ) { PIN_FUNC_SELECT( SWITCH_Pin_MUX, SWITCH_Pin_FUNC ); SWITCH_Pin_Rd_Init(); ETS_GPIO_INTR_DISABLE(); ETS_GPIO_INTR_ATTACH( &GPIO_ISR_Handler, NULL ); gpio_pin_intr_state_set( GPIO_ID_PIN( SWITCH_Pin_NUM ), GPIO_PIN_INTR_ANYEDGE ); /** 清除该引脚的GPIO中断标志 */ GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, BIT(SWITCH_Pin_NUM) ); ETS_GPIO_INTR_ENABLE(); } /** ******************************************************************************* * @brief 用户初始化程序 * @param [in/out] void * @return void * @note None ******************************************************************************* */ void user_init( void ) { drv_Input_Init(); gpio16_output_conf(); }

    参考资料

    [1]. ESP8266技术参考 [2]. ESP8266Non-OS SDK API参考 [3]. ESP8266 管脚清单

    转载请注明原文地址: https://ju.6miu.com/read-1307842.html
    最新回复(0)