精心策划非法手段地意外搞了个 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 后直接采集电压。
并没有进行防抖处理,中断有可能被误触发??
遂改代码为
在20ms 后判断 P1_2 是否给低电平。根据此值判断是否是按键按下,避免误触发。
编译下载运行,测试,试了几十次,暂无发现 一次按下,放开后再次触发问题。
至此,问题得到解决。
看了一下QBlue QN 自带的例程,也是没有对延时后再次判断,不知道在QN的测试板子会不会也有误触发情况。
总结;刚拿到板子,对ic,系统等都不为熟悉,通过这次分析,也了解了QN902x 的软件架构,不知道算是入门了没?最后还得感谢Firefly 团队的板子,也感谢我的非法手段,哈哈。
照着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 后直接采集电压。
并没有进行防抖处理,中断有可能被误触发??
遂改代码为
在20ms 后判断 P1_2 是否给低电平。根据此值判断是否是按键按下,避免误触发。
编译下载运行,测试,试了几十次,暂无发现 一次按下,放开后再次触发问题。
至此,问题得到解决。
看了一下QBlue QN 自带的例程,也是没有对延时后再次判断,不知道在QN的测试板子会不会也有误触发情况。
总结;刚拿到板子,对ic,系统等都不为熟悉,通过这次分析,也了解了QN902x 的软件架构,不知道算是入门了没?最后还得感谢Firefly 团队的板子,也感谢我的非法手段,哈哈。