美文网首页
2020-02-05

2020-02-05

作者: 等一个人咖啡_2c04 | 来源:发表于2020-02-07 18:51 被阅读0次

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中断功能

}

相关文章

网友评论

      本文标题:2020-02-05

      本文链接:https://www.haomeiwen.com/subject/yalexhtx.html