本篇博文最后修改时间:2017年01月06日,11:06。


一、简介

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

二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件: IAR 8.20.2

硬件平台: Smart RF开发板(主芯片CC2541)、USB Dongle

PC软件: BLE Device Monitor

版权声明

博主:甜甜的大香瓜

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

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

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
暂无

2、在进行本文步骤前,请先 实现以下博文:
暂无

五、基础知识

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中)

#if defined FEATURE_OADVOID 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

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时需要关闭更新参数的宏,那什么时候可以再开启该宏?

答:ImageA和ImageB默认都开启更新,在OAD之前通过蓝牙指令或者串口AT指令等方式,关闭更新参数。更新之后就会默认开启更新。

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

【BLE】CC2541之OAD相关推荐

  1. CC2541之OAD

    一.简介 本篇以SimpleBLEPeripheral工程为例,介绍如何进行OAD升级. 二.实验平台 协议栈版本:BLE-CC254x-1.4.0 编译软件: IAR 8.20.2 硬件平台: Sm ...

  2. BLE CC2541 串口BootLoader 即 SBL BootLoader 资料 收集

    1.[CC254X_Bootloader]SBL(串口Bootloader)使用说明 2.CC2540协议栈高速串口通信解决(UART的DMA方式) 3.[BLE]CC2541之SBL 4.[BLE] ...

  3. 【IoT】TI BLE CC2541 串口控制蓝牙详解

    一.简介 本文以SimpleBLECentral工程为例,介绍串口控制蓝牙. 过程: 扫描从机 - 根据从机号连接指定从机 - 获取RSSI值(信号强度) - 向char1写入特征值 - 断开连接 二 ...

  4. TI BLE 移除OAD

    原文连接:How to remove OAD feature on CC26x2/CC13x2 project_zero 由于国内访问外网比较麻烦,所以我将原文复制过来,方便国内的朋友学习. 以下是原 ...

  5. 【BLE】CC2541之Large OAD

    本篇博文最后修改时间:2017年05月19日,03:33. 一.简介 本篇以SimpleBLEPeripheral工程为例,介绍如何进行Large OAD升级. 二.实验平台 协议栈版本:BLE-CC ...

  6. 【BLE】-CC2541 OTA 程序开发手册介绍

    1.目的 使开发者能够快速的使用TI BLE 协议栈在CC2541 的SOC上进行TI OAD Profile 功能的开发. 2.功能概要 BLE 协议栈有一个可拓展的特性 OAD,它提供了一种增值服 ...

  7. 【资源共享】CC2541之新手常见问题集

    本篇博文最后修改时间:2017年05月22日,19:53. 一.简介 本文集合了香瓜整理的CC2541的新手常见问题,不断更新. 二.版权声明 博主:甜甜的大香瓜 声明:喝水不忘挖井人,转载请注明出处 ...

  8. CC2640之OAD固件升级(内置Flash)

    转自:http://blog.csdn.net/zzfenglin/article/details/52336612 什么是OAD OAD是TI在BLE协议栈基础上扩展的一种无线更新技术.OAD使用客 ...

  9. CC2640之OAD固件升级及合并方法

    文章转自https://blog.csdn.net/zzfenglin/article/details/52336612#comments 经过原文作者同意后转载 什么是OAD OAD是TI在BLE协 ...

最新文章

  1. 提取稳定前景的两种方法
  2. Hibernate持久化类与主键生成策略
  3. how to make Membership header extension fields editable
  4. 提取地图中道路_逼疯谷歌地球!我用神器一键提取各种肌理,还能生成3D模型!...
  5. php5.0 添加接口,Thinkphp5.0模型---插入数据
  6. Spring Cloud 与微服务学习总结(14)—— 云原生时代,如何从 Java 开发者转型微服务?
  7. 如何在 Mac 上将PDF 转换为 Word?
  8. 2016012052+小学四则运算练习软件项目报告
  9. 【转】史上最简单的软件破解——5行脚本代码完美破解99%的过期软件
  10. Visio Professional 2019 激活方法详解
  11. 小米手机 开启 开发者模式
  12. 复试项目2 直流可变稳压电源
  13. Echarts 水球图设置基准线
  14. 《辉煌优配》科技股强势引领A股反弹 沪深两市日成交额再超万亿元
  15. 编写C# Windows服务,用于杀死Zsd.exe进程
  16. CorelDRAWX8新功能摆脱传统工作模式
  17. excel拆分合并技巧:将工作表合并成总表的方法
  18. 每个男孩的机械梦「GitHub 热点速览 v.21.41」
  19. 【Vue】vuex-五个核心
  20. VS #region

热门文章

  1. java,png,jpg,多张图片合成一个pdf,压缩图片,并且保证图片不失帧。
  2. 【笔经攒人品】上海农商银行
  3. 3D segmentation of nasopharyngeal carcinoma from CT images using cascade deep learning
  4. 今年电商圈618活动很安静!
  5. JUnit 5 测试 Spring 引擎的时候提示 junit-vintage 错误
  6. c语言8行7列星号矩形,C语言程序设计课件_完整版.ppt
  7. Swing学习----------QQ登录界面制作(一)
  8. Cisco Packet Tracer Student抓取协议包简介
  9. XGBoost python调参示例
  10. 做SaaS的,2016年该怎么走,看阿朱怎么洞察