BlueNRG LP 芯片支持 OTA(空中升级)功能,传统 OTA 框架(OTA Reset Manager、OTA Service Manager)会在 Flash 中存储两个 BLE 协议栈,占用大量存储空间。静态协议栈通过共用单一协议栈,既释放 Flash 空间给应用程序,又能加速 OTA 升级过程。本文基于 ST 官方 LAT1284 应用笔记,以 BlueNRG-LP SDK 1.4.0、KEIL IDE 为例,详细拆解静态协议栈定制、OTA 应用适配及功能验证的完整流程。
1. 静态协议栈核心优势与背景
1.1 传统 OTA 框架的痛点
传统 OTA 框架中,Higher APP、Lower APP(或 User APP 与 OTA Manager)均包含独立 BLE 协议栈,以 256K Flash 的 BlueNRG LP 为例:
- OTA Reset Manager 框架:Lower APP(124K)+ Higher APP(124K)+ 双协议栈,Flash 空间冗余严重;
- OTA Service Manager 框架:User APP(162K)+ OTA Service Manager(90K)+ 双协议栈,应用可用空间受限。
1.2 静态协议栈的核心价值
- 空间优化:Flash 中仅存储一个公共静态协议栈,应用程序无需自带协议栈代码,释放大量空间;
- 升级加速:OTA 升级包仅包含应用程序逻辑,无需传输协议栈代码,缩短升级时间;
- 兼容性强:支持 OTA Reset Manager 框架的 Higher/Lower APP 跳转,适配现有 OTA 流程。
2. SDK 提供的关键资源
- 协议栈配置文档:《PM0269 Bluetooth LE stack v3.x programming guidelines》,详细说明协议栈模块化配置方法;
- OTA 功能文档:《AN5463 Bluetooth LE Over The Air Firmware Upgrade》,提供 OTA 流程完整说明;
- 参考示例:SDK 中包含 4 种静态协议栈项目,其中 2 种支持 OTA Reset Manager 框架,具体如下:
| 静态协议栈项目 | 协议栈配置 | Link 数 | 应用首地址 | 支持 OTA 跳转 | 协议栈占用空间 |
|---|---|---|---|---|---|
| OTA_BTL_ResetManager_Basic | BLE_STACK_BASIC_CONF(基本功能) | 1 | 0x10058000 | 是 | 96K |
| OTA_BTL_ResetManager | BLE_STACK_FULL_CONF(全功能) | 1 | 0x10067800 | 是 | 158K |
| Release | BLE_STACK_BASIC_CONF | 1 | 0x10058000 | 否 | 96K |
| Basic | BLE_STACK_BASIC_CONF | 1 | 0x10067800 | 否 | 96K |
注:Link 数表示协议栈支持的无线任务数量,直接影响 RAM 占用,应用程序与静态协议栈的 Link 数必须一致。
3. 完整实施步骤
第一步:定制客户专属静态协议栈
基于 “OTA_BTL_ResetManager_Basic” 项目,按实际应用需求定制协议栈,生成库文件与烧录文件。
1. 新建协议栈工程
- 复制 SDK 中的 “OTA_BTL_ResetManager_Basic” 项目,重命名为 “OTA_BTL_ResetManager_CTM”;
- 新建 Listings、Objects 子目录,用于存放编译输出文件。
2. 工程配置(KEIL IDE)
- 输出配置:指定可执行文件名为 “BLE_StaticStack_OTA_BTL_ResetManager_CTM”,map 文件输出至 Listings 目录;
- 生成库文件:在 User 标签页 “Run#1” 中,设置生成库文件名为 “libbluenrg_lp_static_stack_rstmngr_CTM.a”。
3. 协议栈功能定制
- 预处理宏修改:将 “BLE_STACK_BASIC_CONF” 改为 “BLE_STACK_CUSTOM_CONF”,启用自定义配置;
- Link 数配置:根据应用需求设置 “CONFIG_NUM_MAX_LINKS”(示例设为 1),后续应用程序需保持一致;
- 功能裁剪:打开 “custom_ble_stack_conf.h”,仅启用必要功能(如支持 OTA 需开启 “CONNECTION_ENABLED” 和数据长度扩展);
- 内存宏配置:Linker 标签页中,设置 “MEMORY_FLASH_APP_SIZE” 为较大值(如 0x38000),预留应用空间。
4. 地址计算与宏定义调整
-
- 协议栈代码末尾地址(如 0x10058466);
- 协议栈 RAM 占用末尾地址(如 0x200006F8);编译项目,打开 map 文件,获取两个关键地址:
- 计算 Flash 边界:协议栈末尾地址向下对齐至 2K 字节边界(BlueNRG LP Flash 每页 2K),示例中 0x10058466 对齐后为 0x10058800;
- 计算偏移量:边界地址相对于 Flash 起始地址(0x10040000)的偏移量为 0x18800;
- 设置宏定义:预处理宏 “RESET_MANAGER_SIZE” 和 “MEMORY_FLASH_APP_SIZE” 均设为 0x18800,定义应用程序起始地址。
5. 生成协议栈文件
重新编译工程,生成两个核心文件:
- “libbluenrg_lp_static_stack_rstmngr_CTM.a”:协议栈库文件,需链接至应用程序;
- “BLE_StaticStack_OTA_BTL_ResetManager_CTM.hex”:协议栈烧录文件,需烧录至芯片。
第二步:生成静态协议栈版 OTA Higher/Lower APP
基于 SDK 的 “BLE_SerialPort” 示例,修改工程适配静态协议栈,生成 Higher APP 与 Lower APP。
1. 新建应用工程
- 基于 “BLE_SerialPort” 的 “Server_LowerApp_OTA” 目标,新建项目 “Server_LowerApp_OTA_CTM”;
- 同理,基于 “Server_HigherApp_OTA” 新建 “Server_HigherApp_OTA_CTM”。
2. 应用工程配置
- 协议栈配置:启用 “BLE_STACK_CUSTOM_CONF”,“custom_ble_stack_conf.h” 配置与静态协议栈一致;
- Link 数同步:“CONFIG_NUM_MAX_LINKS” 设为 1,与静态协议栈保持一致;
- 链接宏定义:添加两个关键宏,指定应用起始地址与 RAM 偏移:
--predefine="-DRESET_MANAGER_SIZE=0x18800"(应用起始地址偏移);--predefine="-DMEMORY_RAM_APP_OFFSET=0x06F8"(RAM 偏移,取自协议栈 map 文件);
- 移除冗余文件:禁止以下文件编译(避免重复包含协议栈代码):
3. 链接静态协议栈库
- 在 Middlewares/BLE_Stack 目录下,添加静态协议栈库文件 “libbluenrg_lp_static_stack_rstmngr_CTM.a”,设置文件类型为 “Library”;
- 添加 “bluenrg_lp_stack_init_if.c”(SDK 静态协议栈目录下),用于协议栈 API 调用适配。
4. 编译生成应用文件
分别编译两个工程,生成 “Server_Lower_OTA_CTM.hex” 和 “Server_Higher_OTA_CTM.hex”,即静态协议栈版 OTA 应用文件。
第三步:功能验证
使用 ST 官方评估板 STEVAL_IDB011V1,验证协议栈与 OTA 功能是否正常。
1. 基础验证
- 烧录静态协议栈文件 “BLE_StaticStack_OTA_BTL_ResetManager_CTM.hex”;
- 烧录 Lower APP 文件 “Server_Lower_OTA_CTM.hex”;
- 上电后通过串口打印,确认应用程序正常运行,协议栈 API 调用无误。
2. OTA 升级验证
- 第二块评估板烧录 SDK 的 DTM 程序,连接 PC 端 BlueNRG GUI 工具(版本 4.3.0);
- 通过 GUI 工具发起 OTA 升级,将 Higher APP“Server_Higher_OTA_CTM.hex” 发送至第一块评估板;
- 升级完成后,串口打印确认 Higher APP 正常运行;
- 重复操作,将评估板升级回 Lower APP,验证双向跳转与升级功能。
4. 核心注意事项
- Link 数一致性:静态协议栈与应用程序的 “CONFIG_NUM_MAX_LINKS” 必须相同,否则会导致协议栈调用异常;
- 配置文件同步:应用程序与静态协议栈的 “custom_ble_stack_conf.h” 功能配置必须一致,避免功能缺失或冲突;
- 地址计算准确:应用起始地址偏移(RESET_MANAGER_SIZE)需严格按协议栈 map 文件的 Flash 边界计算,否则会导致程序跳转失败;
- 冗余文件移除:必须禁止应用程序编译协议栈相关文件,否则会出现符号冲突,导致编译失败。
静态协议栈为 BlueNRG LP 的 OTA 升级提供了高效解决方案,核心是通过 “协议栈共用” 释放 Flash 空间、加速升级流程。实施关键在于三点:一是按需求定制协议栈,裁剪冗余功能;二是确保应用工程与协议栈的配置同步(Link 数、功能开关);三是准确计算地址偏移,保证程序正常跳转。
阅读全文
212