EVT例程中提供了两种OTA方式,在EVT的BLE目录最下面有一个OTA的PDF说明:WCH蓝牙空中升级(BLE OTA)
本文主要讲的是方式二不带库升级,整个codeflash分成四个区域,Jump IAP,APP,IAP,LIB,一共需要烧录四个hex才可运行。
Jump IAP为4K,作用是用来跳入到IAP中,此工程main中并无函数,会直接跳转到IAP,IAP的起始地址修改后,此工程启动文件中的地址也需对应修改为IAP的起始地址,
APP为44K,设置这个大小的原因是为了使一些192Kflash的芯片也能直接使用OTA,此APP部分是可以不带有蓝牙功能的,因为是跳转到IAP进行蓝牙升级的,
IAP为16K,它的作用就是将手机app发送的升级固件直接写到APP区域,
LIB为573的是128K,CH585/592/582的是192K。
使用此方式OTA需要先用BLE调试助手等蓝牙工具先连接通过CHAR3发送一个字节数据,跳转到IAP中,名字更新为OTA_OTA_OTAOTA才可以使用OTA软件连接升级。
那么就有一个问题,对于448Kflash的芯片,APP的44K空间不够用了该如何扩大APP区域呢?
先讲下整体思路,因为要扩大APP,IAP和LIB就都要往后移动,APP和IAP的LD文件需重新分配起始地址和大小,Jump IAP需要跳转到IAP移动后的起始地址,以为使用固定库所以APP和IAP需要添加全局宏,因为库的后移,APP和IAP的启动文件和全局宏的地址需从默认的0x10000修改后LIB新的起始地址为0x40000,APP需增加跳转IAP的jump代码和用于app判断有限性的定义,最终要使用romx.h这个靠后放置的库。
一.修改Jump IAP工程:
1.修改启动文件跳转地址
Jump IAP的修改十分简单,因为它的功能就只是跳转到IAP,APP要扩大,向后移动后起始地址产生了变化,只要如下图修改跳转地址即可:
CH585/592/582的IAP起始地址为4+236=240k,填入0x0003C000 CH573的IAP起始地址为4+300=304k,填入0x0004C000,下方截图修改的CH585/592/582,注意573有所不同,

二.修改APP工程:
APP需要修改五个地方,一是工程预处理,二是Link.ld,三是启动文件startup_CH583.S,四是自己写的APP还需额外添加Jump_OTA代码,五是自己写的APP添加标志供OTA工具识别。
1.工程预处理:
CH585/582添加CH58xBLE_ROM=1,CH592添加CH59xBLE_ROM=1,CH573添加CH57xBLE_ROM=1,如果使用的OnlyUpdateApp_Peripheral例程,那么就无需再添加,因为例程已经添加了,截图修改的CH585/582,注意592和573有所不同,
CH585/592/582添加LIB_FLASH_BASE_ADDRESSS=0x00040000
CH573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,

2.Link.ld修改:
如果是OnlyUpdateApp_Peripheral例程,那么就只需要修改一处,将原本给的44k按4k为单位扩大,建议直接给到最大,CH585/592/582为236k,573为300k,截图修改的CH585/592/582,注意573有所不同,
如果是自己的任意APP代码,那么将OTA例程的APP的Link.ld文件复制粘贴过来修改上面那一处即可,注意是复制粘贴后再修改而不是直接修改!

3.startup_CH583.S修改:
如果是OnlyUpdateApp_Peripheral例程,那么也只需要修改一处,
CH585/592/582将j 0x10000修改为j 0x40000,
573将将j 0x10000修改为j 0x50000,截图修改的CH585/592/582,注意573有所不同,
如果是自己的任意APP代码,那么将OTA例程的APP的startup_CH583.S文件复制粘贴过来修改上面那一处即可。

4.添加添加Jump_OTA代码(使用OnlyUpdateApp_Peripheral例程可跳过)
可以按照自己的逻辑调用Jump_OTA跳入到IAP中开始升级,可以如下图,放在peripheral.c中,然后在蓝牙接收到数据后调用,当然,串口收到信息或按键触发调用也都是可以的。

/* OTA 升级标志 */
#define IMAGE_OTA_FLAG 0x03
/* 存放在DataFlash地址,不能占用蓝牙的位置 */
#define OTA_DATAFLASH_ADD 0x00077000 - FLASH_ROM_MAX_SIZE
/* flash的数据临时存储 */
__attribute__((aligned(8))) uint8_t block_buf[16];
/*********************************************************************
* @fn Jump_OTA
*
* @brief 跳转OTA升级
*
* @return none
*/
void Jump_OTA(void)
{
uint16_t i;
uint32_t ver_flag;
/* 读取第一块 */
EEPROM_READ(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4);
/* 擦除第一块 */
EEPROM_ERASE(OTA_DATAFLASH_ADD, EEPROM_PAGE_SIZE);
/* 更新Image信息 */
block_buf[0] = IMAGE_OTA_FLAG;
/* 编程DataFlash */
EEPROM_WRITE(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4);
/* 软复位 */
SYS_ResetExecute();
}
5.添加用于app判断文件有效性标志(使用OnlyUpdateApp_Peripheral例程可跳过)
在peripheral_main.c中添加下图内容,否则升级时,app会认为你放入的hex是非法的导致无法正常升级。如果使用OnlyUpdateApp_Peripheral例程,就无需添加,例程中已有这部分内容。

三.IAP程序修改
IAP需要修改四处,一是工程预处理,二是Link.ld,三是启动文件startup_CH583.S,最后一个是ota.h文件,
1.工程预处理:
CH585/592/582添加LIB_FLASH_BASE_ADDRESSS=0x00040000
573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,截图修改的CH585/592/582,注意573有所不同,

2.IAP程序Link.ld文件修改起始地址
CH585/592/582起始地址为4+236=240k,填入0x0003C000
573起始地址为4+300=304k,填入0x0004C000,截图修改的582,注意573有所不同,
例程默认FLASH (rx) : ORIGIN = 0x0000C000, LENGTH = 16K,修改为FLASH (rx) : ORIGIN = 0x0003C000, LENGTH = 16K
0x0003C000 !!!(前面多了一个3)

3.IAP程序ota.h文件修改
将APP大小修改为重新配置后的大小,截图修改的CH585/592/582,注意573有所不同,应修改为300 * 1024

4.IAP程序startup_CH583.S文件修改
CH585/592/582将将j 0x10000修改为j 0x40000,573将将j 0x10000修改为j 0x50000,截图修改的CH585/592/582,注意573有所不同,

四.合并hex
LIB则是合并的时候选择带x后缀的hex文件,这个LIB是靠着flash最后的位置放的,可以让APP增大至最大。

将四个HEX合成一个之后使用isp工具烧录或者用最新的isp工具直接选择4个hex烧录。
浙公网安备 33010602011771号