学习记录
ESP8266 01S GPIO中断
初始化IO
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中断功能
// 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中断状态
//---------------------------------------------------
S_GPIO_INT = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
清中断
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, S_GPIO_INT);
//S_GPIO_INT是读取中断标志。
函数
// GPIO中断函数【注意:中断函数前不要有"ICACHE_FLASH_ATTR"宏】
//=============================================================================
void GPIO_INTERRUPT(void)
{
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(2),F_LED); // LED状态翻转
uart0_sendStr("\r\n HELLO WORLD!!! \r\n");
}
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
u8 led = 0;
uart_init(9600, 9600);
os_delay_us(10000);
os_printf("\r\n---------------\r\n");
os_printf("\r\n SDK version: %s \r\n", system_get_sdk_version()); //串口打印SDK版本
os_printf("\r\n ProjectName: %s \r\n", ProjectName); //串口打印SDK版本
uart0_sendStr("\r\n HELLO WORLD!!! \r\n");
os_printf("\r\n---------------\r\n");
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));
// PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U);
// PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);
// 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中断功能
// while(1)
// {
// system_soft_wdt_feed();
// if(GPIO_INPUT_GET(GPIO_ID_PIN(0)))
// {
// GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
//
// }
// else
// {
// GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
//
// }
// }
}
重点
本节重点内容为中断配置。
- 关闭中断
- 注册中断回调
- 设置IO0下降沿中断
- 打开中断
来源:CSDN
作者:走南闯北声东击西
链接:https://blog.csdn.net/I_LOVE_MCU/article/details/103753574