本文档是每位使用 Silicon Labs Bluetooth Stack 为 EFR32 Wireless Gecko 系列产品开发 C 应用程序的开发者的必备参考。本指南涵盖 Bluetooth Stack 的架构、应用开发流程、MCU 核心与外设的使用与限制、协议栈配置选项以及资源消耗分析,适用于 Silicon Labs Bluetooth SDK 3.0.x 及更高版本。Documentation Index
Fetch the complete documentation index at: https://mintlify.com/dsyx/docs.silabs.com_zh/llms.txt
Use this file to discover all available pages before exploring further.
当前支持的编译器:GCC 10.3-2021.10 和 IAR 9.20.4;支持的 IDE:Simplicity Studio 5.2 或更高版本。
Bluetooth Stack 架构
下图展示了高级别的固件架构,开发者在协议栈之上创建应用程序:- Bluetooth Stack:包含 Link Layer、GAP、Security Manager、ATT 和 GATT,以预编译对象文件方式提供。
- Bluetooth AppLoader:Bootloader 之后启动,验证用户应用是否有效;若无效则启动 OTA 流程接收新固件。从 SDK 4.0.x 起,EFR32[M|B]G2x 设备上的 AppLoader 已与 Gecko Bootloader 合并为通信插件。
- RAIL:Radio Abstraction Interface Layer,Bluetooth Stack 通过 RAIL 访问无线电。
应用构建流程
定义 GATT Database
使用 Simplicity Studio 的 Visual GATT Editor(图形化)或编写
.xml/.bgproj 文件(IAR 项目),定义 Bluetooth Services 和 Characteristics。项目文件结构
核心库文件
| 文件 | 说明 | 是否必选 | |
|---|---|---|---|
libbluetooth.a | Bluetooth Stack 主库 | 必选 | |
librail_efr32xgXX_gcc/iar_release.a | 对应平台的 RAIL 库 | 必选 | |
libpsstore.a | PS Store(EFR32[M | B]G1x) | Series 1 必选 |
libnvm3_CM33_gcc/iar.a | NVM3(EFR32[M | B]G2x) | Series 2 必选 |
binapploader.o | OTA AppLoader(G1x) | 可选 |
API 头文件
| 文件 | 说明 |
|---|---|
sl_bt_api.h | 完整的 Bluetooth API 声明,SoC 和 NCP 模式的单一入口文件 |
sl_bt_stack_init.h | SoC 上的 Bluetooth 特性和 API 初始化函数 |
sl_bt_types.h | Bluetooth API 数据类型定义 |
sl_bt_version.h | Bluetooth Stack 版本信息 |
sl_bt_ncp_host.h/.c | Host 应用与 BGAPI 串行协议之间的适配层 |
sl_bt_rtos_adaptation.h/.c | 在 Micrium OS 上运行 Bluetooth 的适配层 |
RTOS 支持文件
当在 Micrium OS 或 FreeRTOS 上运行 Bluetooth Stack 时,需添加以下文件:配置 Bluetooth Stack
系统初始化
Stack 配置示例
关键配置参数说明
缓冲内存(Buffer Memory)
缓冲内存(Buffer Memory)
Bluetooth Stack 使用内存缓冲 API 事件及连接/广告/扫描中传输的数据。缓冲大小由 如需提高吞吐量或使用长广告数据,可考虑增大此值。
sl_bluetooth_config.h 中的 SL_BT_CONFIG_BUFFER_SIZE 定义。最大连接数(Max Connections)
最大连接数(Max Connections)
同时进行的 Bluetooth 连接绝对最大数量为 32,内存分配进一步限制连接数:每个连接约需 RAM:约 120–200 字节(取决于协议配置)。
广告器数量(Advertisers)
广告器数量(Advertisers)
定义广告集的最大数量,同时也是定期广告的最大数量。每个广告上下文约占 60 字节 RAM:
睡眠配置(Sleep)
睡眠配置(Sleep)
EM2(Energy Mode Two)深度睡眠由 Power Manager 组件自动管理。睡眠需要精确的 32 kHz LFCLK。在运行时禁用睡眠:
按需启动(On-Demand Start)
按需启动(On-Demand Start)
通过包含 当协议栈停止时,已分配资源会被释放,适用于 DMP 场景。
bluetooth_on_demand_start 组件,允许应用按需启停 Bluetooth Stack:时钟配置
- HFCLK(高频时钟)
- LFCLK(低频时钟)
- HFRCODPLL(xG2x 系统时钟)
用于无线电协议定时器(PROTIMER),精度要求 ±50 ppm,需外部晶振(HFXO)。注意:Bluetooth Stack 仅支持 38.4 MHz 的 HFXO 频率,不支持其他频率。
Bluetooth Stack 事件处理
非阻塞事件监听
RTOS 环境下的事件监听
在 RTOS 环境中,事件处理被放在 Event Handler Task 中,该任务等待SL_BT_RTOS_EVENT_FLAG_EVT_WAITING 标志被设置后调用 sl_bt_process_event() 处理事件。
BGAPI 命令的线程安全性通过互斥量(BluetoothMutex)保障,允许从多个 RTOS 任务中并发调用 BGAPI 命令。
多任务命令发送
外设与中断处理
外部事件(External Event)
来自硬件中断的事件通过sl_bt_external_signal() 发送到 Bluetooth Stack,在主循环中通过 sl_bt_evt_system_external_signal 事件处理:
中断优先级
Bluetooth Stack 使用特定的 NVIC 中断优先级。应用程序中断必须设置为低于 Bluetooth Stack 使用的优先级,否则可能导致协议栈不稳定。Wireless Gecko 资源管理
Flash 资源
优化 Flash 使用
优化 Flash 使用
Dead Code Elimination:编译器和链接器通过消除未调用的代码减少 Flash 占用。选择性初始化:通过仅初始化所需的协议栈组件,避免包含不必要的代码。调用
sl_bt_init_stack() 后,必须分别初始化每个使用的协议栈组件:Bluetooth Bonding Database
Bluetooth Bonding Database
绑定数据库存储在非易失性存储中(PS Store 或 NVM3)。最大绑定数量:
- PS Store:最多 13 个绑定(Series 1 默认)
- NVM3:最多 32 个绑定(Series 2 默认,Series 1 可选)
sl_bt_sm_store_bonding_configuration() 设置最大绑定数量和满时策略。RAM 资源
Bluetooth Stack RAM
Bluetooth Stack RAM
Bluetooth Stack 本身约需 10–20 KB RAM,具体取决于编译配置。
连接对象池(Object Pools)
连接对象池(Object Pools)
每个并发连接约需 RAM 120–200 字节。通过
SL_BT_CONFIG_MAX_CONNECTIONS 控制最大连接数以节省内存:缓冲内存(Buffer Memory)
缓冲内存(Buffer Memory)
在
sl_bt_init_stack() 时从堆分配,大小由 SL_BT_CONFIG_BUFFER_SIZE 定义。支持多连接时的均衡调度:GATT 数据库(GATT Database)
GATT 数据库(GATT Database)
静态 GATT 数据库存储在 ROM 中,启动更快、内存占用更低;动态 GATT 数据库存储在 RAM 中,灵活但占用更多内存。
NCP Host 端编程
开发 NCP Host 应用时,需在项目中定义SL_BT_API_FULL 以包含所有 BGAPI 命令实现:
多协议支持
在多协议环境(DMP)中使用 Bluetooth Stack 时,需启用多协议特性:librail_multiprotocol_xxx.a)。
可通过自定义优先级配置优化多协议环境中的 Bluetooth 性能:
sl_bt_bluetooth_ll_priorities 结构包含扫描、广告、连接和连接启动各操作的优先级范围(0 为最高优先级,0xFF 为最低优先级)。