前言
现在为止也开发了许多杰理和中科蓝讯蓝牙芯片的TWS蓝牙耳机、音响项目 SDK 的案子,在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总,方便各位同行和对中科蓝汛芯片SDK感兴趣的小伙伴们学习;
本章详细讲解中科蓝讯SDK开发BT897X、BT891X、AB573X、AB572X 系列SDK按键及消息调试教程
1、按键类型
在公版SDK中默认指出pwrkey电源键、adkeyADC按键、iokeyIO按键类型的按键,其中pwrkey和adkey都是通过ADC采样IO口的电压值来判别是否按下,iokey则是通过判断高低电平来判别是否按下。按键支持短按、长按、保持、双击以及多击等多种按键操作。按键功能的启用和关闭通过config.h中User按键配置的宏来进行控制,如下所示:

2、按键扫描与消息处理
按键扫描过程在system.c文件的5ms中断函数里通过bsp_key_scan()来完成,扫描流程如下图所示:


以pwrkey为例说明按键操作流程:
1、pwrkey按键初始化,配置内部上拉、唤醒通道和ADC采样通道等功能。

2、通过检测对应的ADC通道的电压值,依次与pwrkey_table表中的电压阈值进行对比,然后返回对应的key_uid。因此,一个ADC通道便能够识别和区分多个按键。例如当前采样ADC通道的值为0x50,此时ADC阈值落在0x0A~0xAF之间,此时视作KEY2被按下。具体adkey_table等表可在port_key.c文件中查到;

saradc_get_value8(ADCCH_WKO):是获取ADC通道电压
pwrkey_table[num].adc_val:定义好的ADC阈值表

3、通过检测按键按下的时间长短,来判断按键属于短按、长按还是保持等操作,检测的时间阈值可在key_scan.h文件中找到,此处一般不需要修改。这里扫描的次数对应的就是进入5ms中断的次数,例如6次按键防抖扫描次数,就对应于6*5=30ms左右的按键消抖时间。

4、SDK把不同模式下的按键消息做成了一个个的消息列表,例如下图所示的BT音乐模式和BT通话模式下 key1~key3 所对应的按键消息列表,并且所有的按键消息都在key_scan.h文件中被枚举。注意:每完成一次按键的检测,都会抛出msg消息给到主线程中去处理。例如:在BT音乐模式下,根据前面的判断KEY_1被识别成单击时,就会根据下表把MSG_MUSIC_PLAY_PAUSE这个消息添加到消息处理队列中,后续主线程就会根据该消息执行对应的函数。

根据对应的key_id值和按键状态,直接查找映射的消息列表,返回对应的按键消息;

SDK中所有的按键消息枚举

5、在SDK中,所有的msg消息都是通过一个先进先出的队列进行存储的,用msg_enqueue()接口添加消息,然后在主程序的消息处理函数中调用msg_dequeue()取出消息处理,不同模式下都会有自己的一个消息处理函数。该消息处理函数只是一个简单的switch判断,根据取出的不同消息值,去执行case对应的代码。需要注意的是,SDK中有一个公共的消息处理函数,都在default中执行。
使用msg_enqueue()接口添加按键消息

主程序的消息处理函数中调用msg_dequeue()取出消息处理

不同模式下都会有自己的一个消息处理函数,在消息处理函数中处理消息

在当前模式下消息处理函数中未找到对应的消息选择处理,则会进入公共消息中处理函数


3、按键消息的添加以及修改
以pwrkey为列
1、添加按键消息
(1)config.h中,修改按键数量;

(2)pwrkey_table和adkey_table中,增加按键的id值和电压阈值的配对关系;

注意:这里的电压值我并没有修改,值修改了按键的id值;实际开发中需要修改!
(3)key_msg_tabl中,增加按键消息列表,如有自定义消息可参考上文内容;

2、修改按键功能
SDK默认支持修改BT音乐模式和通话模式下KEY1的按键消息,只需要在downloader的配置中打开对应的开关并修改对应按键的消息即可(注意,打开对应开关后,按键消息就不在对应消息列表中的数据,而是重定义为了setting配置中的数据)。此外,不通过配置文件,直接修改port_key.c文件中的按键消息列表也同样可以实现按键功能的修改;

注意:多击的响应时间可以在downloader的按键配置中进行更改,时间越短,要求多击时按键速度要更快,否则会被识别成单击。

制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!
网硕互联帮助中心





评论前必须登录!
注册