概述
之前我们讨论过AB面的OTA方式,其最大的优势就是:即使升级失败,旧版依然可以运行,相应的缺点就是会大量占用FLASH。本文讨论的OTA方式二正好与AB面OTA方式相对,其虽然不能同时保留两份程序备份,但是它可以很大程度上节省FLASH。
FLASH结构
OTA方式二的FLASH结构如下,
最前面的是Peripheral程序,也就是用户业务逻辑程序,此处我们分配了150K。Peripheral程序是可以升级的。
紧跟着的是OTA程序,当设备进入OTA程序时,就进入了等待升级状态。OTA程序是不可升级的。
最后是BLE STACK LIB,这部分占用空间最大(约250K),可以由Peripheral程序和OTA程序共同调用。这种OTA方式之所以节省Flash,原因就在于此,因为该种方式只有一份BLE STACK LIB的备份,而不像AB面OTA方式有2份。BLE STACK LIB是不可升级的。
OTA流程
当设备启动时,设备会运行最开始的Peripheral程序。当Peripheral程序接受到升级触发条件后,就会跳转到OTA程序。此时我们就可以使用官方提供的APP进行升级了。
实操
现在我们需要打包一个初始升级包(打包工具见附件),将Peripheral、OTA和BLE STACK LIB打包到一起,然后通过电脑升级。
首先,如下图所示,我们来编译Peripheral程序和OTA程序。
其中Peripheral占用前125K的Flash,OTA占用接下来8K(0x2000)的FLASH。他们共同使用从0x20006000起8K(0x2000)的RAM(0x20006000之前的RAM被分配给了BLE STACK LIB)。
编译完成后,我们通过打包工具依次将以下3个文件打包
EVT\EXAM\BLE\PERIPHERAL_ONLYUPDATEAPP\PROJECT\OBJ\BLE.HEX
EVT\EXAM\BLE\OTA_ONLYUPDATEAPP\PROJECT\IMAGEOTA\OBJ\IMAGEOTA.HEX
EVT\EXAM\BLE\LIB\CH579BLE_ROM.HEX
然后我们将打包好的文件(此处为“OTA2.bin”)通过ISP软件烧录进CH579M
烧录完成后,Peripheral程序就可以正常运行了。如前所述,如果进行OTA升级,必须让设备运行OTA程序。通过Peripheral的代码,我们看到GotoResetVector()为跳转OTA程序的函数,要触发该函数必须往Peripheral的0xFFE1特征值写数据,此处我们使用NRF-CONNECT蓝牙调试工具写入一个任意字节。
这时设备会进入OTA程序,此时我们会发现设备的广播名称变成了“OTA OTA OTA OTA!”
现在,我们就可以用之前AB面OTA方式一样的流程去升级程序了,注意新程序的要在Peripheral_OnlyUpdateApp例程基础上改写,并且必须放到手机APP的ImageA的目录里。
具体参见:https://bbs.eeworld.com.cn/thread-1154663-1-1.html
至此,方式二的OTA升级方式就完成了。
繁絮至此,但求明细。
https://bbs.eeworld.com.cn/forum.php?mod=attachment&aid=NTIyODQ1fGZiNDI0MmVkOGE4NTZiNWZjYjFiMDRkMjcwNDg0NGIzfDE3MzcyMjg5OTM%3D&request=yes&_f=.exe