1. 项目背景
本次项目基于 NXP FRDM-MCXW71 开发板,设计一个低功耗蓝牙温湿度计。系统通过外接 SHTC3 温湿度传感器采集环境温度和湿度,再由 MCXW71 通过 BLE 广播和 GATT 服务将数据发送到手机端。手机端使用 nRF Connect 进行扫描、连接、读取和 Notify 自动刷新验证。
项目目标不是单纯点亮 LED 或串口打印,而是完成一个较完整的 BLE 传感器节点原型,主要实现以下功能:
FRDM-MCXW71 作为 BLE Peripheral 外设运行;
SHTC3 采集温湿度;
nRF Connect 扫描页可直接查看广播数据;
nRF Connect 连接后可通过 GATT READ 读取温湿度;
开启 Notify 后温湿度自动刷新;
加入低功耗优化思路,降低广播频率、关闭调试串口、延长采样周期,并启用低功耗框架。
2. 硬件平台与软件环境
本项目使用的主要硬件如下:
开发板:NXP FRDM-MCXW71
主控芯片:MCXW71 系列无线 MCU
传感器:SHTC3 温湿度传感器
手机端工具:nRF Connect
调试接口:板载 MCU-Link / CMSIS-DAP
通信方式:BLE Advertising + BLE GATT
开发环境:VS Code + MCUXpresso for VS Code + MCUXpresso SDK + Arm GCC + CMake + Ninja
SHTC3 与 FRDM-MCXW71 的连接方式如下:
SHTC3 VCC → 3V3 SHTC3 GND → GND SHTC3 SDA → PTB4 SHTC3 SCL → PTB5
这里需要注意一点:FRDM-MCXW71 板上的 PTB4 同时与板载蓝色 LED 相关,因此在本项目中 PTB4 被用作软件 I2C 的 SDA 后,不再建议同时用于 LED 控制,避免引脚功能冲突。
3. 开发板蓝牙固件烧录
MCXW71 这类无线 MCU 与普通 STM32 裸机开发有一个明显区别:BLE 应用不仅需要烧录主核应用程序,还需要确认无线子系统 NBU 中已经烧录了匹配 SDK 版本的 BLE Controller 固件。
如果 NBU 固件没有烧录,或者 NBU 中是 Thread、Matter、802.15.4 等其他协议固件,即使主程序编译和下载都正常,手机端也可能完全搜索不到 BLE 设备。因此,BLE 示例运行前需要先处理 NBU 固件。
本项目使用的是 BLE hosted 固件,文件名一般为:
mcxw71_nbu_ble_hosted.sb3
在本机 SDK 中,文件路径类似:
C:xxxxfrdm_mcxw71mcuxsdkmiddlewarewirelessble_controllerbinmcxw71_nbu_ble_hosted.sb3
不同 SDK 版本中目录名称可能略有差异,例如 ble_controller 或 ble-controller,实际以本地 SDK 目录为准。
使用的主要硬件如下:
开发板:NXP FRDM-MCXW71
主控芯片:MCXW71 系列无线 MCU
传感器:SHTC3 温湿度传感器
手机端工具:nRF Connect
调试接口:板载 MCU-Link / CMSIS-DAP
通信方式:BLE Advertising + BLE GATT
开发环境:VS Code + MCUXpresso for VS Code + MCUXpresso SDK + Arm GCC + CMake + Ninja
SHTC3 与 FRDM-MCXW71 的连接方式如下:
SHTC3 VCC → 3V3 SHTC3 GND → GND SHTC3 SDA → PTB4 SHTC3 SCL → PTB5
这里需要注意一点:FRDM-MCXW71 板上的 PTB4 同时与板载蓝色 LED 相关,因此在本项目中 PTB4 被用作软件 I2C 的 SDA 后,不再建议同时用于 LED 控制,避免引脚功能冲突。
3.1 安装和检查 SPSDK 工具
烧录 NBU 固件需要使用 NXP SPSDK 工具,主要用到:
nxpdevscan blhost
如果命令行中无法识别这些命令,可以在 Python 虚拟环境中安装 SPSDK:
python -m pip install --upgrade pip python -m pip install --upgrade spsdk
安装完成后检查:
where nxpdevscan where blhost nxpdevscan --help blhost --help
3.2 进入 ISP / mboot 模式
开发板进入 ISP 模式后,使用 nxpdevscan 可以扫描到 mboot 设备。例如可以看到类似信息:
Connected NXP UART Devices Port: COM3 Type: mboot device
这里的 COM 口需要以实际电脑识别结果为准。本项目中识别到的是 COM3。
可以进一步使用:
blhost -p COM3 get-property 1
如果返回 Success 和 bootloader 版本信息,说明 ISP/mboot 通信正常。
3.3 烧录 NBU BLE 固件
确认 COM 口和 SB3 文件路径后,执行:
blhost -p COM3 receive-sb-file "C:xxxxfrdm_mcxw71mcuxsdkmiddlewarewirelessble_controllerbinmcxw71_nbu_ble_hosted.sb3"
烧录过程中不要拔掉 USB、不要复位开发板、不要关闭命令行窗口。等待进度到 100% 并返回 Success。
NBU 固件烧录完成后,需要复位或重新插拔开发板,使其退出 ISP 模式。之后再通过 VS Code / MCUXpresso for VS Code 下载主程序 ELF 文件。
4. 低功耗温湿度计设计思路
本项目的总体数据链路如下:
SHTC3 温湿度传感器 → FRDM-MCXW71 采集温湿度 → BLE 广播 Manufacturer Data → 手机 nRF Connect 扫描查看 → 手机连接 BLE GATT 服务 → READ / NOTIFY 获取温湿度
系统设计时分为两条数据通道。
第一条是 BLE 广播数据通道。该方式不需要手机连接,nRF Connect 只要扫描到设备,就可以在 Manufacturer Data 中看到温湿度数据。这种方式适合低功耗节点周期性广播状态,也适合快速演示。
第二条是 BLE GATT 数据通道。手机连接设备后,可以在 GATT 服务中看到 Temperature 和 Humidity 两个特征值。通过 READ 可以读取当前值,通过 Notify 可以让设备自动推送新数据。这种方式适合需要持续观察温湿度变化的场景。
为了兼顾演示效果和低功耗,项目分为调试版和低功耗版两种配置。调试版开启串口打印、缩短广播间隔、提高 Notify 频率,方便快速验证功能;低功耗版则关闭串口日志、拉长广播周期、降低温湿度采样频率,并启用低功耗框架。
5. 设计过程
5.1 BLE Peripheral 示例选择
在 MCUXpresso SDK 中,FRDM-MCXW71 提供了多个 BLE 示例,包括 Central、Peripheral、Shell、FSCI 等。由于本项目目标是让开发板作为温湿度传感器节点,被手机 nRF Connect 扫描和连接,因此应选择 Peripheral 方向的工程,而不是 Central 工程。
最终选择的基础工程为:
wireless_examples/reference_design/lowpower_peripheral/bm
选择裸机 bm 版本的原因是:工程结构相对简单,更接近传统单片机开发流程,适合在 STM32 裸机经验基础上继续迁移学习。
5.2 SHTC3 驱动设计
SHTC3 是一款 I2C 接口的温湿度传感器,常用 7-bit 地址为 0x70。基本测量流程为:
Wakeup → 发送测量命令 → 等待转换完成 → 读取 6 字节数据 → CRC 校验 → 换算温度和湿度 → Sleep
SHTC3 读取到的是原始 ADC 数据,需要转换为实际物理量。温度和湿度的常用换算公式为:
Temperature = -45 + 175 × rawT / 65536 Humidity = 100 × rawRH / 65536
为了让 BLE 数据更容易传输,本项目没有直接传浮点数,而是采用“实际值 ×100”的整数格式。例如:
28.62 ℃ → 2862 69.51 %RH → 6951
这样只需要 2 字节就可以表达温度或湿度,既节省 BLE 数据长度,也减少浮点处理带来的复杂度。
5.3 BLE 广播数据设计
广播数据使用 Manufacturer Data 携带温湿度。数据格式设计如下:
A1 01 TT TT HH HH BB SS
含义如下:
A1 项目标识 01 协议版本 TT TT 温度,小端格式,单位 0.01 ℃ HH HH 湿度,小端格式,单位 0.01 %RH BB 电量百分比,当前为演示值 SS 数据序号
例如 nRF Connect 扫描页看到:
A1 01 2E 0B 27 1B 64 00
解析如下:
2E 0B → 0x0B2E = 2862 → 28.62 ℃ 27 1B → 0x1B27 = 6951 → 69.51 %RH 64 → 100% 00 → 序号 0
这种广播方式的优点是手机不需要连接设备,只要扫描到广播包,就能看到温湿度数据。对于低功耗传感器节点来说,这是一种非常实用的数据上报方式。
5.4 GATT 服务设计
为了让 nRF Connect 连接后也能读取和订阅温湿度,本项目在 GATT 数据库中增加了温度和湿度特征值。
自定义服务 UUID 为:
01ff0200-ba5e-f4ee-5ca1-eb1e5e4b1ce0
服务下包含两个核心特征值:
Temperature UUID: 0x2A6E Properties: READ, NOTIFY
Humidity UUID: 0x2A6F Properties: READ, NOTIFY
READ 属性用于手机主动读取当前温湿度,NOTIFY 属性用于设备主动推送温湿度变化。
nRF Connect 连接后,需要分别点开 Temperature 和 Humidity,然后点击 Notify 图标。开启 Notify 后,开发板会周期性读取 SHTC3,并将最新温湿度推送到手机端。
5.5 Notify 自动刷新设计
最初版本中,连接后虽然可以看到 Temperature 和 Humidity 特征值,但需要手动 READ 才能看到数据变化。为了实现自动刷新,需要在程序中增加周期定时器。
基本逻辑如下:
手机连接设备 → 手机开启 Temperature Notify 或 Humidity Notify → 程序启动 SHTC3 周期采样定时器 → 定时读取 SHTC3 → 更新 GATT 数据库中的温湿度值 → 如果客户端订阅了 Notify,则发送通知 → 手机 nRF Connect 自动刷新显示
在调试阶段,Notify 周期设置为 1 秒,便于快速观察数据变化。低功耗版本中,Notify 周期改为 5 秒,以降低采样频率和 BLE 通信频率。
5.6 连接保持与超时处理
NXP 原低功耗示例中存在连接超时断开逻辑,适合演示“连接一段时间后自动断开并进入低功耗”的场景。但温湿度计项目更希望手机连接后持续观察数据变化,因此需要关闭或延长连接超时。
调试过程中发现,如果只把连接超时设置为 0,而不处理相关回调函数,工程可能出现未使用函数警告。由于工程开启了 -Werror,普通 warning 会被当成 error,导致编译失败。因此需要用条件编译处理连接超时相关代码,使其在超时功能关闭时不参与编译。
处理思路如下:
#if defined(gAppConnectionTimeoutInSecs_c) && (gAppConnectionTimeoutInSecs_c > 0) static void DisconnectTimerCallback(void* pParam); #endif
函数定义部分也采用相同方式包裹:
#if defined(gAppConnectionTimeoutInSecs_c) && (gAppConnectionTimeoutInSecs_c > 0)
static void DisconnectTimerCallback(void* pParam)
{
/* 超时断开处理 */
}
#endif这样当连接超时关闭时,相关函数不会被编译,自然也不会触发 defined but not used 错误。
5.7 低功耗优化
完成基本功能后,对工程进行低功耗方向优化。主要优化点如下:
第一,关闭 Debug Console 和串口打印。调试阶段串口非常有用,但最终低功耗版本中,UART 和 PRINTF 会增加功耗,因此关闭串口日志。
第二,增大广播间隔。调试阶段为了让手机快速搜索到设备,广播间隔设置较短;低功耗版本中将广播间隔调整为约 1 秒,降低广播频率。
第三,设置广播超时。设备广播一段时间后如果没有连接,可以停止广播并进入无 BLE 活动状态,等待后续定时唤醒。
第四,降低 Notify 频率。温湿度变化通常比较慢,没有必要 1 秒刷新一次。低功耗版本中将 Notify 周期设置为 5 秒,兼顾实时性和功耗。
第五,启用低功耗框架。允许系统在 BLE 空闲间隙、广播间隙和连接间隙进入低功耗状态。
低功耗相关配置示例如下:
#define gDebugConsoleEnable_d 0 #define PANIC_ENABLE_LOG 0 #define gAppUseSerialManager_c 0 #define gAppAdvertisingInterval 1600 #define gAppAdvTimeout_c 30 #define gAppWakeUpTimerAfterNoActivityMs 10000 #define gAppLowpowerEnabled_d 1 #define gAppShtc3NotifyIntervalMs_c 5000U
需要说明的是,低功耗版本为了降低功耗默认关闭了串口打印,因此烧录后串口没有输出是正常现象。验证功能时主要依靠 nRF Connect 扫描、连接和 Notify 显示。
7. 设计结果
经过调试后,系统实现了以下结果:
FRDM-MCXW71 可作为 BLE Peripheral 运行;
手机 nRF Connect 可以扫描到设备名 MCXW71_TH;
扫描页面可通过 Manufacturer Data 查看温湿度;
手机连接后可看到自定义 GATT 服务;
GATT 服务下包含 Temperature 和 Humidity 两个特征值;
Temperature 支持 READ 和 NOTIFY;
Humidity 支持 READ 和 NOTIFY;
开启 Notify 后,温湿度可以自动刷新;
低功耗版本关闭了串口打印,降低了广播频率和 Notify 频率;
项目完成了从 BLE 固件烧录、传感器采集、广播数据组织、GATT 服务扩展到低功耗优化的完整流程。
nRF Connect 中读取到的数据仍采用小端整数格式。

文末有工程文件,再文件中添加"__repo__"文件夹即可烧录。
frdmmcxw71_lowpower_reference_design_ble_peripheral_bm.zip
我要赚赏金
