CC2541 Large OAD 空中升级方式
Posted xiaoshideyuxiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CC2541 Large OAD 空中升级方式相关的知识,希望对你有一定的参考价值。
CC2541 OAD 有两种方式,一种是Flash对半分成Image A和Image B的,另一种是Large Image OAD.
Large Image OAD 这种方式的好处是可以通过压缩Image A的方式来提升Image B的存储空间
TI官方的文档是说,可以将Image A压缩至90多KB,因此Image B就有了150多的空间,这相比较于“Flash对半分”的方式就足足多出了30KB,在一些内存资源吃紧的项目上便可发挥作用。
顺便一提,OAD的原理就是利用代码来控制程序的走向,通过在Flash中代码启动处设置一些标志从而控制程序从哪处运行,BIM便充当着控制者的角色,而ImageA和ImageB则是执行的内容相当于一个工程分开两次编译;也正是因为这种特殊的运行模式使得OAD时需要用到BIN文件而不是HEX。
下面介绍如何自己创建一个Large OAD 的Image B:
首先,可以去TI的官方WIKI上面下载一个demo
官方OAD教程
以SimpleBLEPeripheral工程为例,讲述一下在构建过程中要注意的地方
首先去demo中的HIDAdvRemote_OAD_Large_Img_B文件夹里找到source中的cc254x_f256_imgB_Large.xcl放在自己要做的工程的对应位置下
注意:放的位置路径和后面的编译设置有关
打开simple工程rebuild all
建立一个新的编译版本
DEFAULT_ENABLE_UPDATE_REQUEST这个宏可以设置为TRUE
原因是Image B并不参与OAD过程所以自动更新参数会引起升级失败的问题不存在
然后在工程的options设置中弄好预编译路径和预编译宏
FEATURE_OAD_BIM
HAL_IMAGE_B
FEATURE_OAD
OAD_KEEP_NV_PAGES
OAD_IMG_A_PAGE=1
OAD_IMG_A_AREA=47
OAD_IMG_B_PAGE=8
OAD_IMG_B_AREA=(124 - OAD_IMG_A_AREA)
然后在Build Actions中设置
“ PROJDIR ….\\common\\cc2540\\cc254x_ubl_pp.bat” “ PROJDIR ”
“ProdUBL” “ PROJDIR \\CC2541_Large_OAD_ImageB\\Exe\\SimpleBLEPeripheral”
注意:这里的路径一定要和“编译版本名”一致,如果不一致会出现如下错误
路径末尾的名称要和生成的hex文件及sim文件保持一致
不一致的话不会出现弹框错误但是也不会生成BIN文件
接下来是Liker里面的设置
PROJDIR ..\\Source\\cc254x_f256_imgB_Large.xcl
下载设置,和“Flash对半分OAD”方式不同,这里可以选择擦除
添加OAD的profile
设置一个版本号
编译,闪过一个运行框就说明OK了,此时BIN文件已生成
至此OAD的Image B部分就完成了,可以升级成功,但是,想要多次升级就需要ImageA和ImageB之间能做到切换自如
因此可以在按键处理函数中或者在蓝牙数据里面定一条数据协议,添加以下代码表示切换成ImageA
uint16 crc[2] = 0x0000, 0xFFFF ;
uint16 addr = OAD_IMG_R_PAGE * ((uint16)(HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE)) + OAD_IMG_CRC_OSET / HAL_FLASH_WORD_SIZE;
HalFlashWrite(addr, (uint8 *)crc, 1);
HAL_SYSTEM_RESET();
OAD方法:
目前只用ios软件测试过
准备工作:给测试模块烧录BIM的hex文件然后用IAR(Download and Debug功能)烧录ImageA的BIN文件;这两个文件使用WIKI中的demo编译出来的就行
首先iphone安装sensorTag,然后连接电脑的itunes,在itunes界面点手机图标->应用里面选择sensorTag然后添加文件。
在手机中打开sensorTag搜索并连接测试模块,进入Sensor View->FW Download->Select FW File 点击要升级的BIN文件即可
整个OAD过程耗时大概两三分钟
以上是关于CC2541 Large OAD 空中升级方式的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)