Nodemcu freertos 学习之路 -- 利用中断 控制led开关

1.环境说明

如果创建项目请看第2篇 led闪烁.  ESP8266实现开关功能。这里利用中断获取gpio的状态.从而控制led灯 亮或灭

2.中断函数说明

GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, TRUE);  //clear interrupt mask
gpio_intr_handler_register(keyinterrupt_cb, NULL); // Register the interrupt 
_xt_isr_unmask(1 << ETS_GPIO_INUM);    //Enable the GPIO interrupt 
_xt_isr_mask(1<<ETS_GPIO_INUM);    //disable interrupt

在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.看到结果


代码下载地址: https://github.com/FanShiYou/esp8266/tree/master/gpio_interrupt_led

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值