oad在线手机固件升级和系统升级 oad 是什么意思

OAD是TI在BLE协议栈基础上扩展的一种无線更新技术OAD使用客户端-服务器的机制工作。需要固件更新的目标芯片叫做OAD Target/Client用来管理OAD功能的一端叫做OAD Manager/Server。

配置OAD的目标设备如果需要更新軟件的话,不用连接仿真器通过BLE无线就可以更新软件,方便用户升级

有些人会觉得OAD很复杂,其实并不复杂本质就是OAD Manager/Server端将需要升级的bin攵件字节流取出来,然后按照特定的长度(因为BLE每个包的长度是受限的)通过write方法将数据通过带有写权限的特征值发送给OAD Target/Client端,然后OAD Target/Client 端将收到的数据写到特定的flash地址上

CC2640的OAD手机固件升级和系统升级支持内置Flash和外置Flash两种,我们先来了解下内置Flash的OAD配置方式至于外置Flash的情况,后期再继续更新

内置Flash的OAD手机固件升级和系统升级配置之后,整个Flash中地址分配情况如下图:


下面我们来具体了解一下内置Flash的设备配置OAD的方法。

Application这三者hex文件合并成OAD_merge.hex文件所以我们在下面的介绍文档中用ImageA来统称这三者合并之后的OAD_merge.hex文件,希望大家不要混淆了这里这样统稱,只是为了方便下述流程的说明

下面,我们一起来看看编译的方法和编译过程中出现的问题及解决办法:

1.先打开IAR开发工具然后将

目錄下的OADTarget.eww拖到IAR的左侧工作区,打开OADTarget工程打开之后显示如下:

我们可以看到,打开的工程包含了BIM、CC2640App和CC2640Stack编译过程为:首先编译BIM,然後编译CC2640Stack最后编译CC2640App,编译CC2640App的时候会在编译完成的时候调用Python执行hexmerge.py脚本来将编译生成的三个hex文件合并成一个

2.BIM和CC2640Stack的编译没有什么问题,我們不再讲述下面重点来看一下CC2640App编译之后执行合成脚本的时候出现的问题,没有进行任何配置的情况下会提示下面截图的信息:


这个错誤是因为没有安装Python或者你安装的目录不是C:\Python27\”下,导致找不到该执行文件Python的安装过程可以参考下面链接中的博文:

Python安装完成并配置环境變量之后,我们还需要下载合成脚本并复制到Python的安装目录下,合成脚本hexmerge.py的下载链接如下:

打开上述下载链接之后截图如下:


上面链接中列出了很多不同时期的版本我下载的是上述截图中的红圈圈中的这个,下载到电脑上之后解压缩显示如下:


我们需要的脚本在解壓出来的文件夹的scripts目录下,将该目录下的所有py脚本都复制到C:\Python27\Scripts目录下

3.重新编译CC2640App,但是这个时候又会出现下面的编译错误:

从仩面截图中的编译错误提示我们看不出什么原因,这个时候我们可以将错误提示中的那些命令复制出来,删掉换行符和不必要的空格剩下的内容如下:

 
这其实就是合并文件的命令,而且是绝对路径的那我们就可以在windows命令行中运行一下看看是否会提示更详细的错误信息,运行结果截图如下:

果然不出所料的有更详细的提示信息,提示错误是导入intelhex模块的时候发现没有该模块当然,我们也可以打開hexmerge.py脚本然后看看错误提示中提到的139行的内容,来了解具体执行的地方截图如下:

解决办法:将下载解压的intelhex-2.1文件夹下的intelhex文件夹整个复制到C:\Python27目录下,然后重新编译这样就可以成功编译了,编译成功之后会在



注意:用这个ImageA升级ImageB的话如果用PC端的BLE Device Monitor或者安卓手機端的APP都会出现连接失败,或者搜索不到服务或者搜索到服务之后过一会就断开,或者升级过程中断开连接等问题这个问题的主要原洇是ImageA的CC2640App开启了BLE连接成功之后自动申请修改连接参数的功能,在


自动申请的连接参数最小是80最大是800,这个连接间隔太长会影响升级,所鉯我们将DEFAULT_ENABLE_UPDATE_REQUEST的值改为FALSE来关闭自动申请连接参数更新进而用默认的连接参数进行升级。这样PC端的BLE Device Monitor才能正常连接并进行升级如果为叻提高升级的速度,需要将连接间隔缩小那用PC端的BLE Device Monitor的话可以用该工具进行设置;若用手机端进行升级的话,可以将需要的连接间隔通过某个特征值发给从机由从机来重新申请。
将开发板通过XDS仿真器链接到电脑上连接的方法、Flash Programmer工具以及驱动的安装我们这里不再讲述,准備好之后打开Flash Programmer 工具,然后按照下图进行操作:

成功烧录之后我们用PC端的BLE Device Monitor工具进行搜索和连接,之后可以看到相应的服务和特征值截圖如下:

此处有一点需要注意,就是ImageA中固定了Mac地址也就是,如果用协议栈中的Demo编译ImageA其Mac地址都是0A:D0:AD:0A:D0:AD,而后面编译的ImageB用的是芯片本身的Mac哋址这样可以避免用安卓手机等方式升级时,因为蓝牙缓存的原因导致设备名、服务和特性没有改变的问题
当然ImageA的Mac地址也可以根据自巳的需求进行修改,但是要保证跟现有的已经分配的Mac地址不冲突所以除非必须改,否则不要动这个地方代码中设置的地方截图如下:

峩们先用TI协议栈中的Demo进行测试和整个流程的熟悉。如何在一个没有配置过OAD的工程中配置OAD ImageB的相关内容在另一篇博文中讲解链接如下所示:





3.鼡PC端的BLE Device Monitor工具或者安卓手机端工具将该文件更新到设备端之后,会发现设备端重启之后不再广播程序跑不起来,如果出现这种情况打开

目录下的appBLE.cfg文件,将开头的如下两行代码屏蔽掉:


至于这个地方为什么要这样TI官方文档其实有说明。官方文档中的说明如下:


1.用BLE Device Monitor工具搜索并连接我们要升级的设备,然后点击菜单栏上的File”在下拉菜单中选择Program(OAD),操作截图如下:

2.点击Program(OAD)之后会弹出如下所示的框框:

File Image里面要选择的文件就是我们要更新的固件,我的是在



待进度条走完升级就完成了,该提示框会自动消隐
3.升级完成之后,然後重新用PC端的BLE Device Monitor工具进行搜索和连接(如果搜索不到就重启下设备然后再试试),截图如下:

ImageB的设备名我特意进行了修改目的是与ImageA的进荇区分,并且看右侧跟之前ImageA的相比较也明显能看出服务和特性都不一样了证明我们的升级成功了。
4.到了这一步ImageB的固件就升级到我们的目标设备上了,但是ImageB本身不带升级功能所以没有办法来升级ImageA,有人会问那我们要更新ImageB怎么办呢?也就是我们如何从ImageB切换到ImageA然后重新升级新的固件ImageB呢?
TI考虑到了这一点所以增加了一个UUID为FFD0的服务和UUID为FFD1的特征值,用户可以向该特征值写入任意值设备端就会切换囙ImageA,截图如下:

重新搜索设备就会发现设备切换到ImageA了。
因为本人是个爱学习的小学生所以我们再一起来看看上述切换的实现代码及原悝,实现代码在



关键的部分就是红圈里面的内容源码如下:
从上述代码中不难看出,所谓的ImageB切换回ImageA其实就是将Flash中ImageB校验字节写成0,因为偅启设备的时候运行到BIM中会先去判断ImageB的校验字节如果全为0,就认为ImageB不完整或者没有然后去判断ImageA的校验字节,如果ImageA的校验字节完整非0僦去运行ImageA。有的人觉得为了这个功能单独配置一个服务和特征值太浪费了那我们可以将这个服务和特征值删掉,然后在你必须要保留的特征值中找一个带有写权限的然后在主机通过该特征值写入某个命令的时候执行上述代码即可。

我要回帖

更多关于 ova与oad 的文章

 

随机推荐