低功耗蓝牙(BLE)已成为物联网传感、可穿戴设备、智能家居的核心无线通信方案。意法半导体PM0269是官方发布的《低功耗蓝牙协议栈 v3.x 编程指南》,专为 BlueNRG-LP、BlueNRG-LPS 系列无线 MCU 定制,完整覆盖协议栈架构、API 调用、事件回调、高级特性与实战开发流程。本文基于 PM0269 原文,以嵌入式工程师实战视角拆解 BLE v3.x 协议栈开发核心要点,去掉冗余理论,直接落地可复用的开发逻辑,帮你快速完成低功耗蓝牙设备开发与调试。
资料获取:【编程手册】低功耗蓝牙协议栈 v3.x 编程指南
1. BLE 协议栈 v3.x 核心优势(对比 v2.x)
BLE v3.x 是 ST 重构后的新一代协议栈,相比 v2.x 实现全面升级,更适配蓝牙 5.x 新特性:
- 模块化架构:硬件相关代码开源,协议栈以二进制库提供,支持功能裁剪,降低 Flash 占用
- 灵活调度器:取消锚定周期限制,支持广播、扫描、连接多任务并行,无时隙分配约束
- 低延迟稳健性:优化中断延迟处理,Flash 擦写时不丢蓝牙连接,提升系统稳定性
- 全特性支持:兼容 LE 2M/Coded PHY、扩展广播、测向 (AoA/AoD)、功率控制、隐私 1.2
- 简化初始化:统一初始化接口,参数配置可视化,支持 Radio Init Wizard 工具自动生成
支持型号:BlueNRG-LP(全功能)、BlueNRG-LPS(新增测向特性)
2. BLE 核心架构:从 PHY 到 GATT 必知基础
BLE v3.x 严格遵循蓝牙 5.x 规范,分层架构清晰,开发只需关注上层 API 与回调:
2.1 物理层(PHY)三模式
- LE 1M:基础模式,强制支持,1Mbps 速率,通用场景
- LE 2M:高速模式,2Mbps 速率,适合 OTA 升级、高速数据传输
- LE Coded:长距模式,S=2(距离翻倍)/S=8(距离四倍),FEC 纠错,工业远距离场景
2.2 链路层(LL)五状态机
设备状态在待机→广播→扫描→发起→连接间切换,所有无线行为由链路层调度:
- 广播:设备对外发送广告包,等待连接
- 扫描:主动搜索周边广播设备
- 连接:主从设备建立双向通信,主设备控制时序
2.3 核心上层协议
- GAP:负责广播、扫描、连接、配对,定义设备角色(广播器 / 观察者 / 外设 / 中央设备)
- GATT:基于 ATT 协议,以服务 + 特征 + 描述符组织数据,实现读写、通知、指示
- SM:安全管理器,负责配对、绑定、加密,支持 LE 传统配对与安全连接
3. 协议栈初始化:开发第一步(核心必做)
BLE v3.x 初始化是开发关键,所有 API 调用前必须完成初始化流程:
3.1 初始化核心 API
// 1. 系统与硬件初始化
SystemInit();
BSP_IO_Init();
BLEPLAT_Init();
// 2. 协议栈参数配置(默认参数宏)
BLE_STACK_InitTypeDef params = BLE_STACK_INIT_PARAMETERS;
// 3. 协议栈初始化
BLE_STACK_Init(¶ms);
// 4. GATT/GAP初始化
aci_gatt_srv_init();
aci_gap_init(角色参数, 隐私类型, 设备名长度, 地址类型);
3.2 关键 Tick 机制
BTLE_StackTick() 是协议栈心跳,必须在主循环 while (1) 中持续调用:
- 处理协议栈状态机、事件回调、数据收发
- 执行低功耗时钟校准,保证连接稳定性
- 调用格式:
while(1) {
HAL_VTIMER_Tick();
BLE_STACK_Tick(); // 核心协议栈Tick
NVMDB_Tick();
APP_Tick();
// 低功耗模式配置
HAL_PWR_MNGR_Request(低功耗模式, 唤醒源, &停止等级);
}
4. 标准开发流程:广播→扫描→连接→配对
BLE 设备开发遵循固定流程,PM0269 提供标准化 API 与回调:
4.1 广播配置(外设设备)
// 设置广播参数
aci_gap_set_advertising_configuration(广播句柄, 可发现模式, 广播属性, 间隔, 通道);
// 设置广播数据
aci_gap_set_advertising_data(广播句柄, 数据类型, 长度, 数据);
// 启动广播
aci_gap_set_advertising_enable(ENABLE, 1, 广播参数);
4.2 扫描配置(中央设备)
// 设置扫描参数
aci_gap_set_scan_configuration(重复过滤, 过滤策略, PHY, 扫描类型, 间隔, 窗口);
// 启动发现流程
aci_gap_start_procedure(通用发现, LE_1M_PHY, 0, 0);
4.3 连接建立
扫描到目标设备后,调用连接 API:
aci_gap_create_connection(LE_1M_PHY, 地址类型, 目标地址);
连接成功触发hci_le_enhanced_connection_complete_event回调。
4.4 配对与安全
根据设备 IO 能力配置配对方式:
// 设置IO能力
aci_gap_set_io_capability(IO_CAP_DISPLAY_YES_NO);
// 设置认证要求
aci_gap_set_authentication_requirement(绑定使能, MITM保护, 安全连接, 密钥长度);
配对成功触发aci_gap_pairing_complete_event回调,自动加密链路。
5. GATT 开发:服务与特征实战
GATT 是 BLE 数据交互核心,分服务器(提供数据)与客户端(访问数据):
5.1 GATT 服务器开发
- 定义服务 UUID、特征属性、权限
- 注册服务与特征:
aci_gatt_srv_add_service(&服务结构体);
aci_gatt_srv_add_char(&特征结构体, 服务句柄);
- 处理读写事件:
- 读:aci_gatt_srv_read_event → 回复数据aci_gatt_srv_resp
- 写:aci_gatt_srv_write_event → 执行硬件控制
- 通知:aci_gatt_srv_notify → 主动推送数据
5.2 GATT 客户端开发
- 发现服务与特征:
aci_gatt_clt_disc_all_primary_services(连接句柄);
aci_gatt_clt_disc_all_char_of_service(连接句柄, 服务句柄, 结束句柄);
- 读写特征:
aci_gatt_clt_read(连接句柄, 属性句柄);
aci_gatt_clt_write(连接句柄, 属性句柄, 长度, 数据);
- 启用通知:写入 CCCD 描述符,接收服务器主动推送。
6. v3.x 高级特性:蓝牙 5.x 专属能力
PM0269 重点讲解 BLE v3.x 新增高级特性,适配高端设备需求:
1. 扩展广播:传统广播仅 31 字节,扩展广播支持255 字节负载,支持多通道、广播集,适合信标、大载荷广播。
2. 测向(AoA/AoD):BlueNRG-LPS 专属,支持到达角 / 离开角定位,精度亚米级,适用于资产追踪、室内定位。
3. LE 功率控制:动态调整发射功率,根据 RSSI 自动优化,降低功耗,提升共存性。
4. 协议栈调度优化:v3.x 取消锚定周期,支持多连接并行,预调度器自动选择最优时隙,降低冲突概率。
7. 常见问题
- Tick 未调用:主循环遗漏 BTLE_StackTick (),协议栈无响应
- 广播数据超限:传统广播数据≤31 字节,超长度导致广播失败
- 中断阻塞:长时间关中断,导致蓝牙连接断开
- 权限配置错误:GATT 特征权限与操作不匹配,读写失败
- 低功耗配置错误:未配置唤醒源,设备进入深度睡眠后无法唤醒
- 配对密钥丢失:未保存绑定信息,重连后需重新配对
PM0269 是 BlueNRG-LP/LPS 系列 BLE v3.x 开发的官方实战手册,覆盖从基础初始化到高级特性的全流程开发。BLE v3.x 凭借模块化架构、灵活调度、全特性支持,成为低功耗蓝牙设备开发的最优选择。
遵循初始化→广播 / 扫描→连接→配对→GATT 数据交互的标准化流程,配合协议栈 Tick 机制与事件回调,即可快速开发出稳定、低功耗、符合蓝牙规范的 BLE 设备。无论是入门级传感设备,还是高端定位、长距通信产品,本文要点均可直接复用。
177