BlueNRG-LP 这颗芯片我拿到手后的第一个感觉是:它把料堆得非常“稳”。作为 ST 在低功耗蓝牙 SoC 上的重点产品,它不仅仅是一个 BLE 收发器,而是一颗完整的 Cortex-M0+ 内核 MCU,射频、协议栈、Flash、RAM 全部集成在一起。很多朋友第一次拿到 BlueNRG-LP 或 BlueNRG-LPS 评估板时会有点懵——板子插上电,手机看不到广播,例程也编译不过,然后就开始怀疑硬件坏了。其实大部分时候不是板子的问题,而是“开启”这一步没有理顺。这篇应用笔记就围绕“如何开启 BlueNRG-LP / BlueNRG-LPS 设备”这条主线,从硬件准备、软件环境、例程编译烧录,到广播调试、低功耗配置和常见问题排查,完整记录一遍实操过程。适合第一次接触这个系列的硬件工程师、嵌入式开发者,以及想评估这颗芯片适合不适合自己项目的朋友。
1. 开工之前先认清:BlueNRG-LP 系列到底是什么定位
1.1 一颗自带射频前端的蓝牙 SoC,而不是单纯的蓝牙芯片
很多从传统 MCU 方案转过来的朋友,第一反应是“BlueNRG-LP 是不是一个需要外部 MCU 驱动的蓝牙模块”。这其实是个很大的误区。BlueNRG-LP 内部跑的是 Cortex-M0+ 内核,最高可以到 64MHz,Flash 最大 256KB,RAM 最大 64KB,2.4GHz 射频收发前端、Balun 匹配、BLE 协议栈全部集成在芯片内部。
也就是说,你的应用主程序可以直接写在 BlueNRG-LP 里,不需要再挂一颗 STM32 或者别的单片机。这和以前常见的“MCU + 蓝牙透传模块”方案有本质区别:外围简单、成本更低、功耗更容易做下来,因为协议栈和业务逻辑跑在同一颗芯片上,通信开销小很多。
当然,如果你愿意,也可以把它当作一个专用协处理器,用另一颗 MCU 通过 SPI/UART 和它通信。但从我实际测试下来的感受看,既然协议栈支持 GATT、GAP、L2CAP,还提供了那么多 profile 例程,直接用单芯片方案是最省事的。尤其是做 Beacon、传感器节点、HID 设备这类对功耗和成本都敏感的产品,单芯片几乎是唯一最优解。
1.2 BlueNRG-LP 和 BlueNRG-LPS 到底有什么区别
BlueNRG-LPS 是 BlueNRG-LP 的后续增强版,两者封装和引脚在多数情况下是兼容的,但有几个关键点需要你在选型阶段就想清楚,否则后面改版很痛苦。
| 对比项 | BlueNRG-LP | BlueNRG-LPS |
|---|---|---|
| 蓝牙版本 | BLE 5.x | BLE 5.3,协议特性更完善 |
| 内核/主频 | Cortex-M0+ 最高 64MHz | 同样 Cortex-M0+ 架构 |
| Flash/RAM | 最高 256KB / 64KB | 同级别容量,具体以型号后缀为准 |
| 射频性能 | 发射功率可调,接收灵敏度优秀 | 在 LP 基础上进一步优化,支持更灵活的广播扩展 |
| 适用场景 | 大多数 BLE 产品开发 | 对协议新特性、互操作性要求更高的新产品 |
我个人的建议是:如果是全新设计,直接选 BlueNRG-LPS;如果是维护老项目或者 Pin-to-Pin 替换,BlueNRG-LP 也不是不行,但要注意内部固件和 SDK 版本差异。LPS 的 SDK 包和 LP 并不是完全同一套,编译时选错型号会出现很多奇怪的问题。
1.3 典型应用场景,帮你快速对号入座
这个系列的芯片最常见的落地场景有这么几类:第一类是 Beacon 和室内定位标签,主打极低功耗和广播稳定性;第二类是穿戴设备和医疗传感器,比如血氧仪、运动手环,需要长时间运行而且对体积敏感;第三类是智能家居里的门锁、灯泡、窗帘电机,配合 BLE Mesh 使用;第四类是 HID 设备,比如低功耗键盘鼠标。
如果你手上的项目恰好落在这些方向里,BlueNRG-LP 系列的 SDK 里基本都有对应例程可以参考,不需要从零造轮子。这也是我喜欢用这颗芯片的原因之一——原厂把基础工作做得比较扎实,你只需要关注业务逻辑。
2. 开启前的准备:硬件、软件工具链一次装齐
2.1 硬件准备,评估板还是自己画板
如果你只是想做技术评估,最省事的方法是买官方开发板,名字通常叫 BlueNRG-LP DK 或者 BlueNRG-LPS DK。这类板子自带 ST-LINK/V3 调试器、天线、晶振、按键和 LED,出厂还会烧好一个默认例程。上电之后用手机装一个 ST BLE Toolbox,扫码就能看到广播,基本是零门槛验证芯片好坏。
如果是自己画板子,要特别注意几个地方:
- 天线部分:必须要预留 π 型匹配网络,天线走线要尽量短,净空区域要按数据手册要求留足。我看到很多工程师自己画板子蓝牙连不上,最后发现是天线匹配没做。
- 晶振:BlueNRG-LP 需要外部高速晶振(典型值 32MHz)和可选的外部 32.768kHz 低速晶振。如果想把待机功耗做到很低,低速晶振基本不能省。
- 电源去耦:射频电路对电源纹波敏感,建议在 VDD 引脚附近放 1μF 和 100nF 电容组合。
- SWD 调试接口:预留标准 4 线 SWD,后期调试和量产烧录都要用。
从我的经验看,第一次评估不要一上来就自己画板。先用官方评估板把软件流程跑通,确认这款芯片的功耗和射频满足需求,再画自己的最小系统板,能省下非常多排查硬件问题的时间。
2.2 软件工具链,按这个清单装就不会漏
软件环境这块,最容易踩的坑是“装上 IDE 但找不到 SDK”。BlueNRG-LP 系列的开发必须要先安装对应 SDK 包,ST 官方的软件包名称类似 STSW-BNRGLP-DK,在 ST 官网搜索“BlueNRG-LP DK”就能找到。SDK 里包含了协议栈库、驱动、例程、文档,是整个开发的核心。
常用工具清单如下:
- 集成开发环境(IDE):STM32CubeIDE 可以用,但注意 BlueNRG-LP 的 SDK 例程早期版本对 CubeIDE 支持不如 Keil/IAR 完善。如果编译遇到玄学问题,可以先换 Keil MDK 试试。
- STM32CubeProgrammer:用于烧录、读取芯片信息、配置选项字节。STM32 用户应该很熟悉,BlueNRG-LP 也用它烧录。
- 手机 App:ST BLE Toolbox 和 ST BLE Profiler,前者用来扫描广播、连接读写 GATT,后者用来查看服务和特征值,建议两个都装。
- 串口调试助手:例程中很多日志通过 UART 输出,准备一个 USB-TTL 模块。
还有一个很多人忽略的细节:安装 SDK 之前,最好把电脑上的杀毒软件退出,或者至少加入信任区。SDK 里的例程工程文件结构比较复杂,有些杀毒软件会误删文件导致工程损坏。
2.3 第一次整体流程,先建立一个完整概念
“开启”BlueNRG-LP 设备这件事,说白了三步:选对工程、下载固件、看到广播。在我手把手带新人时,通常会让他们先定一个非常小的目标:用官方例程改一下设备名,然后让手机扫到它。完成这一步,整个工具链就通了,后面的 GATT 服务、OTA、低功耗都是在这个基础上做增量。
接下来的章节,我就以这个最小目标为例子,详细拆开每一步怎么操作。
3. 实战跑起来:编译、烧录、手机扫到广播
3.1 从 SDK 里挑选一个合适的例程
打开 SDK 目录后,你会看到类似projects或者examples的文件夹,里面按芯片型号和开发板分目录。我建议先用带 “peripheral” 或 “beacon” 关键字的例程。
以 Beacon 例程为例,它做的事情非常纯粹:上电后以固定间隔发送广播包,不需要连接。这是验证射频和协议栈是否正常的最快路径。另一个值得选的是 sensor 或 health thermometer 例程,它会创建 GATT 服务,手机连接后可以读到模拟数据,适合用来理解 GATT 架构。
需要特别注意,每个例程目录下可能针对不同开发板分了几个子工程。导入工程前,先确认你的开发板型号和目录名一致。我见过有人拿 LP 的例程硬编译 LPS 的板子,报错一屏,其实根因就是型号选错了。
3.2 编译工程,处理几个常见报错点
在 IDE 里打开工程后,第一步是选择目标芯片型号。BlueNRG-LP 和 BlueNRG-LPS 在 IDE 里的器件列表中都能搜到,具体名字带不带 S 后缀要看 SDK 版本。
编译时最常见的两个问题:
第一个是Fatal error: device not found之类的错误。这通常不是代码问题,而是 IDE 配置的器件型号和实际芯片不一致。重新检查 Device 选项,或者直接打开 SDK 推荐使用的工程模板。
第二个是头文件路径缺失。SDK 例程里一般已经把路径配置好了,但如果你新建了工程,忘记添加协议栈相关的 include 目录,会报一堆如ble_xxx.h not found的错误。解决办法是把 SDK 里的Library和Drivers相关目录都加进 include path。
如果编译能通过,生成的是.hex或者.bin文件,这个文件就是要烧录到芯片里的固件。
3.3 烧录固件,两步搞定
烧录方式我推荐优先用 STM32CubeProgrammer,因为界面直观、报错信息也比较友好。
具体步骤:
- 用 USB 线连接开发板上的 ST-LINK 接口,电脑识别到调试器。
- 打开 STM32CubeProgrammer,选择 ST-LINK,点击 Connect。
- 如果不能连接,先检查驱动是否安装,并在烧录软件里把连接速度从默认的 4MHz 降到 1MHz 再试(这能解决 80% 的连接失败问题)。
- 连接成功后,加载刚才编译出来的 hex/bin 文件,点击 Download。
- 断电重新上电,程序开始运行。
我个人习惯是每次烧录完成后都会重新上电一次再测试。原因很简单,很多蓝牙例程在复位瞬间会重新初始化协议栈,强制断电重启能确保芯片状态是干净的。
3.4 手机验证:看到广播才算真正“开启”
固件烧进去之后,打开手机上的 ST BLE Toolbox,打开蓝牙,进入扫描页面。正常情况下几秒内就能看到以例程设备名广播的设备。如果扫描不到,先别急着怀疑硬件,按后面第 5 章里的排查清单走一遍。
扫到设备之后,可以点进去看看广播内容里的服务 UUID 和设备名。Beacon 例程通常会广播一个自定义的 UUID,这就说明协议栈已经在工作了。到了这一步,你的 BlueNRG-LP 设备就算是真正“开启”了,后面的开发就是在它基础上做应用逻辑。
4. 关键配置深入:广播参数、连接参数和低功耗设计
4.1 广播配置不将就:设备名、间隔、载荷都要明白
广播是 BLE 设备存在的证明,也是很多问题的来源。SDK 例程里会有一小段代码专门做广播配置,核心参数是广播间隔、广播类型和广播数据。
举个例子,配置广播间隔时,如果设成 100ms,那么设备每秒大概发 10 个广播包。这个值越小,手机扫描到设备越快,但功耗越高。Beacon 类产品通常会把间隔放在 100ms 到 1s 之间,而需要快速配网的产品会先用一个短间隔广播,连接后再切换成长间隔。
广播数据包括设备名、服务 UUID、厂商自定义数据等。要注意广播包和扫描响应包的最大长度是固定的 31 字节,如果又放设备名又放 Service UUID 又放厂商数据,很容易超出。SDK 里一般提供了更新广播数据的接口,你需要自己按 AD Structure 格式拼 buffer。新手常犯的错误是在广播数据里放了超长字符串,后果是手机抓包工具能看到广播,但设备名显示不出来。
4.2 连接参数:连接间隔、从机延迟和超时
设备能被连接之后,主机(手机)会发起连接参数请求。这个过程中,从机可以通过更新连接参数请求来优化功耗和响应速度。
连接间隔越长功耗越低,但数据延迟越大。从机延迟(Slave Latency)允许从机在连续几个连接事件里不监听主机,能进一步省电,但代价是双向通信延迟变大。超时时间(Supervision Timeout)则要在连接间隔和从机延迟的基础上留足余量,至少是两者的乘积乘以 2 以上,否则会出现莫名断连。
我的建议是:先按手机默认的连接参数跑通功能,之后在做功耗优化时再调这些值。调试时可以用 ST BLE Toolbox 查看当前实际协商出来的连接参数,再和代码里设置的对比,确认有没有被主机拒绝。
4.3 低功耗设计,硬件和代码要一起配合
BlueNRG-LP 的待机功耗能做到微安级别,但这不是单靠芯片就能实现的。代码层面需要进入合适的低功耗模式。通常 SDK 提供了 sleep 管理的接口,在协议栈空闲时让 CPU 进入低功耗状态,并在需要时由定时器或外部中断唤醒。
硬件层面上,影响功耗最大的变量是外部 32.768kHz 低速晶振。如果省掉这颗晶振,芯片内部会使用高速晶振分频来维持低功耗时的时钟,功耗会明显升高。所以对功耗有要求的项目,这颗晶振一定要保留。
另外,GPIO 的状态也会影响功耗。未使用的引脚如果悬空,会产生漏电流。产品设计时最好把不用的引脚设置成模拟输入或者固定电平,这也是很多人发现“明明进了 sleep 功耗还是高”的隐藏原因。
5. 常见问题与排查技巧实录
5.1 手机扫描不到设备,先按顺序查这几项
这个问题的出现概率极高,我把排查顺序按可能性从高到低列一个清单,你按顺序走一遍基本能定位。
| 排查项 | 具体操作 | 备注 |
|---|---|---|
| 供电是否正常 | 测量 VDD 引脚电压 | 射频工作时电流峰值大,劣质 USB 线会拉低电压 |
| 晶振是否起振 | 用示波器看 32MHz 晶振 | 如果不起振,协议栈跑不起来 |
| 程序是否运行 | 查看 UART 日志或翻转 GPIO | 确认代码没有死在初始化 |
| 广播参数 | 检查代码里是否真的调用了广播启动函数 | 有些例程默认不自动启动广播 |
| 手机蓝牙缓存 | 关闭再打开手机蓝牙,或重启 App | Android 蓝牙缓存经常导致扫描不到 |
| 天线/匹配 | 评估板上确认天线区域没有被遮挡 | 手不要直接握在天线附近 |
特别提一个容易忽略的坑:如果你同时给两块同型号的板子烧录了相同程序,手机可能会只显示其中一台设备,因为设备地址相同。排查时先关掉另一块板的电源。
5.2 能扫描到但连接秒断,大概率是射频和电源问题
能扫到说明广播这条链路是通的,但建立连接对射频质量的要求更高好,连接后立刻断最常见的原因是信号强度不够,表现为 RSSI 在 -80dBm 左右徘徊。处理办法是检查天线匹配和走线,不要在金属外壳里测试。
另外,电源跌落也是一个隐蔽因素。BLE 连接事件发射瞬间电流会比广播更高,如果板载 LDO 带载能力不足,复位或者射频失锁就会导致断连。排查时用示波器看发射瞬间的 VDD 波形,如果有明显跌落,加大电源电容或者换更好的 LDO。
5.3 烧录失败或者说无法连接调试器
下载程序时报No ST-LINK detected或者Cannot connect to target,先确认调试器驱动安装正常。然后是接线,如果是自制的 SWD 接口,注意 SWDIO 和 SWCLK 不要接反,GND 必须共地。
还有一个技巧:如果芯片里已经跑了一个把 SWD 引脚复用的程序,调试器可能连不上。这时可以让芯片进入复位状态,在复位解除的瞬间点击连接,或者使用 STM32CubeProgrammer 的 under-reset 模式强制连接。
5.4 实测功耗远高于数据手册,从哪里下手
遇到这种问题,先确认测量方式。数据手册的微安级功耗通常是在没有外设、没有调试器连接、使用内部 LDO/DC-DC 特定配置下测出来的。你带着 ST-LINK 上电,板载调试器本身就在耗电,测出来的值当然不对。量产功耗评估要单独给板子供电,用外接万用表或功耗分析仪测 VDD。
代码层面,进入低功耗前要关闭所有不用的外设,关掉打印,把 GPIO 配置成合适的状态。另外,如果使能了 DC-DC 转换器,要注意电感是否符合要求,否则功耗优化也是空谈。
6. 从“能跑”到“好用”:后续可以这样扩展
设备能广播、能连接,只是第一步。真正要把一个产品做完,还有几个方向值得投入精力。
第一个是 GATT 服务设计。BLE 应用里核心是 Service 和 Characteristic 的组织,比如定义一个电量服务、一个数据上报服务。SDK 里提供了服务注册和事件回调的接口,建议先仿照例程里的自定义服务模板,把收发逻辑跑通。
第二个是 OTA 升级。量产产品基本逃不掉固件空中升级。BlueNRG-LP 系列有 OTA 例程可以参考,但要注意 Flash 分区和 Bootloader 的设计,这部分一定要在项目早期就规划好,否则后面要重构。
第三个是量产烧录。芯片进入量产阶段后,需要准备产线烧录方案。可以在 STM32CubeProgrammer 里做命令行脚本,配合治具实现一键烧录,同时把唯一设备地址和校准数据写进去。产线上最容易出问题的是烧录速度,建议提前做验证。
我个人在实际项目中的体会是:BlueNRG-LP 系列的学习曲线比很多 BLE 方案陡一些,因为它的协议栈 API、内存管理、低功耗编程都需要仔细读文档。但一旦把环境搭好、第一个例程跑通,后面你会发现这颗芯片的调试体验和稳定性都相当不错。最后再分享一个小技巧:把 SDK 里的 Release Notes 和芯片勘误表打印一份放手边,遇到怀疑是芯片 bug 的问题时先翻一翻,有几次我排查了半天,最后发现是官方勘误表里早就列出来的已知问题。磨刀不误砍柴工,这比其他经验都管用。