1 · 文档导读与阅读路径
这份文档面向已经会写 C、但第一次接触 Nordic 生态的嵌入式工程师。它不假定你用过 Zephyr,也不假定你用过 nRF5 SDK;从「买哪块板子」一路写到「怎么过认证、怎么量产烧录」。
1.1 覆盖范围
文档覆盖 Nordic 短距离无线 SoC 的五代产品:nRF51(Cortex-M0,已 NRND)、nRF52(Cortex-M4F,出货量最大的一代)、nRF53(双核 Cortex-M33)、nRF54L(22 nm 低功耗主力)、nRF54H(320 MHz 多核高性能)。软件侧以 nRF Connect SDK(NCS)为主线,同时给出遗留 nRF5 SDK + SoftDevice 的对照与迁移路径。
- 硬件:选型对比、封装与料号命名、电源与时钟架构、GPIO/DPPI/EasyDMA。
- 工具链:nRF Util、nRF Connect for Desktop、nRF Connect for VS Code、west / CMake / Kconfig / Devicetree / sysbuild。
- 驱动:Zephyr 设备模型下的 GPIO、UART、SPI、TWI、PWM、SAADC、RTC。
- 无线:蓝牙 LE(GAP/GATT、广播、连接、安全、PHY、Mesh、LE Audio、Channel Sounding)、Thread / Zigbee / Matter、ESB、NFC。
- 工程化:低功耗设计与 PPK2 实测、安全启动链、DFU/FOTA、调试与测试、量产烧录、认证合规。
1.2 不覆盖什么
- 不覆盖 nRF91 系列(蜂窝 LTE-M / NB-IoT)与 nRF70 系列(Wi-Fi 协同 IC)的完整开发流程,只在需要协同的章节提到接口。
- 不重复 Zephyr RTOS 的通用内核教程(线程、信号量、工作队列等),只在影响 Nordic 开发的地方给出最小必要说明。
- 不给原理图级射频匹配网络的完整计算过程,天线与匹配请查对应 Reference Layout 与产品规范。
- 不提供法律意义上的认证建议,第 18 章只给流程与清单。
1.3 版本标注约定
Nordic 的软件版本迭代很快,文档里出现的版本号按下面约定理解:
| 写法 | 含义 | 本文取值 |
|---|---|---|
| NCS 3.4.x | nRF Connect SDK 版本。3.4.0 是首个 LTS,基于 Zephyr 4.4 | 主线行文按 3.4.x |
| nrfutil 7.x | 新版 nRF Util(原生二进制 + 插件架构),与旧版 pip 安装的 6.x 完全不兼容 | 命令行全部按 7.x |
| nRF5 SDK 17.1.1 | 遗留 SDK 终版,维护模式 | 仅在第 19 章出现 |
| SoftDevice S1x0 | 遗留协议栈固件(S112/S113/S132/S140 等) | 仅在第 19 章对照 |
| SoftDevice Controller | NCS 里的 BLE 控制器(由原 SoftDevice 拆出) | 第 10 章起 |
1.4 事实来源与免责
文中所有规格数字来自 Nordic 官网产品页与 docs.nordicsemi.com 技术文档(含 nRF Connect SDK、Zephyr、MCUboot、Trusted Firmware-M 文档集)。电流、灵敏度、发射功率等参数随芯片版本与测试条件变化,量产前必须以所用器件的最新《Product Specification》为准。文中给出的命令与 Kconfig 选项在 NCS 3.4.x 上验证,跨版本可能有改名(尤其是 SB_CONFIG_* 前缀与 sysbuild 相关项)。
1.5 五条阅读路径
如果你手上已经有 nRF52840 DK 或 nRF54L15 DK,可以直接按路径 A 动手;没有板子也不影响阅读,第 4 章的命令与第 6 章的代码都不依赖硬件,第 13 章的功耗数据可以直接抄去做预算。
2 · nRF5 系列全景与选型
Nordic 的短距离无线 SoC 走了五代:nRF51 打开局面,nRF52 出货数十亿,nRF53 首次引入双核,nRF54L 把工艺推到 22 nm,nRF54H 则把性能堆到 320 MHz。这一章把五代放在一张表里对比,并给出选型决策依据。
2.1 五代产品时间线
从架构演进的角度看,Nordic 三十年只做一件事:把「MCU + 射频 + 协议栈」塞进一颗越来越省电的芯片里。每一代的核心变化如下:
| 系列 | 代表型号 | CPU | 关键跃迁 | 当前状态 |
|---|---|---|---|---|
| nRF51 | nRF51822 / nRF51422 / nRF51824 | Cortex-M0 16 MHz | 首次把 BLE + ANT 协议栈做成可升级的 SoftDevice 固件 | NRND |
| nRF52 | nRF52832 / nRF52840 / nRF52833 / nRF52820 / nRF52811 / nRF52810 / nRF52805 | Cortex-M4F 64 MHz | 引入 FPU、EasyDMA 全外设、NFC、USB(52840)、802.15.4 | NCS 3.4.0 起功能完整 |
| nRF53 | nRF5340 | 双核 Cortex-M33 128 MHz + 64 MHz | 应用核 / 网络核分离、TrustZone、105 °C 扩展温区 | 主流 |
| nRF54L | nRF54L15 / L10 / L05 / LM20A | Cortex-M33 128 MHz + RISC-V FLPR | 22 nm 低漏电、Global RTC(System OFF 可跑)、KMU 密钥管理 | 新项目首选 |
| nRF54H | nRF54H20 | 多核 Cortex-M33 最高 320 MHz + 多 RISC-V | 高速 USB 480 Mbps、CAN FD、IronSide 安全隔离区 | 高性能旗舰 |
来源:Nordic Semiconductor 产品页(nRF51/nRF52/nRF53/nRF54L/nRF54H20)与产品规范摘要。
2.2 nRF51 系列:SoftDevice 思路的起点
nRF51 是 Nordic 打进 BLE 市场的第一代产品,已标记 NRND(Not Recommended for New Designs),但存量极大,维护旧产品时仍会遇到。
| 型号 | Flash / RAM | 协议 | 配套 SoftDevice | 说明 |
|---|---|---|---|---|
| nRF51822 | 256/128 KB / 32/16 KB | BLE 4.2 | S110 / S120 / S130 | 通用型,最经典的入门料号 |
| nRF51422 | 256/128 KB / 32/16 KB | BLE + ANT | S210 / S310 | nRF51822 加 ANT 协议栈 |
| nRF51824 | 256 KB / 16 KB | BLE 4.2 | S110 / S120 / S130 | AEC-Q100 Grade 2 车规级 |
nRF51 的硬件特征:Cortex-M0 @16 MHz、10-bit ADC、16 通道 PPI、31 个 GPIO、128-bit AES ECB/CCM/AAR 协处理器、片内 LDO 与 Buck DC/DC 两种稳压模式。射频侧 250 kbps / 1 Mbps / 2 Mbps,发射功率 +4 dBm 起(4 dB 步进可调至 −20 dBm)。
除了 NRND 状态,更现实的问题是:nRF51 只在遗留 nRF5 SDK 里有完整支持,NCS 里仅保留 nrf51dk/nrf51822 与 nrf51dongle 两个板级目标用于兼容,没有新的特性开发。要做 BLE 4.2 级别的简单产品,nRF52805 / nRF52810 是更小更便宜的替代。
2.3 nRF52 系列:出货量最大的一代
nRF52 全系 Cortex-M4F @64 MHz,外设带 EasyDMA,配 Nordic 的 PPI(可编程外设互连)。差异集中在 Flash/RAM 容量、USB、802.15.4 与 Coded PHY(Long Range)上。
| 型号 | Flash | RAM | USB | 802.15.4 | Coded PHY | TX 功率 | 定位 |
|---|---|---|---|---|---|---|---|
| nRF52840 | 1 MB | 256 KB | 有 | 有 | 有 | +8 dBm | 旗舰,QSPI + CryptoCell-310 + NFC + USB |
| nRF52833 | 512 KB | 128 KB | 有 | 有 | 有 | +8 dBm | 105 °C 扩展温区,专业照明 |
| nRF52832 | 512/256 KB | 64/32 KB | 无 | 无 | 无 | +4 dBm | 通用主力,出货量最大 |
| nRF52820 | 256 KB | 32 KB | 有 | 有 | 有 | +8 dBm | 带 USB 的低成本款 |
| nRF52811 | 192 KB | 24 KB | 无 | 有 | 有 | +4 dBm | 带测向的小封装 |
| nRF52810 | 192 KB | 24 KB | 无 | 无 | 无 | +4 dBm | 入门 |
| nRF52805 | 192 KB | 24 KB | 无 | 无 | 无 | +4 dBm | 最精简 |
关键提醒:nRF52832 的射频不支持 IEEE 802.15.4,所以跑不了 Thread / Zigbee;而 nRF52811 虽然只有 24 KB RAM,却是少数带 802.15.4 + Coded PHY 的小封装料号。24 KB RAM 跑完整 Zephyr + BLE 非常紧,做 OTA 双分区基本不可能。
2.4 nRF53 系列:双核分离的第一次尝试
nRF5340 把「跑应用的核」和「跑协议栈的核」物理分开,这是 Nordic 应对「应用代码越来越复杂、协议栈必须实时」的架构答案。
| 核心 | CPU | Flash | RAM | 职责 |
|---|---|---|---|---|
| 应用核(Application Core) | Cortex-M33 128 MHz + FPU + DSP | 1 MB | 512 KB | 用户应用、外设、业务逻辑 |
| 网络核(Network Core) | Cortex-M33 64 MHz | 256 KB | 64 KB | 蓝牙 LE 控制器、802.15.4、多协议调度 |
其他特征:TrustZone 隔离、Arm CryptoCell-312、USB 2.0、QSPI(支持 XIP 执行外部 Flash)、HS-SPI、105 °C 扩展温区、1.7–5.5 V 供电范围。双核也带来调试复杂度——要调试网络核必须开两个调试会话(详见第 16 章)。
2.5 nRF54L 系列:当前新项目首选
nRF54L 是 nRF52 的官方接班人。相比 nRF52840,官方口径是处理能力翻倍、处理效率三倍,同时把工艺推到 22 nm 低漏电节点。
| 项目 | nRF54LM20A | nRF54L15 | nRF54L10 | nRF54L05 |
|---|---|---|---|---|
| CPU | 128 MHz Arm Cortex-M33 | |||
| NVM | 2 MB | 1.5 MB | 1.0 MB | 0.5 MB |
| RAM | 512 KB | 256 KB | 192 KB | 96 KB |
| 蓝牙 LE / Channel Sounding | 有 / 有 | 有 / 有 | 有 / 有 | 有 / 有 |
| Mesh / Zigbee / Thread | 有 | 有 | 有 | 有 |
| Matter / Sidewalk / Wi-Fi 协处理器 | 有 / 有 / 有 | 有 / 有 / 有 | 有 / 有 / — | 有 / — / — |
| TX 功率 | +8 dBm | +8 dBm | +7 dBm | +7 dBm |
| 灵敏度(BLE / 802.15.4) | −96 dBm / −101 dBm | |||
| 数字接口 | HS-USB + HS-SPI/UART + 6×SPI/UART/TWI + PDM/TDM | HS-SPI/UART + 4×SPI/UART/TWI + PDM + I²S | ||
| ADC | 8 通道,最高 14 bit,最高 2 MS/s | |||
| 协处理器 | 128 MHz RISC-V FLPR(可跑 SoftPeripherals) | |||
| 隔离 / 安全 | TrustZone + 篡改检测 + 抗侧信道加密加速器 | |||
| 工作温度 | −40~+85 °C | −40~+105 °C | −40~+105 °C | −40~+105 °C |
| 封装 | CSP98 / QFN52 | CSP47 / QFN52 / QFN48 / QFN40 | QFN52 / QFN48 / QFN40 | QFN52 / QFN48 / QFN40 |
三者在 QFN 封装上引脚对引脚兼容,意味着同一块 PCB 可以从 L05(0.5 MB / 96 KB)一路升到 L15(1.5 MB / 256 KB),不用改板。这是成本敏感型产品做「同平台多档位」的关键设计余量。
性能亮点(官方 @3 V 数据):193 CoreMark/mA、503 CoreMark;射频 RX 3.4 mA、TX @0 dBm 4.8 mA;睡眠电流 0.7 µA 起(System OFF,无 RAM 保持)到 2.9 µA;CSP 封装 +8 dBm / QFN 封装 +7 dBm。
2.6 nRF54H 系列:高性能旗舰
nRF54H20 的目标场景是「原来需要外挂 MCU + 外部 Flash + 无线 SoC」的复杂产品。它把多个 Cortex-M33 和多个 RISC-V 协处理器塞进一颗 4.7×4.3 mm 的 WLCSP。
- 算力:多核 Cortex-M33 最高 320 MHz,多 RISC-V 协处理器;应用核算力是 nRF5340 应用核的两倍。EEMBC ULPMark-CoreMark:效率取向 515 CoreMark / ULPMark-CM 170,性能取向 1290 CoreMark / ULPMark-CM 132。
- 存储:2 MB NVM + 1 MB RAM。
- 射频:第 4 代 2.4 GHz 多协议射频,BLE 1 Mbps 灵敏度 −99 dBm,802.15.4 −104 dBm,TX 最高 +10 dBm,RX 电流低至 1.7 mA(3 V,DC/DC)。
- 接口:高速 USB 480 Mbps、CAN FD 控制器、2× I3C、14-bit ADC、高性能外部存储接口(400 MBps,支持 XIP / QSPI / xSPI / HyperBus)。
- 安全:面向 PSA Certified Level 3 设计,IronSide Secure Enclave 隔离安全区、防篡改传感器、抗侧信道加密加速器。
它使用 SUIT(Software Updates for Internet of Things) 作为更新架构,且必须先完成供应(provisioning)——写入 Secure Domain Firmware(SDFW)与 System Controller Firmware(SCFW),并设置正确的 lifecycle state,应用固件才会运行。只烧一个 zephyr.hex 上去板子毫无反应,这是新手最常见的「板子坏了」误判。详见第 15.7 节。
2.7 横向选型速查
选型决定后立刻要面对的三件事:4 · 装环境13 · 做功耗预算18 · 过认证。若是从老项目迁移,先看 19 · 迁移路径。
| 场景 | 首选 | 备选 | 决策依据 |
|---|---|---|---|
| 新建 BLE 传感器 / 信标 | nRF54L05 / L10 | nRF52810 | 成本优先,BLE 广播类应用不需要大 RAM |
| 新建 BLE 可穿戴 / 需要 OTA | nRF54L15 | nRF52840 | 双分区 DFU 至少要保证 256 KB 级 Flash 余量 |
| Matter / Thread / Zigbee 网关节点 | nRF54L15 / LM20A | nRF52840 | 802.15.4 + BLE 并发,协议栈 RAM 占用高 |
| USB HID 键鼠 / Dongle | nRF54LM20A | nRF52840 | nRF54LM20A 带高速 USB(480 Mbps) |
| LE Audio / 复杂音频 | nRF54H20 | nRF5340 | 等时通道 + 高算力 + 大内存 |
| 边缘 ML / 传感器融合 | nRF54H20 | — | 320 MHz 多核 + 1 MB RAM + 400 MBps 外部存储接口 |
| 工业 / 高温(105 °C) | nRF54L15 | nRF52833 / nRF5340 | 温区与长期供货承诺 |
| 车规 | nRF51824(仅存量) | — | AEC-Q100 Grade 2,新项目需向 Nordic 确认 |
2.8 料号与封装命名规则
Nordic 的完整料号形如 nRF52840-QIAA-R7,拆开看:
| 字段 | 示例 | 含义 |
|---|---|---|
| 系列 + 型号 | nRF52840 | 芯片型号 |
| 封装代码 | QIAA | Q = aQFN,I = 73 pin,AA = 代号;常见还有 QFAA(QFN48)、CIAA(WLCSP)、QDAA(QFN40) |
| 卷带 / 托盘 | -R7 / -R / -T | R7 = 7″ 卷带(最小 1000),R = 13″ 卷带(最小 3000),T = 托盘(如 490) |
| 版本后缀 | -xxAA | Flash/RAM 档位与修订版本,参考设计文件名里常见 |
模组方面,Nordic 自己不出模组,但有庞大的第三方模组伙伴网络(ezurio/Laird、Fanstel、Raytac、MinewSemi、MOKO、Panasonic、Insight SiP、Holyiot、KAGA FEI、Lierda、Feasycom、Abluetech、BoBlinker、HJSIP 等),提供 PCB 天线 / 芯片天线 / uFL 座 / trace pin 等多种形态。选模组的直接收益是射频认证可以复用,设计风险与上市周期大幅下降。
3 · 硬件架构与核心子系统
这一章讲所有 nRF5 芯片共有的骨架:CPU、内存、电源、时钟、GPIO、事件互连与 DMA。理解了这套骨架,nRF51 到 nRF54 的外设驱动写法就都能对上号。
3.1 CPU、内存与总线
| 系列 | CPU | FPU/DSP | TrustZone | Cache | 内存类型 |
|---|---|---|---|---|---|
| nRF51 | Cortex-M0 16 MHz | 无 | 无 | 无 | Flash + RAM |
| nRF52 | Cortex-M4F 64 MHz | FPU | 无 | 有(部分型号) | Flash + RAM |
| nRF53 | 双核 Cortex-M33 128 / 64 MHz | FPU + DSP | 有 | 有 | Flash + RAM |
| nRF54L | Cortex-M33 128 MHz(+ Cortex-M0+ 电源管理) | FPU + DSP | 有 | 有 | RRAM(NVM)+ RAM |
| nRF54H | 多核 Cortex-M33 ≤320 MHz + 多 RISC-V | FPU + DSP | 有 | 有 | RRAM(NVM)+ RAM |
官方文档把 nRF54 的非易失性存储称为 NVM 或 RRAM(阻变存储器)。它带来两个工程差异:一是写入粒度与擦除行为与传统 NOR Flash 不同,移植自己写的 Flash 存储层时不能照抄 nRF52 的 nrf_fstorage 时序假设;二是 NCS 为 nRF54L 提供了 RRAM 保护机制(bootloader RRAM protection),可在启动链里把关键区域锁掉。
3.2 电源架构
nRF5 芯片内部有两套稳压方案可选,这是功耗优化的第一道闸门:
| 模式 | 适用电压 | 特点 | 工程建议 |
|---|---|---|---|
| 片内 Buck DC/DC | 2.1 ~ 3.6 V(视型号) | 效率高,射频工作电流可降 30%~50% | 只要电压允许就一定要开,需外接电感(典型 10 µH) |
| 片内 LDO | 1.75 ~ 3.6 V | BOM 少一个电感,静态电流略高 | 超小体积或成本极致敏感时用 |
| LDO bypass | 1.75 ~ 1.95 V | 外部直接供 1.8 V 给 CPU 域 | 与 nPM 系列 PMIC 配合时使用 |
外部配套方面,Nordic 提供 nPM 系列 PMIC:nPM1100(超小体积双模 Buck + 电池充电)、nPM1300 / nPM1304(带电量计与系统管理)、nPM2100(超低静态电流,适合纽扣电池)。nRF54L15 DK 上就用 nPM1300 给 SoC 供电,可用 Board Configurator 桌面应用把 VDD 从默认 1.8 V 改成 3.0 V。
在 NCS 里 DC/DC 由设备树控制,默认是关闭的。必须在板级 DTS 或 overlay 里显式使能:
&dcdc {
status = "okay";
};
实测对比非常夸张:nRF54L15 DK 睡眠电流在误用 LDO 时可高达 8.35 mA,使能 DC/DC 后降到 1.8 ~ 3.0 mA。另外要确认 nordic,pm-ext-flash-supply 指向 DC/DC 节点,否则外部 Flash 仍走 LDO。
3.3 时钟系统
| 时钟源 | 频率 | 精度 | 用途 | 备注 |
|---|---|---|---|---|
| HFXO | 32 MHz | ±20 ~ ±40 ppm | 射频与高速外设基准 | 必须用外部晶振,射频通信不能靠内部 RC |
| HFINT | 32 MHz | 低 | 启动阶段 / 无射频场景 | 上电默认时钟,射频前切到 HFXO |
| LFXO | 32.768 kHz | ±20 ~ ±250 ppm | RTC 低功耗计时、BLE 连接时序 | 连接态 BLE 对精度敏感,建议外接 |
| LFRC | 32.768 kHz | ±250 ppm 左右 | 无外部 32 kHz 晶振时兜底 | 需定期校准(NCS 可启用自动校准) |
| GRTC | 32.768 kHz | — | nRF54L 全局 RTC | 可在 System OFF 下继续运行,电流低至约 0.8 µA @3 V |
GRTC(Global Real-Time Counter)是 nRF54L 系列新增的关键模块。传统 nRF52 进 System OFF 后只有 GPIO 检测能唤醒,时间信息全丢;nRF54L 的 GRTC 在 System OFF 里继续走时,既能做定时唤醒,又能保持系统时间戳连续——这对「长时间深度睡眠 + 周期性上报」的产品是架构级的简化。
3.4 GPIO 与 GPIOTE
nRF5 的 GPIO 端口按 P0.x / P1.x 编号,每个引脚可通过 CONFIG 寄存器自由分配给任意外设(SPI、TWI、UART、PWM、SAADC 等),这是 Nordic 相对很多 MCU 的显著优势——引脚不绑定外设,Layout 自由度极高。
GPIOTE(GPIO Tasks and Events)负责把引脚电平变化变成可被 PPI/DPPI 路由的事件,或反过来让事件直接翻转引脚。典型用法:用 gpiote + dppi 实现「定时器比较匹配 → 自动翻转 LED」,全程 CPU 不参与。
/* Zephyr 侧推荐写法:用 gpio_dt_spec 从设备树拿引脚 */
#include <zephyr/drivers/gpio.h>
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);
void main(void)
{
gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
while (1) {
gpio_pin_toggle_dt(&led);
k_msleep(500);
}
}
3.5 从 PPI 到 DPPI:事件互连的演进
PPI(Programmable Peripheral Interconnect)是 Nordic 的招牌设计——让外设之间直接互相触发,不需要 CPU 中断参与,是低功耗的关键。三代实现如下:
| 机制 | 芯片 | 通道数 | 特征 |
|---|---|---|---|
| PPI | nRF51 / nRF52 | 16 ~ 20 | 固定通道组,需成对配置 EEP/TEP |
| DPPI | nRF53 / nRF54 | 更多 | 可配置通道,支持通道组(Group)与订阅/发布模型 |
| PPIB | nRF54H 跨域 | — | 跨电源域的 PPI 桥接 |
在 Zephyr 侧这些细节被封装成 nrfx_dppi / nrfx_gppi 抽象,应用层通常用 Kconfig 选项(如 CONFIG_NRFX_DPPI)或直接让驱动内部申请通道,无需手写寄存器。
3.6 EasyDMA
nRF5 的数字接口(SPIM、TWIM、UARTE、SAADC、QSPI、I2S、PDM)几乎都带 EasyDMA:驱动只要给一个 RAM 缓冲区地址与长度,硬件自己搬数据,完成后发一个 END 事件。这带来两个约束:
- 缓冲区必须位于 RAM 中。把 const 数组放在 Flash 里直接喂给 EasyDMA 会触发总线错误或静默失败——这是移植代码时极高频的坑。
- 缓冲区不能被编译器优化掉或中途改地址。DMA 传输期间要保证缓冲区有效,Zephyr 驱动通常用异步 API + 回调解决。
3.7 外设清单对照
| 外设 | nRF51 | nRF52832 | nRF52840 | nRF5340 | nRF54L15 | nRF54H20 |
|---|---|---|---|---|---|---|
| UART / UARTE | 1 | 1(EasyDMA) | 2 | 2 | 1×HS + 4 | 多 |
| SPI / SPIM | 2(无 DMA) | 3 | 4(含 HS 32 MHz) | 4 | 1×HS + 4 | 多 |
| TWI / TWIM | 2 | 2 | 2 | 2 | 4 | 多 + 2×I3C |
| SAADC | 10-bit | 12-bit 200 ksps | 12-bit 200 ksps | 12-bit | 14-bit 2 MS/s | 14-bit |
| USB | — | — | FS 12 Mbps | FS 12 Mbps | —(LM20A 有 HS) | HS 480 Mbps |
| QSPI / XIP | — | — | 32 MHz QSPI | QSPI XIP | — | xSPI 400 MBps |
| NFC | — | NFC-A | NFC-A | NFC-A | 有 | 有 |
| CAN | — | — | — | — | — | CAN FD |
| I²S / PDM | — | 有 | 有 | 有 | 有 / TDM | 有 |
| 比较器 / LPCOMP | 有 | 有 | 有 | 有 | 有 | 有 |
| QDEC | 有 | 有 | 有 | 有 | 有 | 有 |
3.8 UICR 与 OTP:出厂配置信息放在哪
UICR(User Information Configuration Registers)是一块独立于主 Flash 的小区域,用来放不能被普通擦除清掉的信息。典型用途:
- UICR->CUSTOMER[n]:放客户自定义数据,如 OpenThread 的 EUI-64 地址、产品序列号。
- 引脚默认配置:如 NFC 引脚是当 GPIO 还是当 NFC 天线引脚,靠 UICR 决定。
- 引导相关:APPROTECT、SECURE APPROTECT、 bootloader 地址等。
写入方式(以 Thread 的 EUI-64 为例):
nrfutil device x-write --serial-number <snr> --address 0x10001080 --value 0x11223344
nrfutil device x-write --serial-number <snr> --address 0x10001084 --value 0x55667788
nrfutil device reset --reset-kind=RESET_PIN
UICR 的某些位(尤其是 APPROTECT / ERASEPROTECT)一旦写错,普通的 nrfutil device erase 无法恢复,需要走 CTRL-AP 擦除(nrfutil device recover) 流程。量产治具脚本里对 UICR 的写操作必须有二次确认与回读校验。
4 · 开发环境搭建:nRF Connect SDK 与工具链
Nordic 现在的工具链是「一套 SDK + 三个入口」。这一章把三条安装路线全部走一遍,并给出 CI/服务器场景下的无头安装方案。
4.1 三条安装路线怎么选
| 路线 | 入口 | 适合 | 优点 | 缺点 |
|---|---|---|---|---|
| 一键安装 | nRF Connect for VS Code 扩展 | 绝大多数开发者 | 自动装 SDK + 工具链 + VS Code 配置,图形化管理多版本 | 依赖 VS Code,磁盘占用大 |
| 命令行 | nrfutil toolchain-manager | CI、服务器、无 GUI 环境 | 可脚本化、可离线部署、可精确锁定版本 | 需要自己配环境变量 |
| 手动 west | west init + west update | 需要改 SDK 源码、做上游贡献 | 完全可控,能切分支做开发 | 依赖要自己解决,最容易出错 |
4.2 路线一:nRF Connect for VS Code(推荐)
- 安装 VS Code(1.86 以上)。
- 在扩展市场搜索 nRF Connect,安装 Nordic 官方扩展包(会连带装 nRF Kconfig、nRF DeviceTree、nRF Terminal、nRF Debug 等子扩展)。
- 打开扩展侧边栏的 Welcome 面板,点击 Install Toolchain,选择要装的 NCS 版本(新项目选 3.4.0 LTS 或更新的 3.4.x)。
- 选择安装路径(Windows 建议 C:\ncs\v3.4.0,路径不要有空格与中文)。
- 等待下载完成——这一步会拉下 SDK 全部仓库 + 工具链 + Python 依赖,国内网络可能需要几十分钟到数小时,建议挂代理或选夜间时段。
- 装完后点 Open VS Code,扩展会自动设置好 ZEPHYR_BASE、工具链路径等环境变量。
除了安装器,它还提供:图形化 Build Configuration(选板子、选 Kconfig fragment、开 Debug 选项、加 sysbuild)、nRF Terminal(串口 + RTT 双通道)、nRF Debug(基于 Microsoft Debug Adapter,支持多核与多镜像)、Kconfig / Devicetree 图形编辑器、Memory Report 与 Partition Manager Report。
4.3 路线二:nrfutil 命令行(CI 友好)
新版 nrfutil(7.x) 是原生二进制 + 插件架构,与旧版 pip 装的 6.x 完全不兼容。第一件事是装二进制本体,然后按需装子命令:
# 1. 下载 nrfutil 放到 PATH(Windows 建议 C:\Nordic\nrfutil\)
nrfutil --version
# 2. 安装需要的子命令
nrfutil install device # 烧录 / 擦除 / 复位 / 调试
nrfutil install toolchain-manager # SDK 与工具链管理
# 3. 列出并安装 SDK 工具链
nrfutil toolchain-manager list
nrfutil toolchain-manager install --install-dir <路径> --ncs-版本号 v3.4.0
# 4. 进入该工具链环境后即可 west build / west flash
nrfutil toolchain-manager launch --ncs-version v3.4.0 -- west build -b nrf54l15dk/nrf54l15/cpuapp
| 子命令 | 用途 | 常用动作 |
|---|---|---|
| device | 设备操作(主力) | list / program / erase / reset / recover / x-write / x-provision-keys |
| toolchain-manager | SDK 与工具链 | list / install / launch / remove / search |
| nrf5sdk-tools | 遗留 nRF5 SDK DFU 包 | pkg generate |
| trace | nRF91 modem 追踪 | start / stop |
| ble-sniffer | BLE 嗅探 | — |
| npm | nPM 系列 PMIC 配置 | — |
4.4 路线三:手动 west(做 SDK 开发时用)
# 1. 建工作区
mkdir ncs && cd ncs
python3 -m venv .venv && source .venv/bin/activate
pip install west
# 2. 拉 manifest 仓库(sdk-nrf 就是 manifest repo)
west init -m https://github.com/nrfconnect/sdk-nrf --mr v3.4.0
west update # 拉取 zephyr / mcuboot / tfm / mbedtls / nrfxlib 等全部模块
west zephyr-export # 导出 ZEPHYR_BASE 与 CMake 包
# 3. 装 Python 依赖
pip install -r zephyr/scripts/requirements.txt
pip install -r nrf/scripts/requirements.txt
pip install -r bootloader/mcuboot/scripts/requirements.txt
切换 NCS 版本后,模块清单(west.yml)会变,必须重跑 west update,否则会出现「编译时报某个头文件找不到」但 SDK 明明存在的诡异现象。版本切换的完整顺序:git checkout <tag> → west update → west zephyr-export → -p always 重编译。
4.5 驱动与权限
| 平台 | 需要做什么 | 不做会怎样 |
|---|---|---|
| Windows | 安装 SEGGER J-Link Software and Documentation Pack | nrfutil device list 看不到板子 |
| Linux | 加 udev 规则(Nordic 官网提供 .rules 文件),或临时用 sudo | 普通用户无 USB 访问权限 |
| macOS | 首次运行 nrfutil 被 Gatekeeper 拦截,去「系统设置 → 隐私与安全性」点「仍要允许」 | 命令直接被系统拒绝 |
① USB 线:充电线遍地都是,必须用确认能传数据的线;② J-Link 驱动:没装或版本太旧;③ Linux 权限:缺 udev 规则。这三项覆盖了绝大多数「板子坏了」的误报。用 nrfutil device list 验证:
$ nrfutil device list
004400012345 SEGGER J-LINK nRF54L15-DK /dev/ttyACM04.6 目录结构与磁盘占用
NCS 工作区由 west 管理的多个 Git 仓库组成,完整安装(含工具链)通常占用 20 ~ 35 GB,多版本并存时按版本数线性增长。核心目录:
| 目录 | 内容 | 你会不会改 |
|---|---|---|
| nrf/ | Nordic 特有的应用、示例、库、驱动、板级定义 | 参考 / 复制 |
| zephyr/ | Zephyr RTOS 内核、驱动框架、构建系统 | 一般不改 |
| bootloader/mcuboot/ | MCUboot 引导加载器 | 配置签名密钥时会用到 |
| modules/ | 其他模块(mbedtls、lz4、tinycbor、LVGL 等) | 不改 |
| nrfxlib/ | Nordic 预编译库(SoftDevice Controller、crypto、BLE 控制器等) | 不改 |
| modules/tee/tfm/ | Trusted Firmware-M | 改安全配置时 |
4.7 验证:从零编译并烧录
- 进入任一示例目录,如 nrf/samples/hello_world(Zephyr 侧为 zephyr/samples/hello_world)。
- 编译:west build -b nrf54l15dk/nrf54l15/cpuapp
- 烧录:west flash(或 nrfutil device program --firmware build/zephyr/zephyr.hex --traits jlink)
- 看输出:串口 115200-8-N-1,或在 VS Code 里开 nRF Terminal。
NCS 用 <board>/<soc>/<variant> 三段式。常见形态:nrf54l15dk/nrf54l15/cpuapp、nrf52840dk/nrf52840、nrf5340dk/nrf5340/cpuapp、nrf5340dk/nrf5340/cpunet、nrf52840dk/nrf52840/ns(非安全域)。用 west boards 可列出全部支持的目标。
5 · 工程结构与构建系统
NCS 的构建系统叠了五层:west 管仓库、CMake 管编译、Kconfig 管配置、Devicetree 管硬件、sysbuild 管多镜像。这五层的关系搞清楚,编译报错就有一半能自己定位。
5.1 一个最小工程的目录结构
my_app/
├── CMakeLists.txt # 工程入口,至少 3 行
├── prj.conf # Kconfig 配置(主)
├── Kconfig # 可选:自定义 Kconfig 选项
├── src/
│ └── main.c
├── boards/
│ ├── nrf54l15dk_nrf54l15_cpuapp.overlay # 板级设备树覆盖
│ └── nrf52840dk_nrf52840.conf # 板级专属配置
├── sysbuild.conf # 多镜像构建配置(MCUboot / NSIB 等)
├── VERSION # 应用版本号(DFU 用)
└── build/ # 构建产物(west build 生成)
最小 CMakeLists.txt:
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(my_app)
target_sources(app PRIVATE src/main.c)
5.2 Kconfig:功能开关
Kconfig 决定「编译哪些代码进去」。三个层级,优先级从低到高:板级默认 defconfig → 应用 prj.conf → 命令行 -DCONFIG_XXX=y。
# prj.conf 示例:开启蓝牙 + 日志 + RTT 后端
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="MyDevice"
CONFIG_LOG=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_USE_SEGGER_RTT=y
改配置的三种方式:
| 方式 | 命令 / 文件 | 何时用 |
|---|---|---|
| 直接编辑 | prj.conf | 永久生效,最常用 |
| 菜单界面 | west build -t menuconfig | 探索有哪些选项 |
| 命令行临时 | west build -- -DCONFIG_LOG_MODE_IMMEDIATE=y | 快速试验,不写进文件 |
Kconfig 会引发大范围的条件编译,增量构建经常漏掉依赖变化。凡是改了 prj.conf 出现莫名其妙的链接错误,先 west build -p always(或 VS Code 里选 Pristine Build)再判断。
5.3 Devicetree:硬件描述
Devicetree(DTS)描述「板子上有什么硬件、接在哪个引脚」。Zephyr 用它替代传统的 #define PIN_X 12 写法,应用通过 DT_ALIAS / DT_NODELABEL 拿句柄。
/* boards/nrf54l15dk_nrf54l15_cpuapp.overlay —— 给板子加一个 I2C 传感器 */
&i2c1 {
status = "okay";
bme280@76 {
compatible = "bosch,bme280";
reg = <0x76>;
};
};
/* 打开 DC/DC(功耗优化必做) */
&dcdc {
status = "okay";
};
| 文件类型 | 命名 | 作用 |
|---|---|---|
| SoC dtsi | nrf54l15.dtsi | 芯片级,厂商提供,不改 |
| 板级 dts | nrf54l15dk_nrf54l15.dts | 开发板定义,不改 |
| overlay | boards/<board>.overlay | 项目改硬件就改它 |
| shield | boards/shields/<name>.overlay | 可复用的扩展板定义 |
5.4 sysbuild 与 Partition Manager:多镜像时代
现代 nRF 产品很少只有一份固件:至少会有 bootloader + 应用,双核芯片还有 网络核镜像,nRF54H 还有 Secure Domain / System Controller 固件。sysbuild 负责把这些镜像一起构建,Partition Manager 负责把它们摆进 Flash。
# sysbuild.conf —— 打开 MCUboot
SB_CONFIG_BOOTLOADER_MCUBOOT=y
# 或打开 nRF Secure Immutable Bootloader(NSIB)
SB_CONFIG_SECURE_BOOT_APPCORE=y
# 或两者串联:NSIB 做不可变根,MCUboot 做可升级二级
SB_CONFIG_SECURE_BOOT_APPCORE=y
SB_CONFIG_BOOTLOADER_MCUBOOT=y
| 概念 | 前缀 | 作用范围 | 例子 |
|---|---|---|---|
| 应用 Kconfig | CONFIG_ | 应用镜像 | CONFIG_BT=y |
| Sysbuild Kconfig | SB_CONFIG_ | 整个多镜像系统 | SB_CONFIG_BOOTLOADER_MCUBOOT=y |
| 镜像专属配置 | b0_ / mcuboot_ | 单个子镜像 | -Db0_FILE_SUFFIX=minimal |
| Partition Manager | PM_ / pm.yml | Flash / RAM 分区 | pm_static.yml |
5.5 构建产物都在哪
build/
├── zephyr/
│ ├── zephyr.hex # 烧录用(最常用)
│ ├── zephyr.elf # 调试用(含符号)
│ ├── zephyr.bin
│ ├── .config # 最终生效的 Kconfig 全量
│ └── zephyr.dts # 最终展开的设备树
├── my_app/
│ └── zephyr/
│ ├── zephyr.signed.bin # MCUboot 签名镜像(DFU 用)
│ └── app_update.bin # DFU 传输用
├── mcuboot/
│ └── zephyr/zephyr.hex # MCUboot 自身镜像
├── merged.hex # 合并后的完整镜像
├── partitions.yml # 分区布局
└── build.ninja
① build/zephyr/.config —— 查「我这个配置到底开没开」;② build/zephyr/zephyr.dts —— 查「这个引脚到底被谁占了」;③ build/partitions.yml —— 查「Flash 空间到底怎么分的」。绝大多数配置类问题靠这三个文件就能定位。
5.6 常用命令速查
| 命令 | 作用 |
|---|---|
| west build -b <board> | 构建 |
| west build -p always | 干净重建(改配置后必用) |
| west build -t menuconfig | 图形化配置 |
| west build -t guiconfig | GUI 配置(需装依赖) |
| west flash | 烧录(只擦被覆盖的页) |
| west flash --erase | 全片擦除后烧录 |
| west flash --snr <snr> | 指定调试器序列号 |
| west debug / west attach | 启动 GDB 会话 / 附着到运行中的目标 |
| west update | 更新所有模块(切版本后必跑) |
| west boards | 列出支持的板子 |
| west spdx | 生成 SBOM(合规交付用) |