0%

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有所不同,

img

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有所不同,

img

步骤三

2.Link.ld修改:

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

img

步骤四

3.startup_CH583.S修改:

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

img

步骤五:(使用OnlyUpdateApp_Peripheral例程可跳过)

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

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* 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例程,就无需添加,例程中已有这部分内容。

img

IAP需要修改四处,一是工程预处理,二是Link.ld,三是启动文件startup_CH583.S,最后一个是ota.h文件,

步骤七

1.工程预处理:582添加LIB_FLASH_BASE_ADDRESSS=0x00040000/573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,截图修改的582,注意573有所不同,

img

步骤八

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)

img

步骤九

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

img

步骤十

4.startup_CH583.S文件如APP一样修改即可:583将将j 0x10000修改为j 0x40000,573将将j 0x10000修改为j 0x50000,截图修改的582,注意573有所不同,

img

步骤十一

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

img

将四个HEX合成一个之后使用isp工具烧录。

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

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

文章转载:https://www.cnblogs.com/risc5-ble/p/16986897.html
如有侵权,请联系我删除