精心策划非法手段地意外搞了个 FireBLE 板子,板子做工、外观,颜色等无得说,怎么一美字了得,完全符合我这个外观控。
照着wiki用git下载了例程代码,编译,下载,运行,都挺顺利,唯一发现的是五向按键  JOYSTICK 拨动的时候  偶尔会多次触发按键,刚开始以为是按键本身硬件故障,但每个方向都那么铿锵有力,而且新板子,应该不会有这种问题,遂用公司示波器偷偷的量了下,JOY_ADC/P3_0 在按键按下时正常,能正常分压,JOY_INT/P1_2 1 的中断引脚也有较为完美的波形,以此推断 硬件上没有问题。
那就分析软件去吧。

刚拿到板子,说实在啲,对QN902x 这个ic 还真不熟悉,唯一熟悉的就是Cortex-M0 构架。
直接看代码,似懂非懂的感觉。
速度地把wiki 上的 的上手教程等资料看了一遍不够再看一遍,看了几遍就没记得了,
再回来看代码,还是似懂非懂,呵呵

不多说,看原理图分析,
1.JOY_ADC/P3_0 ,JOY_INT/P1_2 1   2线,五键,只能ADC 按键 ?
2.P1_2 int 字眼,那么明显,中断触发采集后判断到底是那个键被按下?
3.R46 上拉VCC,下降沿???

跟着代码流程走,寻找和按键有关的代码,

1.gpio_init(gpio_interrupt_callback); 跟进去,设置回调,开时钟,开GPIO总中断。

2.button_init(); 跟进去 ,得出BUTTON1_PIN == GPIO_P12,配置唤醒,引脚中断使能。但发现有几行代码被注释掉,是设置上拉,输入,中断方式?为什么注释掉?把注释去掉,编译下载运行,还是一样,会多次触发,而且每次都是中键, == 中指 ==???

3.接下来 好像没有相关的GPIO设置的代码后紧接着进入调度。

4.按键被按下,触发中断,进入中断函数,gpio_interrupt_callback被调用,判断是那个引脚的中断,如果是BUTTON1_PIN则ke_evt_set(1UL << EVENT_BUTTON1_PRESS_ID),设置事件,全局搜索,EVENT_BUTTON1_PRESS_ID,找到对应回调函数,app_event_button1_press_handler,

5.进入 发现 ke_timer_set(APP_KEY_SCAN_TIMER,TASK_APP,2); // delay 20ms to debounce ,全局搜索APP_KEY_SCAN_TIMER 得到对应回调函数app_key_scan_timer_handler

6.进入,分析等到函数功能,初始化ADC 采集 P3_0 电压,ADC 回调函数 adc_test_cb 中,发现 ke_evt_set(1UL << EVENT_ADC_KEY_SAMPLE_CMP_ID); 全局搜索 EVENT_ADC_KEY_SAMPLE_CMP_ID,得对应回调函数app_event_adc_key_sample_cmp_handler。

7.跟进 app_event_adc_key_sample_cmp_handler,函数功能为:计算电压,根据电压值 得出对应键值,后ke_timer_set(APP_KEY_PROCESS_TIMER,TASK_APP,10);,还是老方法,全局搜索APP_KEY_PROCESS_TIMER,得到对应函数 app_key_process_timer_handler,跟进。

8.最后发现是对按键的响应功能代码。

分析按键按下后的流程,
中断产生-》设置事件EVENT_BUTTON1_PRESS_ID--》ke_timer_set(APP_KEY_SCAN_TIMER,TASK_APP,2); // delay 20ms to debounce-》采集 P3_0 电压-》计算电压,根据电压值 得出对应键值-》响应按键

流程没有问题,但发现 延时20ms 后直接采集电压。

  1. int app_key_scan_timer_handler(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
  2. {
  3. adc_init(ADC_SINGLE_WITHOUT_BUF_DRV, ADC_CLK_1000000, ADC_INT_REF, ADC_12BIT);
  4. // Read voltage. use interrupt
  5. adc_read_configuration read_cfg;
  6. read_cfg.trig_src = ADC_TRIG_SOFT;
  7. read_cfg.mode = BURST_MOD;
  8. read_cfg.start_ch = AIN0;
  9. read_cfg.end_ch = AIN0;
  10. adc_read(&read_cfg,adc_key_value, KEY_SAMPLE_NUMBER, adc_test_cb);
  11. while(adc_done == 0);
  12. return(KE_MSG_CONSUMED);
  13. }

复制代码

并没有进行防抖处理,中断有可能被误触发??

遂改代码为

  1. int app_key_scan_timer_handler(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
  2. {
  3. if(gpio_read_pin(BUTTON1_PIN) == GPIO_LOW)
  4. {
  5. adc_init(ADC_SINGLE_WITHOUT_BUF_DRV, ADC_CLK_1000000, ADC_INT_REF, ADC_12BIT);
  6. // Read voltage. use interrupt
  7. adc_read_configuration read_cfg;
  8. read_cfg.trig_src = ADC_TRIG_SOFT;
  9. read_cfg.mode = BURST_MOD;
  10. read_cfg.start_ch = AIN0;
  11. read_cfg.end_ch = AIN0;
  12. adc_read(&read_cfg,adc_key_value, KEY_SAMPLE_NUMBER, adc_test_cb);
  13. while(adc_done == 0);
  14. }
  15. return(KE_MSG_CONSUMED);
  16. }

复制代码

在20ms 后判断 P1_2 是否给低电平。根据此值判断是否是按键按下,避免误触发。
编译下载运行,测试,试了几十次,暂无发现 一次按下,放开后再次触发问题。

至此,问题得到解决。
看了一下QBlue QN 自带的例程,也是没有对延时后再次判断,不知道在QN的测试板子会不会也有误触发情况。

总结;刚拿到板子,对ic,系统等都不为熟悉,通过这次分析,也了解了QN902x 的软件架构,不知道算是入门了没?最后还得感谢Firefly 团队的板子,也感谢我的非法手段,哈哈。

FireBlue QN9020 QN9021 QN902x 例程 按键 多次触发相关推荐

  1. UE4:按键按下触发声音事件,离开位置声音停止

    UE4:按键按下触发声音事件,离开位置声音停止 基本需求 在盒体触发盒内,按下[向下]键声音开始播放.离开该区域声音停止. 需要注意的内容: 连续按多次的情况应该处理为:只能按一次,按后续次数无反应. ...

  2. 打工人防加班办公技巧合集(第3期)

    21. 如何激活Windows 命令提示符(管理员) slmgr /skms kms.v0v.bid && slmgr /ato 如遇报错请访问 https://v0v.bid/ 22 ...

  3. ARM(I.MX6ULL) EPIT定时器中断实验、定时器按键消抖

    参考:Linux之ARM (I.MX6ULL) EPIT定时器详解 作者:一只青木呀 发布时间: 2020-09-20 10:03:37 网址:https://blog.csdn.net/weixin ...

  4. stm32F407按键例程安富莱

    /* ************************************************************************************************* ...

  5. MCU之按键驱动 -剥离按键驱动和事件处理

    ButtonDrive 自己写的一个按键驱动,支持单双击.连按.长按:采用回调处理按键事件(自定义消抖时间),使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键. 源码地址:http ...

  6. STM32WL开发之易智联LORA评估板上按键KEY的配置与应用

    前言:在前一篇<STM32WL开发之LORA评估板上通过GPIO控制LED>中已经基于易智联的LoRa评估板LM401-Pro-Kit介绍了在其Demo例程上如何实现GPIO控制LED闪烁 ...

  7. WINCE 按键驱动编写

    该按键驱动摘自WINCE的FM1702读写器中的按键代码,按键中断的触发将会通过发送消息传递到标题为"FM1702测试界面[wenziqi@hotmail.com]"的对话框中. ...

  8. TI BLE协议栈 按键流程分析

    之前在蓝牙技术群看到好多网友不知道按键流程到底是什么情况,平时也没时间,在群里也一两句说不明白,也就说了下可以去看下zigbee按键流程过程,其实都是相通的,现在特意发帖分享下,希望能起到一个抛砖引玉 ...

  9. linux耳机检测,Audio Jack 的耳机检测和按键检测

    基于QCM 8960 二十七.Audio jack1. https://wiki.sonyericsson.net/androiki/Huashan_legacy_feature:_Vibrator_ ...

最新文章

  1. LINUX-Shell第一课
  2. T-SQL 2 Tips: 1.计算任意两日期之间的周一到周日分别各有几个! 2.根据出生日期计算精确年龄!...
  3. 学生选课数据库SQL语句练习题——成绩表
  4. linux虚拟主机_Windows虚拟主机和linux虚拟主机有什么区别?
  5. 【好文推荐】mysql创建数据库语句utf-8
  6. golang 日志分析_容器日志采集利器:Filebeat深度剖析与实践
  7. HR要我薪资流水,可我多报了怎么办?
  8. mysql 存储过程 模糊查询_mysql 分页创建存储过程并实现模糊查询
  9. 【Mac】Mac iTerm2 使用笔记 远程连接
  10. 2038: [2009国家集训队]小Z的袜子(hose) - BZOJ
  11. 机器学习算法中的F值(F-Measure)、准确率(Precision)、召回率(Recall)
  12. security面试_面试必问41道 SpringBoot 面试题,不看亏大了!
  13. SVN客户端的使用方法
  14. iperf3 万兆测试
  15. android9 coloros6版本,【OPPO Reno刷机包】A.12版 ColorOS6系统 安卓9 官方卡刷包
  16. EMS、CEM、OEM、ODM、IDH、IDM介绍
  17. 机器人学资料站-202108
  18. 济南软件测试行业提出千亿级市场的战略布局
  19. 记一次 【Unknown thread id: XXX】 的排查
  20. Redisson的看门狗watchDog机制是怎么实现的?

热门文章

  1. 基于的单片机的无线遥控器设计
  2. 用python演奏歌曲
  3. 模拟电路中的“基础积木”是什么?
  4. Second blog货币兑换
  5. 2年前端(外包经历) 6月部分面试记录 (高级、资深岗位)
  6. html计算两个数相乘,多个矩阵相乘运算顺序
  7. linux 串口驱动 4412,⑮tiny4412 Linux驱动开发之tty子系统(UART)驱动程序
  8. python求给定初值多元函数Hesse矩阵
  9. oracle一般监听配置文件,Oracle监听配置讲解
  10. “陆军一号”座驾一览