单片机学习小组
登录
直播中
地方
12年用户
651经验值
私信
关注
请问ESP8266是如何利用中断实现led开关功能的
开启该帖子的消息推送
ESP8266
请问ESP8266是如何利用中断实现led开关功能的?其代码是怎样去编写的?
回帖
(1)
李玉兰
2022-2-15 15:14:04
1.环境说明
如果创建项目请看第2篇 led闪烁. ESP8266实现开关功能。这里利用中断获取gpio的状态.从而控制led灯 亮或灭
2.中断函数说明
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, TRUE); //clear interrupt maskgpio_intr_handler_register(keyinterrupt_cb, NULL); // Register the interrupt _xt_isr_unmask(1 << ETS_GPIO_INUM); //Enable the GPIO interrupt _xt_isr_mask(1<
在disable interrupt之后,如果有中断信号触发中断引脚,即使还未使能中断,但interrupt mask仍然会被置为中断标志,因此,为避免Enable the GPIO interrupt之后,由于受之前中断位的影响而马上再次中断,故在_xt_isr_unmask(1 << ETS_GPIO_INUM); //Enable the GPIO interrupt之前务必加上GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, TRUE ); //clear interrupt mask
3.实现中断
void key_init(void){
GPIO_ConfigTypeDef gpio_in_cfg; //Define GPIO Init Structure
gpio_in_cfg.GPIO_IntrType = GPIO_PIN_INTR_POSEDGE; //中断类型
gpio_in_cfg.GPIO_Mode = GPIO_Mode_Input; //Input mode
gpio_in_cfg.GPIO_Pullup = GPIO_PullUp_DIS; //设置上拉有效
gpio_in_cfg.GPIO_Pin = GPIO_Pin_15; // GPIO 号
gpio_config(&gpio_in_cfg); //Initialization function
gpio_intr_handler_register(key_interrupt, NULL); // 注册中断函数
_xt_isr_unmask(1 << ETS_GPIO_INUM); //启用中断
}
void key_interrupt(void){
uint32 gpio_status;
gpio_status = GPIO_REG_READ( GPIO_STATUS_ADDRESS );
GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS , gpio_status );
if( gpio_status & (BIT(15)) )
{
xTaskResumeFromISR( key_handler_task_handle );
}
}
5.软件消抖
当按键按下和抬起的时候,会发中断触发了多次。因些要消除这个抖动的过程
void key_handler_task(void *pvParameters){
uint32_t TickCountPre = 0 , TickCountCur = 0;
key_init();
for( ;; )
{
vTaskSuspend( NULL );
TickCountPre = TickCountCur;
TickCountCur = xTaskGetTickCount( );
if( TickCountCur - TickCountPre > 7 )
{
uint8_t i;
for( i = 0; i < 10 ; i ++ ) //设置按键有效时间
{
vTaskDelay( 30 / portTICK_RATE_MS );
uint32_t gpio_value;
gpio_value = gpio_input_get( );
if( ( gpio_value & BIT(15) ) == BIT(0) )
{
break;
}
}
if( i == 10 )
{
if (GPIO_INPUT_GET(15) & 0X0000001){ //不加这一行当按键抬起的时候也会触发一次
led_toggle();
}
}
}
}
vTaskDelete(NULL);
}
4.看到结果
1.环境说明
如果创建项目请看第2篇 led闪烁. ESP8266实现开关功能。这里利用中断获取gpio的状态.从而控制led灯 亮或灭
2.中断函数说明
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, TRUE); //clear interrupt maskgpio_intr_handler_register(keyinterrupt_cb, NULL); // Register the interrupt _xt_isr_unmask(1 << ETS_GPIO_INUM); //Enable the GPIO interrupt _xt_isr_mask(1<
在disable interrupt之后,如果有中断信号触发中断引脚,即使还未使能中断,但interrupt mask仍然会被置为中断标志,因此,为避免Enable the GPIO interrupt之后,由于受之前中断位的影响而马上再次中断,故在_xt_isr_unmask(1 << ETS_GPIO_INUM); //Enable the GPIO interrupt之前务必加上GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, TRUE ); //clear interrupt mask
3.实现中断
void key_init(void){
GPIO_ConfigTypeDef gpio_in_cfg; //Define GPIO Init Structure
gpio_in_cfg.GPIO_IntrType = GPIO_PIN_INTR_POSEDGE; //中断类型
gpio_in_cfg.GPIO_Mode = GPIO_Mode_Input; //Input mode
gpio_in_cfg.GPIO_Pullup = GPIO_PullUp_DIS; //设置上拉有效
gpio_in_cfg.GPIO_Pin = GPIO_Pin_15; // GPIO 号
gpio_config(&gpio_in_cfg); //Initialization function
gpio_intr_handler_register(key_interrupt, NULL); // 注册中断函数
_xt_isr_unmask(1 << ETS_GPIO_INUM); //启用中断
}
void key_interrupt(void){
uint32 gpio_status;
gpio_status = GPIO_REG_READ( GPIO_STATUS_ADDRESS );
GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS , gpio_status );
if( gpio_status & (BIT(15)) )
{
xTaskResumeFromISR( key_handler_task_handle );
}
}
5.软件消抖
当按键按下和抬起的时候,会发中断触发了多次。因些要消除这个抖动的过程
void key_handler_task(void *pvParameters){
uint32_t TickCountPre = 0 , TickCountCur = 0;
key_init();
for( ;; )
{
vTaskSuspend( NULL );
TickCountPre = TickCountCur;
TickCountCur = xTaskGetTickCount( );
if( TickCountCur - TickCountPre > 7 )
{
uint8_t i;
for( i = 0; i < 10 ; i ++ ) //设置按键有效时间
{
vTaskDelay( 30 / portTICK_RATE_MS );
uint32_t gpio_value;
gpio_value = gpio_input_get( );
if( ( gpio_value & BIT(15) ) == BIT(0) )
{
break;
}
}
if( i == 10 )
{
if (GPIO_INPUT_GET(15) & 0X0000001){ //不加这一行当按键抬起的时候也会触发一次
led_toggle();
}
}
}
}
vTaskDelete(NULL);
}
4.看到结果
举报
更多回帖
rotate(-90deg);
回复
相关问答
ESP8266
如何
利用
STM32+
ESP8266
去
实现
远程控制
LED
呢
2021-12-08
2924
请问
STM32如何通过
ESP8266
与平台通信?
2021-12-13
1842
如何使用stm32+
ESP8266
实现
手机控制
LED
灯?
2021-11-26
1050
ESP8266
怎么
实现
链路层
2019-02-18
2235
如何
利用
ESP8266
实现
氛围灯的设计?
2022-01-17
987
如何达到
ESP8266
的同时发送与接收?
2019-07-18
3887
ESP8266
不足以为12V
LED
灯条供电要怎么解决?
2023-06-02
464
ESP8266
与手机之间的通信
2016-12-01
19875
请问
有
ESP8266
和LwIP结合的例程吗?
2019-06-20
3221
ESP8266
是什么?有什么
功能
?
2021-09-24
1290
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分