【跑步姿势训练鞋】No.006-蓝牙通信程序设计
[复制链接]
上一篇介绍了算法部分,姿态识别和步频计算,这一篇介绍蓝牙通讯程序的设计过程。
对于蓝牙通讯部分,原本以为利用现成的例程改一下应该很容易实现,没成想被现实狠狠打脸,结果搞了好几个晚上才弄出来,差点就放弃了。
先说一下最开始的思路:受《Energy HarvestingBluetooth Low EnergySwitch User Guide》这个应用启发,我计划使用广播包把数据发出去。每个广播包可以发31个字节,我实际每包要传输的数据只有20字节,剩余11个字节做头也够用。我先研究这个文件里面提到的例程《BLE-SWITCH001-GEVB EDDYSTONE FIRMWARE》。这个是采用的谷歌的Eddystone协议,因为例程编写的跟协议关联性很大,要想裁剪移植这个例程,需要先搞清楚Eddystone协议,研究了一晚上,感觉我用不到Eddystone协议,在这个基础上裁剪太麻烦了,放弃这个思路。找个简单点的例程移植吧,放过我自己,洗洗睡吧。
下一个晚上在论坛里逛逛放松心情,发现w494143467大神的帖子《【环境专家之智能手表】Part6:BLE广播温度、湿度和气压数据 》讲到用ble广播传输,移植过程写的非常详细,这不是为我准备的吗,仔细研究之!
链接如下:https://bbs.eeworld.com.cn/thread-1168955-1-1.html
这个是选择从心率例程移植广播包代码到自己工程的过程,如下图。我比较习惯用IAR,所以移植的时候也用的IAR例程,一通复制粘贴,一编译出错,一通查找修改,编译不出错了,一运行又出错,然后重复以上过程n+1次,依然莫名其妙的出错,我在浓浓的夜色中凌乱了...嗯,这个也好难,我先睡觉吧。
图1,心率例程
第二天在论坛版主的帮助下,联系上了w494143467大神,请教了移植的问题,并给到了移植好的整个工程让我参考,这里非常感谢。不过大神说这个移植也不完美,建议把外设代码往蓝牙例程上移植更靠谱。
由于例程是ON Semiconductor IDE工程,晚上我不情不愿的装上了ON Semiconductor IDE,然后我发现ON Semiconductor IDE下的例程竟然比IAR例程多好多好多好多好多!见下图对比。
图2,例程数量对比
难道这是亲儿子和干儿子的区别吗!!!没办法了,只能重新学习新的开发环境了。考虑到之前看心率例程里面,广播包的发送代码关联比较多,改起来也挺费事,现在多出来这么多例程,我何不选择最简单的一个修改呢,另外传输也不一定非得用广播包啊,只要能满足传输要求就行啊。
接下来我几乎遍历的所有的带蓝牙传输的例程,最终选定《peripheral_server》这个例程,结构简单,没有使用太多外设,方便往里面移植我之前调试好的代码。
然后又开始了一通复制粘贴,一编译出错,一通查找修改,编译不出错了,一运行又出错,然后重复以上过程n+1次,终于正常运行了。但是,为什么ADC只进一次中断,后面就再也不进中断呢???返回去运行不带蓝牙的就好好的。代码上找不出问题,就从寄存器单步调试找问题。
参考《RSL10_getting_started_guide》里面“3.4.2 Peripheral Registers View with the ON Semiconductor IDE”章节,设置IDE debug参数,一步一步的执行看寄存器变化,然后就发现运行完这个“Sys_RFFE_SetTXPower(OUTPUT_POWER_DBM);”初始化函数后,我之前设置的ADC寄存器就变化了。搞进去,看看这个函数搞什么鬼!
图3,查看函数定义
我看到,这个函数里面对ADC一顿操作啊,最后还把ADC给我关了....好深的坑!!原来初始化无线的时候,先采样电源电压再根据电压配置无线部分的电源。既然找到原因了,解决起来就简单了。这个地方只是用一下ADC就释放了。我只需把我要的ADC参数在这个函数之后配置就好了。
图4,深坑之隐藏的ADC配置
改好后,果然运行没问题了,从手机蓝牙调试APP里能够连接上蓝牙设备了。
图5,连接成功
打开notification,就能看到上报的检测结果了。
图6,采集到的数据
如上图所示,1-2字节是足部姿态标识,3-4是步频数据,由于测试时传感器悬空,图中出现的数据是随机值。后面的分别是4个传感器的实际数值,每个占4字节,为int32型。
最后就是对可能浪费时间、电能的地方做处理,比如led比较费电,我把整个LED_Timer任务除了关灯的代码都注释掉了;把APP_Timer任务里面每6秒触发一次notification的代码注释掉;如下图。
图7,去掉多余的代码
图8,去掉多余的代码
综上,蓝牙传输部分终于完成了,虽然遇到各种问题,最终都搞定了,还是很有成就感的。后面介绍自发电功能研究。
|