
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 内核最高可以到 64MHzFlash 最大 256KBRAM 最大 64KB2.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-LPBlueNRG-LPS蓝牙版本BLE 5.xBLE 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 里包含了协议栈库、驱动、例程、文档是整个开发的核心。常用工具清单如下集成开发环境IDESTM32CubeIDE 可以用但注意 BlueNRG-LP 的 SDK 例程早期版本对 CubeIDE 支持不如 Keil/IAR 完善。如果编译遇到玄学问题可以先换 Keil MDK 试试。STM32CubeProgrammer用于烧录、读取芯片信息、配置选项字节。STM32 用户应该很熟悉BlueNRG-LP 也用它烧录。手机 AppST 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确认代码没有死在初始化广播参数检查代码里是否真的调用了广播启动函数有些例程默认不自动启动广播手机蓝牙缓存关闭再打开手机蓝牙或重启 AppAndroid 蓝牙缓存经常导致扫描不到天线/匹配评估板上确认天线区域没有被遮挡手不要直接握在天线附近特别提一个容易忽略的坑如果你同时给两块同型号的板子烧录了相同程序手机可能会只显示其中一台设备因为设备地址相同。排查时先关掉另一块板的电源。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 的问题时先翻一翻有几次我排查了半天最后发现是官方勘误表里早就列出来的已知问题。磨刀不误砍柴工这比其他经验都管用。