CH573 CH582 OTA例程讲解二(方式二:使用固定库+扩大APP程序空间) - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

花落 关注 私信
[文章]

CH573 CH582 OTA例程讲解二(方式二:使用固定库+扩大APP程序空间)

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=0x00040000CH573添加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
  • [url=home.php?mod=space&uid=2666770]@Brief[/url] 跳转OTA升级
  • [url=home.php?mod=space&uid=1141835]@Return[/url] 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工具烧录。

HEX合成工具链接:WCH_AssemblingFileTool.ZIP - 南京沁恒微电子股份有限公司

OTA工具链接:BLE_OTA_Android.ZIP - 南京沁恒微电子股份有限公司 (wch.cn)

更多回帖

×
发帖