CC2541之OAD

一、简介

本篇以SimpleBLEPeripheral工程为例,介绍如何进行OAD升级。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件: IAR 8.20.2

硬件平台: Smart RF开发板、USB Dongle

PC软件: BLE Device Monitor


三、版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.net/feilusia

联系方式:897503845@qq.com

技术交流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中)

  1. #if defined FEATURE_OAD  
  2.   VOID OADTarget_AddService();                    // OAD Profile  
  3. #endif  
添加OAD服务的代码(协议栈默认已有)。


10)修改代码3(SimpleBLEPeripheral.c中)

  1. #if defined FEATURE_OAD  
  2.   #include "oad.h"  
  3.   #include "oad_target.h"  
  4. #endif  
添加OAD服务的头文件(协议栈默认已有)。

11)修改代码4(SimpleBLEPeripheral.c中)

  1. // Whether to enable automatic parameter update request when a connection is formed  
  2. #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)

  1. // OAD Image Version (0x0000-0x7FFF)  
  2. -DOAD_IMAGE_VERSION=0x0004  
修改ImageB的版本号为0x0002,以示与ImageA的0x0000版本号的区别。


6)修改工程中的批处理文件cc254x_ubl_pp.bat

  1. @echo off  
  2. %~d1  
  3. chdir %1\..\..\common\cc2540  
  4. 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中)

  1. // OAD Image Version (0x0000-0x7FFF)  
  2. -DOAD_IMAGE_VERSION=0x0005  

2、生成ImageA的bin文件

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源码。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值