完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
GPIO怎么用
首先要进行管脚功能选择 引脚的名字 哪个引脚 /****************************************************************************** * FunctionName : key_init 按键初始化 * Description : init keys * Parameters : key_param *keys - keys parameter, which inited by key_init_single * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR key_init(struct keys_param *keys) { uint8 i; ETS_GPIO_INTR_ATTACH(key_intr_handler, keys);//注册中断处理函数 (函数名 形参) ETS_GPIO_INTR_DISABLE();//先关闭中断 for (i = 0; i < keys->key_num; i++) {//需要先初始化io 和按键所用的结构体 keys->single_key->key_level = 1; PIN_FUNC_SELECT(keys->single_key->gpio_name, keys->single_key->gpio_func); gpio_output_set(0, 0, 0, GPIO_ID_PIN(keys->single_key->gpio_id));//设置GPIO属性 //这里设置的是输入模式 /* uint32 set_mask:设置输出为⾼高的位,对应位为1,输出⾼高,对应位为0,不不改变状态 uint32 clear_mask:设置输出为低的位,对应位为1,输出低,对应位为0,不不改变状态 uint32 enable_mask:设置使能输出的位 uint32 disable_mask:设置使能输⼊入的位 */ gpio_register_set(GPIO_PIN_ADDR(keys->single_key->gpio_id), //寄存器设置吧、 GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); //clear gpio14 status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(keys->single_key->gpio_id));//先清除中断标志位 //enable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key->gpio_id), GPIO_PIN_INTR_NEGEDGE);//设置触发方式下降沿触发 } ETS_GPIO_INTR_ENABLE();//开gpio中断 } /****************************************************************************** * FunctionName : key_init_single * Description : init single key's gpio and register function * Parameters : uint8 gpio_id - which gpio to use * uint32 gpio_name - gpio mux name * uint32 gpio_func - gpio function * key_function long_press - long press function, needed to install * key_function short_press - short press function, needed to install * Returns : single_key_param - single key parameter, needed by key init *******************************************************************************/ struct single_key_param *ICACHE_FLASH_ATTR key_init_single(uint8 gpio_id, uint32 gpio_name, uint8 gpio_func, key_function long_press, key_function short_press) {//把需要用到的io口初始化一遍 struct single_key_param *single_key = (struct single_key_param *)os_zalloc(sizeof(struct single_key_param)); single_key->gpio_id = gpio_id; single_key->gpio_name = gpio_name; single_key->gpio_func = gpio_func; single_key->long_press = long_press; single_key->short_press = short_press; return single_key; } //GPIO中断处理函数 /****************************************************************************** * FunctionName : key_intr_handler * Description : key interrupt handler * Parameters : key_param *keys - keys parameter, which inited by key_init_single * Returns : none *******************************************************************************/ LOCAL void key_intr_handler(struct keys_param *keys)//GPIO中断处理函数 { uint8 i; uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//获取按键状态,哪个按键按下了 for (i = 0; i < keys->key_num; i++) { if (gpio_status & BIT(keys->single_key->gpio_id)) { //disable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key->gpio_id), GPIO_PIN_INTR_DISABLE);//先关闭中断 //clear interrupt status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status & BIT(keys->single_key->gpio_id));//清除中断标志位 if (keys->single_key->key_level == 1) {//其实第一下先进这里,开的是5s的定时器 // 5s, restart & enter softap mode os_timer_disarm(&keys->single_key->key_5s); os_timer_setfn(&keys->single_key->key_5s, (os_timer_func_t *)key_5s_cb, keys->single_key);//设置定时回调函数 os_timer_arm(&keys->single_key->key_5s, 5000, 0);//开始5s的定时 keys->single_key->key_level = 0; gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key->gpio_id), GPIO_PIN_INTR_POSEDGE);//设置中断触发方式为上升沿 松手检测,,如果在5s定时时间到来之前松手了,那个就是短按 } else {//一般这个是上升沿触发的 , // 50ms, check if this is a real key up os_timer_disarm(&keys->single_key->key_50ms); os_timer_setfn(&keys->single_key->key_50ms, (os_timer_func_t *)key_50ms_cb, keys->single_key);//打开软件定时器,然后在设置定时器回调函数 os_timer_arm(&keys->single_key->key_50ms, 50, 0);//开始软件定时器 } } } } //长按短按的定时器回调函数 /****************************************************************************** * FunctionName : key_5s_cb * Description : long press 5s timer callback * Parameters : single_key_param *single_key - single key parameter * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR key_5s_cb(struct single_key_param *single_key) { os_timer_disarm(&single_key->key_5s); // low, then restart if (0 == GPIO_INPUT_GET(GPIO_ID_PIN(single_key->gpio_id))) {//可能原本的长按是有恢复出厂设置的左右,不会再管还会触发短按,,但是如果不是恢复出厂设置,就还会触发短按,应为现在还是上升沿检测, gpio_pin_intr_state_set(GPIO_ID_PIN(single_key->gpio_id), GPIO_PIN_INTR_NEGEDGE);//设置 GPIO 中断触发状态//上升沿触发 加上这条语句,就可以忽略短按触发了 if (single_key->long_press) { single_key->long_press(); } } } /****************************************************************************** * FunctionName : key_50ms_cb * Description : 50ms timer callback to check it's a real key push * Parameters : single_key_param *single_key - single key parameter * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR key_50ms_cb(struct single_key_param *single_key) { os_timer_disarm(&single_key->key_50ms);//关闭软件定时器 // high, then key is up if (1 == GPIO_INPUT_GET(GPIO_ID_PIN(single_key->gpio_id))) {//5s定时器没到,检测到了上升沿,就是松手了 os_timer_disarm(&single_key->key_5s);//关闭5s的定时器 single_key->key_level = 1; gpio_pin_intr_state_set(GPIO_ID_PIN(single_key->gpio_id), GPIO_PIN_INTR_NEGEDGE); if (single_key->short_press) {//执行短按的回调函数 single_key->short_press(); } } else {//抖动,重新检测过 gpio_pin_intr_state_set(GPIO_ID_PIN(single_key->gpio_id), GPIO_PIN_INTR_POSEDGE); } } |
|
|
|
只有小组成员才能发言,加入小组>>
3294 浏览 9 评论
2970 浏览 16 评论
3473 浏览 1 评论
9023 浏览 16 评论
4061 浏览 18 评论
1140浏览 3评论
589浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
579浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2313浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1876浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-5 12:05 , Processed in 1.221639 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号