sipower 发表于 2021-6-27 00:18

【跑步姿势训练鞋】No.006-蓝牙通信程序设计

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">上一篇介绍了</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">算法部分,</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">姿态识别和步频计算</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">,</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">这一篇介绍蓝牙通讯程序的设计过程。</font></span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">对于蓝牙通讯部分,原本以为利用现成的例程改一下应该很容易实现,没成想被现实狠狠打脸,结果搞了好几个晚上才弄出来,差点就放弃了。</font></span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">先说一下最开始的思路:受《</font>Energy HarvestingBluetooth Low EnergySwitch User Guide》这个应用启发,我计划使用广播包把数据发出去。每个广播包可以发31个字节,我实际每包要传输的数据只有20字节,剩余11个字节做头也够用。我先研究这个文件里面提到的例程《BLE-SWITCH001-GEVB EDDYSTONE FIRMWARE》。这个是采用的谷歌的Eddystone协议,因为例程编写的跟协议关联性很大,要想裁剪移植这个例程,需要先搞清楚Eddystone协议,研究了一晚上,感觉我用不到Eddystone协议,在这个基础上裁剪太麻烦了,放弃这个思路。找个简单点的例程移植吧,放过我自己,洗洗睡吧。</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">下一个晚上在论坛里逛逛放松心情,发现</font>w494143467大神的帖子《【环境专家之智能手表】Part6:BLE广播温度、湿度和气压数据 》讲到用ble广播传输,移植过程写的非常详细,这不是为我准备的吗,仔细研究之!</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">链接如下:</font>https://bbs.eeworld.com.cn/thread-1168955-1-1.html</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">这个是选择从心率例程移植广播包代码到自己工程的过程,如下图。我比较习惯用</font>IAR,所以移植的时候也用的IAR例程,一通复制粘贴,一编译出错,一通查找修改,编译不出错了,一运行又出错,然后重复以上过程n+1次,依然莫名其妙的出错,我在浓浓的夜色中凌乱了...嗯,这个也好难,我先睡觉吧。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>1,心率例程</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">第二天在论坛版主的帮助下,联系上了</font>w494143467大神,请教了移植的问题,并给到了移植好的整个工程让我参考,这里非常感谢。不过大神说这个移植也不完美,建议把外设代码往蓝牙例程上移植更靠谱。</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">由于例程是</font>ON Semiconductor IDE工程,晚上我不情不愿的装上了ON Semiconductor IDE,然后我发现ON Semiconductor IDE下的例程竟然比IAR例程多好多好多好多好多!见下图对比。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>2,例程数量对比</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">难道这是亲儿子和干儿子的区别吗!!!没办法了,只能重新学习新的开发环境了。考虑到之前看心率例程里面,广播包的发送代码关联比较多,改起来也挺费事,现在多出来这么多例程,我何不选择最简单的一个修改呢,另外传输也不一定非得用广播包啊,只要能满足传输要求就行啊。</font></span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">接下来我几乎遍历的所有的带蓝牙传输的例程,最终选定《</font>peripheral_server》这个例程,结构简单,没有使用太多外设,方便往里面移植我之前调试好的代码。</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">然后又开始了一通复制粘贴,一编译出错,一通查找修改,编译不出错了,一运行又出错,然后重复以上过程</font>n+1次,终于正常运行了。但是,为什么ADC只进一次中断,后面就再也不进中断呢???返回去运行不带蓝牙的就好好的。代码上找不出问题,就从寄存器单步调试找问题。</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">参考《</font>RSL10_getting_started_guide》里面&ldquo;3.4.2 Peripheral Registers View with the ON Semiconductor IDE&rdquo;章节,设置IDE debug参数,一步一步的执行看寄存器变化,然后就发现运行完这个&ldquo;Sys_RFFE_SetTXPower(OUTPUT_POWER_DBM);&rdquo;初始化函数后,我之前设置的ADC寄存器就变化了。搞进去,看看这个函数搞什么鬼!</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>3,查看函数定义</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">我看到,这个函数里面对</font>ADC一顿操作啊,最后还把ADC给我关了....好深的坑!!原来初始化无线的时候,先采样电源电压再根据电压配置无线部分的电源。既然找到原因了,解决起来就简单了。这个地方只是用一下ADC就释放了。我只需把我要的ADC参数在这个函数之后配置就好了。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>4,深坑之隐藏的ADC配置</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">改好后,果然运行没问题了,从手机蓝牙调试</font>APP里能够连接上蓝牙设备了。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>5,连接成功</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">打开</font>notification,就能看到上报的检测结果了。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>6,采集到的数据</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">如上图所示,</font>1-2字节是足部姿态标识,3-4是步频数据,由于测试时传感器悬空,图中出现的数据是随机值。后面的分别是4个传感器的实际数值,每个占4字节,为int32型。</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">最后就是对可能浪费时间、电能的地方做处理,比如</font>led比较费电,我把整个LED_Timer任务除了关灯的代码都注释掉了;把APP_Timer任务里面每6秒触发一次notification的代码注释掉;如下图。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>7,去掉多余的代码</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>8,去掉多余的代码</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify">&nbsp;</p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">综上,蓝牙传输部分终于完成了,虽然遇到各种问题,最终都搞定了,还是很有成就感的。后面介绍自发电功能研究。</font></span></span></span></span></p>

w494143467 发表于 2021-6-27 08:07

<p>能帮上忙还是挺荣幸的哈~</p>

sipower 发表于 2021-6-27 21:14

w494143467 发表于 2021-6-27 08:07
能帮上忙还是挺荣幸的哈~

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan88.gif" width="59" /></p>

soso 发表于 2021-6-28 09:36

<p>厉害了。经验互相借鉴,步步攻克设计难题,为楼主点赞。</p>
页: [1]
查看完整版本: 【跑步姿势训练鞋】No.006-蓝牙通信程序设计