【BLE】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

联系方式:[email protected]

技术交流QQ群:127442605


四、CC2541的OAD简介

1、什么是OAD?

答:Over-the-Air Download(空中下载),也就是可以不借助CC Ddebugger等有线方式、而通过蓝牙方式下载新的固件。


2、OAD相关的常见缩写含义?

答:

【BLE】CC2541之OAD_第1张图片


3、为什么工程中需要OAD?

答:通过OAD,可以不用板子上预留CC Ddebugger的IO口,大大缩小板子的体积。

同时空中升级给用户提供了方便、听起来也很牛逼的样子,OAD是未来升级固件的趋势。


4、OAD原理是什么?

答:

【BLE】CC2541之OAD_第2张图片

长话短说,如上图。

左端:可以是“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传输,如下图会弹出各种错误。

【BLE】CC2541之OAD_第3张图片

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

【BLE】CC2541之OAD_第4张图片

填入配置名称,并且基于原有的CC2541配置。


2)选择最新添加的GUA-CC2541-OAD-ImgA,rebuild all确保工程是正确的。

【BLE】CC2541之OAD_第5张图片


3)修改IAR配置1

【BLE】CC2541之OAD_第6张图片


4)修改IAR配置2

【BLE】CC2541之OAD_第7张图片

填入:"$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

【BLE】CC2541之OAD_第8张图片

填入:$PROJ_DIR$\..\..\common\CC2540\cc254x_f256_imgA.xcl


6)修改IAR配置4

【BLE】CC2541之OAD_第9张图片

【BLE】CC2541之OAD_第10张图片

改成与上图完全一样就好。


7)修改IAR配置5

【BLE】CC2541之OAD_第11张图片


8)修改代码1

【BLE】CC2541之OAD_第12张图片

将此三个文件编译进工程中。

编译方法: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

【BLE】CC2541之OAD_第13张图片

注意,这里的名称与基于的配置,都与之前不一样。

这里ImageB配置以ImageA配置为基准,只做少量修改。


2)修改IAR配置1

【BLE】CC2541之OAD_第14张图片


2)修改IAR配置2

【BLE】CC2541之OAD_第15张图片


3)修改IAR配置3

【BLE】CC2541之OAD_第16张图片


4)修改IAR配置4

【BLE】CC2541之OAD_第17张图片

此步骤为了生成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文件

【BLE】CC2541之OAD_第18张图片


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

【BLE】CC2541之OAD_第19张图片


3)配置连接参数

Options-GAP Settings

【BLE】CC2541之OAD_第20张图片

由于SimpleBLEPeripheral工程默认最小连接间隔是80(也就是100ms),所以这里将连接间隔也设置为80(也就是100ms)。

如果想更快的速度,那需要从机减少最小连接间隔。


4)Smart RF上电广播。


5)用USB Dongle扫描、连接Smart RF

【BLE】CC2541之OAD_第21张图片

连接上以后显示“OAD support detected”。


6)选择文件并下载

点击File-Program(OAD),选择要下载的ImageB的bin后,点Start

【BLE】CC2541之OAD_第22张图片

连接间隔为80ms时,全程约793S,也就是13分钟13秒。

(连接间隔为100ms时,全程约992S,也就是16分钟32秒)

下载之后设备会自己重启,再重新连接时发现设备信息已变,说明更新成功。

【BLE】CC2541之OAD_第23张图片


到这里就已经更新完毕。

假设又更新了一个版本,该如何再次升级呢?请看下文


六、OAD第二次升级步骤

上述第一次升级时,已经将BIM/BEM、ImageA、ImageB通通下进开发板里了,并且ImageB是最新更新的代码。

第二次升级时则会将ImageA更新,第三次升级时则会又将ImageB更新,轮流被更新。

下面介绍ImageA被更新的步骤。

1、更新版本号(buildConfig.cfg中)

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

2、生成ImageA的bin文件

1)选择ImageA的配置工程



2)设置编译后输出的文件为sim文件

【BLE】CC2541之OAD_第24张图片


3)编译后即可生成bin

【BLE】CC2541之OAD_第25张图片


3、用BLE Device Monitor软件下载该bin文件

1)下载开始

【BLE】CC2541之OAD_第26张图片

注意此时要更新的信息已经变成ImageA的,并且是最新版本5。

点Start开始下载,静待结束即可。


2)下载结束

下载结束后,设备会断开连接,重连后可看到最新的设备信息。

【BLE】CC2541之OAD_第27张图片

所以,第二次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选择文件时出错

【BLE】CC2541之OAD_第28张图片


2)直接下载app自带的ImageB可行,速度比PC端快很多,只需要158S。

【BLE】CC2541之OAD_第29张图片


解决方案:

方案一:反汇编BLE Device Monitor,修改Custom选项,使该app能选择本地的ImageB.bin。

方案二:寻找可用的Sensortag源码。

你可能感兴趣的:(【BLE】CC2541之OAD)