上文我们介绍了固定库的基本用法,本文则进一步讲解如何配置和使用不同起始地址的固定库。

一、固定库地址选择

官方提供了四种不同起始地址的固定库,相关定义可在 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 注释中查询。


二、通用配置步骤(四步法)

以下配置以 CH59xBLE_ROMx.hex(起始地址 0x00040000)为例,其余版本只需替换对应的起始地址即可。为保持一致性,必须先复制粘贴 OnlyUpdateApp_Peripheral 例程中的Link.ld和Startup.s文件,然后再按需修改:

步骤1:修改链接脚本(Link.ld)

链接脚本定义了各存储区域的起始地址与大小。采用固定库方案时,协议栈存放于Flash高地址区,需相应调整APP的起始地址和大小。

MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K   /* APP起始地址与长度,此处示例为256K */
    RAM (xrw)  : ORIGIN = 0x20002000, LENGTH = 18K    /* 0x20000000~0x20002000预留给协议栈 */
}

步骤2:修改启动文件(Startup.s)

启动文件需修改跳转目标地址,使其指向固定库的起始地址。

    la t0, main
    csrw mepc, t0

    j 0x40000          /* 此处修改为所选协议栈的起始地址 */

步骤3:添加固定库使能宏定义

在工程预处理宏定义中添加 CH59xBLE_ROM=1,告知编译器使用固化协议栈而非源码库。该宏会引导 CONFIG.h 包含 CH59xBLE_ROM.h(而非 CH59xBLE_LIB.h)。

注意:工程中所有包含协议栈头文件的地方,务必使用条件编译写法,严禁直接 #include "CH59xBLE_LIB.h"

#ifdef CH59xBLE_ROM
#include "CH59xBLE_ROM.h"
#else
#include "CH59xBLE_LIB.h"
#endif

步骤4:添加固定库地址宏定义

在预处理宏中增加 LIB_FLASH_BASE_ADDRESS=0x00040000,使编译系统明确协议栈固件的Flash位置,该值需与启动文件中的跳转地址保持一致。

三、各版本配置参数速查

为方便切换,不同协议栈对应的关键配置值汇总如下:

协议栈文件 LIB_FLASH_BASE_ADDRESS 启动文件跳转地址 链接脚本中 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

说明:链接脚本中 FLASHLENGTH 应设置为协议栈起始地址对应的偏移量(即应用程序可占用的最大空间),但需注意最终不超过芯片总Flash容量,且OTA场景需额外预留IAP分区。

 

posted on 2026-07-22 14:11  WCH蓝牙应用分享  阅读(1)  评论(0)    收藏  举报