EVT例程中提供了两种OTA方式,在EVT中BLE目录下有一个PDF说明:WCH蓝牙空中升级(BLE OTA)
方式二是不带库升级,整个codeflash分成四个区域,Jump IAP,APP,IAP,LIB
Jump IAP为4K,用来跳入到IAP中,此工程main中并无函数,会直接跳转到IAP,IAP的起始地址修改后,此工程启动文件中的地址也需对应修改为IAP的起始地址,
APP为44K,设置这个大小的原因是为了使一些192Kflash的芯片也能直接使用OTA,此app部分可以不带有蓝牙功能,
IAP为16K,它的作用就是将手机app发送的升级固件直接写到APP区域,
LIB为573的是128K,583的是192K。
那么就有一个问题,对于448Kflash的芯片,该如何扩大APP区域呢?
如果想要扩大,需要按照下面的步骤修改:
步骤一:
Jump IAP的修改十分简单,因为它的功能就只是跳转到IAP,因为APP要扩大,IAP要后移,只要如下图修改跳转地址即可:
CH582的IAP起始地址为4+236=240k,填入0x0003C000 CH573的IAP起始地址为4+300=304k,填入0x0004C000,下方截图修改的582,注意573有所不同,
APP需要修改五个地方,一是工程预处理,二是Link.ld,三是启动文件startup_CH583.S,四是自己写的APP还需额外添加Jump_OTA代码,五是自己写的APP添加标志供OTA工具识别。
步骤二:
1.工程预处理:
CH582添加CH58xBLE_ROM=1,CH573添加CH57xBLE_ROM=1,如使用的OnlyUpdateApp_Peripheral例程,那么就无需再添加,因为例程已经添加了,截图修改的582,注意573有所不同,
CH582添加LIB_FLASH_BASE_ADDRESSS=0x00040000
CH573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,截图修改的582,注意573有所不同,
步骤三:
2.Link.ld修改:
如果是OnlyUpdateApp_Peripheral例程,那么就只需要修改一处,将原本给的44k按4k为单位扩大,建议直接给到最大,582为236k,573为300k,截图修改的582,注意573有所不同,
如果是自己的任意APP代码,那么将OTA例程的APP的Link.ld文件复制粘贴过来修改上面那一处即可。
步骤四:
3.startup_CH583.S修改:
如果是OnlyUpdateApp_Peripheral例程,那么也只需要修改一处,
583将j 0x10000修改为j 0x40000,
573将将j 0x10000修改为j 0x50000,截图修改的582,注意573有所不同,
如果是自己的任意APP代码,那么将OTA例程的APP的startup_CH583.S文件复制粘贴过来修改上面那一处即可。
步骤五:(使用OnlyUpdateApp_Peripheral例程可跳过)
4.添加Jump_OTA代码:可以按照自己的逻辑调用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();
}
步骤六:(使用OnlyUpdateApp_Peripheral例程可跳过)
5.在peripheral_main.c中添加下图内容,否则升级时,app会任务你放入的hex是非法的。如果使用OnlyUpdateApp_Peripheral例程,就无需添加,例程中已有这部分内容。
IAP需要修改四处,一是工程预处理,二是Link.ld,三是启动文件startup_CH583.S,最后一个是ota.h文件,
步骤七:
1.工程预处理:
582添加LIB_FLASH_BASE_ADDRESSS=0x00040000
573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,截图修改的582,注意573有所不同,
步骤八:
2.Link.ld文件:需要修改起始地址,
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.ota.h文件:将APP大小修改为重新配置后的大小,截图修改的582,注意573有所不同,应修改为300 * 1024
步骤十:
4.startup_CH583.S文件如APP一样修改即可:583将将j 0x10000修改为j 0x40000,573将将j 0x10000修改为j 0x50000,截图修改的582,注意573有所不同,
步骤十一:
LIB则是合并的时候选择带x后缀的hex文件,这个LIB是靠着flash最后的位置放的,可以让APP增大至最大。
将四个HEX合成一个之后使用isp工具烧录。