完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
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.看到结果 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:45 , Processed in 1.425600 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号