很高兴参加由e络盟和EEPW联合举办的“e起DIY”活动。我们在上一篇的开箱帖:【FRDM-MCXW71】开箱帖+BLE出厂程序测试 中介绍了出厂自带的蓝牙测试程序,但出厂程序是基于官方SDK开发的。本次“低功耗蓝牙温湿度计”的任务目标要求构建一个基于 Zephyr 实时操作系统的低功耗蓝牙温湿度监测设备。今天我们就简单测试一下基于Zephyr的BLE开发~
一、Zephyr基础环境
目前NXP、Nordic、ADI等各芯片厂家都针对VSCode推出了Zephyr支持插件。虽然多了一些芯片特定的图形化配置工具,但开发者每次换芯片都要装一个各自独立的Zephyr SDK环境,有点繁琐,感觉有一点点背离Zephyr跨平台的初衷。今天我们只基于统一的Zephyr IDE VSCode插件开发,以不变应万变。
为了获取最新的软件支持,我们将Global Zephyr升级到最新的4.4.0版本,下面是配置完成的VSCode Zephyr IDE画面。

二、烧写蓝牙处理器固件
在Zephyr操作系统下使用NXP FRDM-MCXW71 开发板的BLE(低功耗蓝牙)功能,有着良好的官方支持和丰富的应用生态。FRDM-MCXW71 搭载了基于双核架构的 MCX W71 无线 MCU:主核是运行应用(即 Zephyr OS)的 Cortex-M33,而独立的 Cortex-M3 无线电核心(称为 NBU,Narrow Band Unit 窄带单元)负责处理底层无线射频协议(如蓝牙 HCI 固件)。
要在 Zephyr 中启用 FRDM-MCXW71 的蓝牙功能,必须完成二进制 Blob 拉取和双核固件烧录这两个关键步骤。
A. 拉取 NXP HAL 二进制文件 (Binary Blobs)由于蓝牙底层控制器代码不开源,使用 Zephyr 编译该板卡蓝牙功能前,必须在 Zephyr 工作区执行以下命令来获取相关的 NXP HAL 库:
west blobs fetch hal_nxp下载好后,我们可以看到官方预先提供的NBU固件,我们随后烧写第一个。

为了避免大家疑惑,这里贴一下三种固件的区别。
① mcxw71_nbu_ble.sb3 (推荐选项)这是什么:纯粹的蓝牙低功耗 (BLE) 固件。
包含内容:内部只包含了 BLE 的链路层 (Link Layer) 固件,它通过标准 HCI 接口与 CM33 上的 Zephyr 蓝牙 Host 协议栈通信。
特点:因为没有包含任何 802.15.4 协议(Thread/Matter 用不到),它的 Flash/RAM 占用最小,启动最快,功耗控制也最好。这是运行纯蓝牙应用的最优选。
这是什么:BLE + IEEE 802.15.4 动态多协议并行固件。
包含内容:除了 BLE 控制器外,还包含了 IEEE 802.15.4 的底层(PHY/射频层)。dyn 代表 Dynamic Concurrent(动态并发),底层 NBU 会在 BLE 和 802.15.4 之间进行射频时间分片(Time-slicing),保证两者“同时”工作。
特点:在此架构下,802.15.4 的MAC层 (媒体访问控制层) 是交由宿主机(即运行在 CM33 上的 Zephyr 系统里的 OpenThread 等栈)用软件来实现的。如果你要开发 Matter 节点或 Thread 边界路由器,会用到这个。
这是什么:带有硬件级 MAC 的多协议并行固件。
包含内容:与上一个类似,但它将整个 802.15.4 的 MAC 层直接固化到了 NBU 固件内部。
特点:为了减轻 CM33(Zephyr)的 CPU 算力负担,或者为了满足某些严格的 MAC 层时序与认证要求,MAC 层交给了 NBU 处理。此时,Zephyr 就不能使用自带的软件 15.4 MAC 驱动了,而是必须在工程里链接那个 libieee-802.15.4_MAC_intf.a 静态库,让 Zephyr 通过核间通信(IPC)调用 NBU 里面的 MAC API。
Zephyr 应用(CM33核)和蓝牙协议栈底层(CM3核 / NBU)是分离的。每次更新大版本或初次使用时,需要向 NBU 烧录蓝牙固件。
1. 从 NXP 官网下载并安装 blhost 工具
大家一般做开发时已经安装了各种工具包,可以找找看自己是不是已经安装了(我就在电脑里找到了一堆),如图
2. 进入 ISP 模式
断开开发板的所有电源,按住板载的 SW3 按键,同时将板子通过 USB 连接到电脑,然后松开 SW3 按键,此时 MCU 会进入 ISP 模式。
3. 烧录固件
使用 blhost 命令行工具将预编译好的 NBU 固件刷入开发板,烧写过程如图。

三、BLE心率计-APP开发
因为Zephyr跨平台特性,APP开发的部分就比较通用了。我们的主核只要能够按照标准HCI协议,向蓝牙处理器发出信号即可,
本次我们选择一个BLE心率计例程跑一下,在Zephyr IDE里选择相应例程:

随后进行编译与烧录,过程日志如下:
* Executing task: west build -b frdm_mcxw71 c:\Users\Administrator\.zephyr_ide\peripheral_hr -p --build-dir c:\Users\Administrator\.zephyr_ide\peripheral_hr\build\frdm_mcxw71 -- -DBOARD_ROOT='C:\Users\Administrator\.zephyr_ide\external\zephyr' -DCONFIG_DEBUG_OPTIMIZATIONS=y -DCONFIG_DEBUG_THREAD_INFO=y -- west build: generating a build system Loading Zephyr default modules (Zephyr base). -- Application: C:/Users/Administrator/.zephyr_ide/peripheral_hr -- CMake version: 4.3.1 -- Found Python3: C:/Users/Administrator/.zephyr_ide/.venv/Scripts/python.exe (found suitable version "3.13.9", minimum required is "3.12") found components: Interpreter -- Cache files will be written to: C:/Users/Administrator/.zephyr_ide/external/zephyr/.cache -- Zephyr version: 4.4.0-rc2 (C:/Users/Administrator/.zephyr_ide/external/zephyr) -- Found west (found suitable version "1.5.0", minimum required is "0.14.0") -- Board: frdm_mcxw71, qualifiers: mcxw716c -- Found host-tools: zephyr 1.0.1 (C:/Users/Administrator/.zephyr_ide/toolchains/zephyr-sdk-1.0.1) -- Found toolchain: zephyr 1.0.1 (C:/Users/Administrator/.zephyr_ide/toolchains/zephyr-sdk-1.0.1) -- Found Dtc: C:/Users/Administrator/AppData/Local/Microsoft/WinGet/Packages/oss-winget.dtc_Microsoft.Winget.Source_8wekyb3d8bbwe/usr/bin/dtc.exe (found suitable version "1.6.1", minimum required is "1.4.6") -- Found BOARD.dts: C:/Users/Administrator/.zephyr_ide/external/zephyr/boards/nxp/frdm_mcxw71/frdm_mcxw71.dts -- Generated zephyr.dts: C:/Users/Administrator/.zephyr_ide/peripheral_hr/build/frdm_mcxw71/zephyr/zephyr.dts -- Generated pickled edt: C:/Users/Administrator/.zephyr_ide/peripheral_hr/build/frdm_mcxw71/zephyr/edt.pickle -- Generated devicetree_generated.h: C:/Users/Administrator/.zephyr_ide/peripheral_hr/build/frdm_mcxw71/zephyr/include/generated/zephyr/devicetree_generated.h Parsing C:/Users/Administrator/.zephyr_ide/external/zephyr/Kconfig Loaded configuration 'C:/Users/Administrator/.zephyr_ide/external/zephyr/boards/nxp/frdm_mcxw71/frdm_mcxw71_defconfig' Merged configuration 'C:/Users/Administrator/.zephyr_ide/peripheral_hr/prj.conf' Merged configuration 'C:/Users/Administrator/.zephyr_ide/peripheral_hr/build/frdm_mcxw71/zephyr/misc/generated/extra_kconfig_options.conf' Configuration saved to 'C:/Users/Administrator/.zephyr_ide/peripheral_hr/build/frdm_mcxw71/zephyr/.config' Kconfig header saved to 'C:/Users/Administrator/.zephyr_ide/peripheral_hr/build/frdm_mcxw71/zephyr/include/generated/zephyr/autoconf.h' -- Found GnuLd: C:/Users/Administrator/.zephyr_ide/toolchains/zephyr-sdk-1.0.1/gnu/arm-zephyr-eabi/arm-zephyr-eabi/bin/ld.bfd.exe (found version "2.43.1") -- The C compiler identification is GNU 14.3.0 -- The CXX compiler identification is GNU 14.3.0 -- The ASM compiler identification is GNU -- Found assembler: C:/Users/Administrator/.zephyr_ide/toolchains/zephyr-sdk-1.0.1/gnu/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc.exe -- connectivity_framework middleware is included. -- Looking for device MCXW716C in C:/Users/Administrator/.zephyr_ide/external/modules/hal/nxp/mcux/mcux-sdk-ng/devices/ -- Found device folder: C:/Users/Administrator/.zephyr_ide/external/modules/hal/nxp/mcux/mcux-sdk-ng/devices/MCX/MCXW/MCXW716C -- Found Python3: C:/Users/Administrator/.zephyr_ide/.venv/Scripts/python.exe (found version "3.13.9") found components: Interpreter -- Could NOT find Threads (missing: Threads_FOUND) -- Could NOT find Threads (missing: Threads_FOUND) -- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS -- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success -- Found gen_kobject_list: C:/Users/Administrator/.zephyr_ide/external/zephyr/scripts/build/gen_kobject_list.py -- Configuring done (13.5s) -- Generating done (1.0s) -- Build files have been written to: C:/Users/Administrator/.zephyr_ide/peripheral_hr/build/frdm_mcxw71 -- west build: building application [1/371] Generating include/generated/zephyr/version.h -- Zephyr version: 4.4.0-rc2 (C:/Users/Administrator/.zephyr_ide/external/zephyr), build: 41082f40fc8f [371/371] Linking C executable zephyr\zephyr.elf Memory region Used Size Region Size %age Used FLASH: 147320 B 1 MB 14.05% RAM: 28744 B 112 KB 25.06% SMU2: 40 KB 40 KB 100.00% IDT_LIST: 0 B 32 KB 0.00% Generating files from C:/Users/Administrator/.zephyr_ide/peripheral_hr/build/frdm_mcxw71/zephyr/zephyr.elf for board: frdm_mcxw71/mcxw716c * Terminal will be reused by tasks, press any key to close it. * Executing task: west flash --build-dir c:\Users\Administrator\.zephyr_ide\peripheral_hr\build\frdm_mcxw71 -- west flash: rebuilding ninja: no work to do. -- west flash: using runner linkserver RUNNER - gdb_port = 3333, semih port = 8888 -- runners.linkserver: LinkServer: D:\ProgramData\NXP\LinkServer_26.3.123\Linkserver.exe, version v26.3.123 INFO: Exact match for MCXW716CxxxA:FRDM-MCXW71 found INFO: Selected device MCXW716CxxxA:FRDM-MCXW71 INFO: Selected probe #1 M1S1E4IQCLX1J (MCU-LINK on-board (r0E3) CMSIS-DAP V3.117) INFO: MCU-Link firmware update `check`: not supported on probe ([M1S1E4IQCLX1J] [MCU-LINK on-board (r0E3) CMSIS-DAP V3.117]). Only probes running firmware V3.122 or later can be updated automatically * Terminal will be reused by tasks, press any key to close it.
四、BLE心率计-通信测试
1. IoT Toolbox应用测试(NXP应用)
我们打开在开箱帖中按照好的IoT Toolbox APP,开启手机的蓝牙与定位功能。选择 Heart Rate

随后手机会扫描到板卡的BLE广播信号,我们点击连接它。

此时页面就会开始展示心率波形,如图:

2. nRF Connect应用测试(Nordic APP)
如果我们想看看更底层的GATT Service和Characteristic,可以使用nRF Connect APP。

至此,我们就成功进行了基于Zephyr的BLE测试,接下来只要参照例程,读取并上传温湿度数据,就可以完成基础任务了~
我要赚赏金
