上文ch5xx 固定库配置方式 我们介绍了固定库的基本用法,本文则进一步讲解如何配置和使用不同起始地址的固定库。
一、固定库地址选择
官方提供了四种不同起始地址的固定库,相关定义可在 ROM.h 注释中找到。起始地址及适用场景如下:
| 协议栈文件 | 起始地址 | 大小 | 适用芯片 | 应用限制 | 备注 |
|---|---|---|---|---|---|
| CH59xBLE_ROM.hex | 0x00010000 (64K) | 192K | CH592 (448K Flash) | APP ≤ 64K,OTA需预留IAP空间 | 默认版本,不适用CH591 |
| CH59xBLE_ROMx.hex | 0x00040000 (256K) | 192K | CH592 (448K Flash) | APP ≤ 256K,OTA需预留IAP空间 | 不适用CH591 |
| CH59xBLE_ROM_MESH.hex | 0x0004E000 (312K) | 136K | CH592 (448K Flash) | APP ≤ 312K,OTA需预留IAP空间 | 仅支持蓝牙从机模式 |
| CH59xBLE_ROM_PERI.hex | 0x0000C000 (48K) | 136K | CH591 (192K Flash) | APP ≤ 48K,OTA需预留IAP空间 | 仅支持蓝牙从机模式 |
说明:不同型号芯片提供的 ROM 库可在 LIB 文件的 ROM.h 注释中查询。
二、配置步骤详解
整个配置过程分为以下四个步骤。为保持配置一致性,必须直接先复制粘贴 OnlyUpdateApp_Peripheral 例程中的 Link.ld 和 Startup.s 文件,然后再根据当前工程需求进行以下修改:
步骤1:修改链接脚本文件(Link.ld)
Link.ld 文件定义了各个存储区域的起始地址与占用空间。使用固定库时协议栈被放置于Flash的高地址区域,因此需要相应调整应用程序(APP)区域的起始地址与占用空间。
以起始地址为 0x00040000 的 CH59xBLE_ROMx.hex 为例,修改后的 MEMORY 配置如下:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K /* APP起始地址与长度,此处示例为256K */
RAM (xrw) : ORIGIN = 0x20002000, LENGTH = 18K /* 0x20000000~0x20002000预留给协议栈 */
}
步骤2:修改启动文件(Startup.s)
启动文件(startup_CH592.S)在使用固定库时需要配置跳转目标地址,使其跳转至固定库所在的起始地址。修改汇编跳转指令如下:
la t0, main
csrw mepc, t0
j 0x40000 /* 此处修改为所选协议栈的起始地址 */
步骤3:添加固定库使能宏定义
在工程的预处理宏定义中,需添加 CH59xBLE_ROM=1,用于启用 ROM 固定库。该宏会引导 CONFIG.h 头文件包含 CH59xBLE_ROM.h(而非 CH59xBLE_LIB.h ),从而调用固化的协议栈 API 。
工程中所有包含协议栈头文件的地方,严禁直接包含 CH59xBLE_LIB.h ,必须统一采用如下条件编译写法:
#ifdef CH59xBLE_ROM
#include "CH59xBLE_ROM.h"
#else
#include "CH59xBLE_LIB.h"
#endif
步骤4:添加固定库地址宏定义
程序中需要添加固定库对应地址的宏定义,使编译系统明确协议栈固件在 Flash 中的具体位置。在预处理宏中添加:
LIB_FLASH_BASE_ADDRESSS=0x00040000
该值需与启动文件中的跳转地址(j 0x40000)以及所选协议栈文件的实际起始地址严格保持一致。
完成上述四项配置后,重新编译工程,便可实现0x40000地址的固定库。
三、各版本配置参数速查
为方便切换,不同协议栈对应的关键配置值汇总如下:
| 协议栈文件 | LIB_FLASH_BASE_ADDRESSS | 启动文件跳转地址 | 链接脚本中 FLASH 建议配置 |
|---|---|---|---|
| CH59xBLE_ROM.hex | 0x00010000 | j 0x10000 | LENGTH = 64K |
| CH59xBLE_ROMx.hex | 0x00040000 | j 0x40000 | LENGTH = 256K |
| CH59xBLE_ROM_MESH.hex | 0x0004E000 | j 0x4E000 | LENGTH = 312K |
| CH59xBLE_ROM_PERI.hex | 0x0000C000 | j 0xC000 | LENGTH = 48K |
说明:链接脚本中 FLASH 的 LENGTH 应设置为协议栈起始地址对应的偏移量(即应用程序可占用的最大空间),但需注意最终不超过芯片总Flash容量,且OTA场景需额外预留IAP分区。
浙公网安备 33010602011771号