一、简介
本篇以SimpleBLEPeripheral工程为例,介绍如何进行OAD升级。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件: IAR 8.20.2
硬件平台: Smart RF开发板、USB Dongle
PC软件: BLE Device Monitor
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.net/feilusia
联系方式:[email protected]
技术交流QQ群:127442605
四、CC2541的OAD简介
1、什么是OAD?
答:Over-the-Air Download(空中下载),也就是可以不借助CC Ddebugger等有线方式、而通过蓝牙方式下载新的固件。
2、OAD相关的常见缩写含义?
答:
3、为什么工程中需要OAD?
答:通过OAD,可以不用板子上预留CC Ddebugger的IO口,大大缩小板子的体积。
同时空中升级给用户提供了方便、听起来也很牛逼的样子,OAD是未来升级固件的趋势。
4、OAD原理是什么?
答:
长话短说,如上图。
左端:可以是“PC+USB Dongle”、“IOS”,本篇使用的方式就是“PC+USB Dongle”。
右端:是待升级的CC2541目标板。最下层到最上层分别是“bootloader(启动代码)”、“ImageA(代码A)”、“ImageB(代码B)”
1)第一次下代码时,先通过CC Debugger下载BIM,再通过CC Debugger下载ImageA。当需要升级时,ImageA作为桥梁,通过OAD下载ImageB。
2)当需要更新ImageC时,则把ImageB当做桥梁,将ImageA更换为ImageC。
以此类推,ImageA与ImageB轮流被新的代码替换。
5、OAD过程中需要注意什么?
答:
1)目标板中有三段代码:BIM/BEM、ImageA、ImageB,而代码空间只有256K,因此ImageA和ImageB应当尽量小。
2)借助ImageA下载ImageB时,必须把ImageA的DEFAULT_ENABLE_UPDATE_REQUEST改为FALSE,否则会影响OAD传输,如下图会弹出各种错误。
3)OAD只能传输bin文件,因此第一次下代码时BIM/BEM、ImageA都是生成hex即可下载,而ImageB则需要生成bin文件通过BLE Device Monitor传输。
4)下载BIM/BEM时可以全片擦除,而下载ImageA时不可全片擦除,必须保留BIM/BEM的代码。
五、OAD第一次升级步骤
1、Smart RF通过CC Debugger下载BIM
工程路径:C:\Texas Instruments\BLE-CC254x-1.4.0\Projects\ble\util\BIM\cc254x
2、Smart RF通过CC Debugger下载ImageA
1)新建配置
Project->Edit Configurations->New
填入配置名称,并且基于原有的CC2541配置。
2)选择最新添加的GUA-CC2541-OAD-ImgA,rebuild all确保工程是正确的。
3)修改IAR配置1
4)修改IAR配置2
填入:"$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\GUA-CC2541-OAD-ImgA\Exe\SimpleBLEPeripheral"
注意!每个双引号之间只能有1个空格,不能有任何其他东西(如回车、两个空格等)。
同时注意路径中的“GUA-CC2541-OAD-ImgA”。
5)修改IAR配置3
填入:$PROJ_DIR$\..\..\common\CC2540\cc254x_f256_imgA.xcl
6)修改IAR配置4
改成与上图完全一样就好。
7)修改IAR配置5
8)修改代码1
将此三个文件编译进工程中。
编译方法:IAR中的文件都可以选择“编译”或“不编译”。打叉的文件是不编译的,如果工程中需要编译它,可以点击该文件右键——Options——把Exclude form build的勾去除。
9)修改代码2(SimpleBLEPeripheral.c中)
SimpleProfile_AddService( GATT_ALL_SERVICES ); // Simple GATT Profile #if defined FEATURE_OAD VOID OADTarget_AddService(); // OAD Profile #endif添加OAD服务的代码(协议栈默认已有)。
10)修改代码3(SimpleBLEPeripheral.c中)
#if defined FEATURE_OAD #include "oad.h" #include "oad_target.h" #endif添加OAD服务的头文件(协议栈默认已有)。
11)修改代码4(SimpleBLEPeripheral.c中)
// Whether to enable automatic parameter update request when a connection is formed #define DEFAULT_ENABLE_UPDATE_REQUEST FALSE//TRUE下载时需将更新参数请求功能关闭,否则会影响OAD。
12)rebuild all,并通过IAR的debug将ImageA下载进Smart RF中。
此时Smart RF中就有BIM和ImageA了。
3、生成ImageB的bin文件
1)新建配置
Project->Edit Configurations->New
注意,这里的名称与基于的配置,都与之前不一样。
这里ImageB配置以ImageA配置为基准,只做少量修改。
2)修改IAR配置1
2)修改IAR配置2
3)修改IAR配置3
4)修改IAR配置4
此步骤为了生成sim文件,后续可以将sim文件转换成bin文件。
5)修改代码(buildConfig.cfg)
// OAD Image Version (0x0000-0x7FFF) -DOAD_IMAGE_VERSION=0x0004修改ImageB的版本号为0x0002,以示与ImageA的0x0000版本号的区别。
6)修改工程中的批处理文件cc254x_ubl_pp.bat
@echo off %~d1 chdir %1\..\..\common\cc2540 start cc254x_ubl_pp.js %2 %3 %4 %5
根据自己的工程找到对应的位置,我的工程该文件位置如下
E:\BLE-CC254x-1.4.0\Projects\ble\common\cc2540\
通过文本编辑器编辑该批处理文件。
注:如果不做此步,很可能无法生成bin。
详情见http://e2e.ti.com/support/wireless_connectivity/f/538/t/314089
7)rebuild all工程,编译后在调试信息窗口无error即可,弹窗的错误是因为还没有产生 sim 文件,点OK不管它。
此时,在自己的工程中就已经生成了bin文件
4、用USB Dongle下载TI的HostTestRelease工程代码。
5、通过BLE Device Monitor下载ImageB的bin
1)PC上安装BLE Device Monitor
(我博客中的《资源共享》博文中有提供下载)
2)连接BLE Device Monitor与USB Dongle
插入USB Dongle、打开BLE Device Monitor后,Options-Serial port
3)配置连接参数
Options-GAP Settings
由于SimpleBLEPeripheral工程默认最小连接间隔是80(也就是100ms),所以这里将连接间隔也设置为80(也就是100ms)。
如果想更快的速度,那需要从机减少最小连接间隔。
4)Smart RF上电广播。
5)用USB Dongle扫描、连接Smart RF
连接上以后显示“OAD support detected”。
6)选择文件并下载
点击File-Program(OAD),选择要下载的ImageB的bin后,点Start
连接间隔为80ms时,全程约793S,也就是13分钟13秒。
(连接间隔为100ms时,全程约992S,也就是16分钟32秒)
下载之后设备会自己重启,再重新连接时发现设备信息已变,说明更新成功。
到这里就已经更新完毕。
假设又更新了一个版本,该如何再次升级呢?请看下文
六、OAD第二次升级步骤
上述第一次升级时,已经将BIM/BEM、ImageA、ImageB通通下进开发板里了,并且ImageB是最新更新的代码。
第二次升级时则会将ImageA更新,第三次升级时则会又将ImageB更新,轮流被更新。
下面介绍ImageA被更新的步骤。
1、更新版本号(buildConfig.cfg中)
// OAD Image Version (0x0000-0x7FFF) -DOAD_IMAGE_VERSION=0x0005
1)选择ImageA的配置工程
2)设置编译后输出的文件为sim文件
3)编译后即可生成bin
3、用BLE Device Monitor软件下载该bin文件
1)下载开始
注意此时要更新的信息已经变成ImageA的,并且是最新版本5。
点Start开始下载,静待结束即可。
2)下载结束
下载结束后,设备会断开连接,重连后可看到最新的设备信息。
所以,第二次oad更新成功。
后续更新步骤与第二次类似,只是不停地ImageA和ImageB之间轮换更新,这里就不再赘述。
七、本篇仍存在的疑问(如果有人知道原因,麻烦告诉我一声,谢谢!~)
1、为什么我的ImageB显示的Version是0,而不是我代码中修改的4?
答:修改buildConfig.cfg文件下的版本号才可真的修改,而不是修改oad_target.c中的。
2、如果下载OAD时需要关闭更新参数的宏,那什么时候可以再开启该宏?
3、如何使用安卓app进行oad升级CC2541?
答:香瓜测试了两个安卓app:Sensortag和BLE Device Monitor。两个皆无法下载我们的ImageB.bin。
其中Sensortag是网上搜到的源码,因此可能被改动过了,不能用很正常。
而BLE Device Monitor能下载该app自带的bin,却不能选择我们用户的bin,详情如下:
1)点击Custom选择文件时出错
2)直接下载app自带的ImageB可行,速度比PC端快很多,只需要158S。
解决方案:
方案一:反汇编BLE Device Monitor,修改Custom选项,使该app能选择本地的ImageB.bin。
方案二:寻找可用的Sensortag源码。