ESP82266外部中断函数及按键控制LED灯
GPIO 输⼊入输出相关宏
GPIO_OUTPUT_SET(gpio_no, bit_value)设置 gpio_no 管脚输出 bit_value,与上⼀一节的输出⾼高低电平的⽰示例相同。
GPIO_DIS_OUTPUT(gpio_no)设置 gpio_no 管脚输⼊入,与上⼀一节的设置输⼊入⽰示例相同。
GPIO_INPUT_GET(gpio_no)获取 gpio_no 管脚的电平状态。
GPIO 中断
ETS_GPIO_INTR_ATTACH(func, arg)注册 GPIO 中断处理函数
ETS_GPIO_INTR_DISABLE()关 GPIO 中断
ETS_GPIO_INTR_ENABLE()开 GPIO 中断
gpio_pin_intr_state_set 设置 GPIO 中断触发状态
函数定义: void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state)
GPIO 中断处理函数
uint32 gpio_status;
gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
//clear interrupt status
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
关于获取 gpio_no 管脚的电平状态的按键开关
void ICACHE_FLASH_ATTR user_init(void) //主函数
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// 初始化LED(注意【PIN_NAME】、【FUNC】、【gpio_no】不要混淆)
//-------------------------------------------------------------------------
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO_4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // GPIO_4 = 1
// 初始化按键(BOOT == GPIO0)
//----------------------------------------------------------------------------------
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); // GPIO_0设为IO口
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0)); // GPIO_0设置输入
PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U); // GPIO_0使能内部上拉(默认)
// PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U); // GPIO_0使能内部上拉
while(1)
{
system_soft_wdt_feed(); // 喂狗,防止复位
if( GPIO_INPUT_GET(GPIO_ID_PIN(0)) == 0 ) // 读取GPIO_0电平,因为使能上拉模式,
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0); // LED亮
else
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // LED灭
}
}
关于中断函数的按键开关函数
u8 F_LED = 0; // LED状态标志位
void GPIO_INTERRUPT(void) //GPIO_INTERRUPT中断回调函数
{
u32 S_GPIO_INT; // 所有IO口的中断状态
u32 F_GPIO_0_INT; // GPIO_0的中断状态
// 读取GPIO中断状态
//---------------------------------------------------
S_GPIO_INT = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
// 清除中断状态位(如果不清除状态位,则会持续进入中断)
//----------------------------------------------------
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, S_GPIO_INT);
F_GPIO_0_INT = S_GPIO_INT & (0x01<<0); // 获取GPIO_0中断状态
// 判断是否是KEY中断(未做消抖)
//------------------------------------------------------------
if(F_GPIO_0_INT) // GPIO_0的下降沿中断
{
F_LED = !F_LED;
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED); // LED状态翻转
}
}
void ICACHE_FLASH_ATTR user_init(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO_4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // GPIO_4 = 1
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); // GPIO_0作为GPIO口
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0)); // GPIO_0失能输出(默认)
ETS_GPIO_INTR_DISABLE(); // 关闭GPIO中断功能
ETS_GPIO_INTR_ATTACH((ets_isr_t)GPIO_INTERRUPT,NULL); // 注册中断回调函数
gpio_pin_intr_state_set(GPIO_ID_PIN(0),GPIO_PIN_INTR_NEGEDGE); // GPIO_0下降沿中断
ETS_GPIO_INTR_ENABLE(); // 打开GPIO中断功能
}
网友评论