3. 开发环境与调试工具搭建

射频调试与普通应用调试最大的区别在于:你不仅要让代码跑起来,还要让射频信号可被观测、可被量化。因此本章的搭建目标不是“装好一个 IDE”,而是建立一条从源码到空口、从寄存器到频谱仪的完整链路。整条链路可以拆成四层:工具链层(nRF Connect SDK + Zephyr)、构建与烧录层(nRF Util、west、J-Link)、调试观测层(Segger Embedded Studio + RTT/调试探针)、射频测量层(射频测试仪器与 DUT 的连接)。

一、nRF Connect SDK 与工具链的安装

nRF Connect SDK(NCS)本质上是 Zephyr RTOS 加上 Nordic 的协议栈、驱动与示例,因此它不是一个“双击安装”的 IDE,而是一套基于 west 的仓库集合。推荐使用 nRF Connect for VS Code 扩展或 Toolchain Manager 安装,原因是它会自动处理 Python 虚拟环境、Zephyr SDK、west 版本这些最容易出错的依赖。

安装完成后,第一件事是确认工具链版本与 SDK 版本匹配。NCS 的版本号形如 v2.6.1,它绑定了特定的 Zephyr 版本、nrfxlib(含 SoftDevice Controller / 802.15.4)版本。可以用以下命令核对:

west --version
nrfutil version
# 查看当前 SDK 与工具链
west list | head -20
# 典型输出中应能看到 zephyr、nrf、nrfxlib、mbedtls 等仓库

如果使用命令行方式,初始化流程为:

west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.6.1 ncs
cd ncs
west update
west zephyr-export
pip install -r zephyr/scripts/requirements.txt

这里的关键判断点是 west update 是否完整拉取了 nrfxlib。射频相关的协议栈二进制(如 SoftDevice Controller 的 libsoftdevice_controller_multiprotocol.a)就在 nrfxlib 中,缺失会直接导致链接阶段报“undefined reference to sdc_*”。

二、Segger Embedded Studio 的工程配置

Segger Embedded Studio(SES)在 NCS 中主要承担两类角色:一是作为调试器前端连接 J-Link,二是作为源码级调试环境查看 RTT 日志。NCS 生成的 SES 工程通常由 west build -b <board> -t ses 或 build_ses.bat 产生,工程文件为 .emProject。

在 SES 中需要重点确认三项配置:

  • Target 与 Board:例如 nrf52840dk_nrf52840 或 nrf5340dk_nrf5340_cpuapp。nRF5340 是双核,应用核与网络核需要分别烧录,SES 工程默认只针对应用核。
  • J-Link 连接参数:SWD 接口、速度(默认 4000 kHz,长排线或干扰环境可降到 1000 kHz)、复位方式(Connect under reset 常用于已进入低功耗或看门狗复位的芯片)。
  • RTT 终端:SES 内置 J-Link RTT Viewer 功能,需在工程选项中启用 RTT,并指定 SEGGER_RTT 控制块地址(通常由链接脚本自动分配)。

一个常见误区是把 SES 当作唯一构建入口。实际上 NCS 的构建系统是 CMake + west,SES 只是消费生成的工程。若修改了 prj.conf 或 CMakeLists.txt,应重新执行 west build 并重新生成 SES 工程,否则配置不会生效。

三、nRF Util 与 J-Link 的烧录链路

nRF Util 是 Nordic 的命令行工具集合,射频调试中最常用的是 nrfutil device(设备管理)和 nrfutil trace(协议追踪)。烧录固件时,最直接的方式是:

nrfutil device program --firmware build/zephyr/zephyr.hex \
  --options chip_erase_mode=ERASE_RANGES,verify=VERIFY_READ

# 查看已连接设备
nrfutil device list

# 复位并运行
nrfutil device reset

J-Link 本身提供 JLinkExe / JLink.exe,在需要脚本化批量烧录或读取特定内存地址时更灵活。例如读取 FICR 中的设备地址(BLE 地址来源):

JLinkExe -device nRF52840_xxAA -if SWD -speed 4000
J-Link> connect
J-Link> mem32 0x100000A4, 8   // DEVICEADDR[0..1]
J-Link> exit

射频调试中,J-Link 的另一个关键用途是配合 RTT 输出实时日志。相比 UART,RTT 不占用引脚、延迟低,适合在射频收发过程中打印时间戳、信道号、RSSI 等。需要注意的是,RTT 缓冲区大小和上传频率会影响实时性,高频日志建议增大 buffer 或降低打印频率。

四、与射频测试仪器的连接配置

这是本章与普通嵌入式调试最大的分水岭。射频测试仪器(如频谱仪、矢量信号分析仪、综测仪)需要与 DUT 建立受控的射频连接,同时 DUT 需要处于可被控制的状态(发射单载波、发射调制信号、进入接收模式等)。

连接方式通常有三种:

  • 传导连接:DUT 的射频端口通过 SMA 线缆 + 衰减器接到仪器。这是最可控、可重复的方式,适合测发射功率、频偏、EVM、杂散。
  • 辐射连接:DUT 使用板载天线或外接天线,仪器使用天线在屏蔽箱或暗室中接收。适合验证天线效率、整机辐射性能。
  • 综测仪信令连接:综测仪模拟基站/主设备,与 DUT 建立协议连接,用于测接收灵敏度、误包率。这需要 DUT 运行完整的协议栈。

传导连接时,必须注意衰减器的使用。DUT 发射功率若为 +8 dBm,而频谱仪输入最大安全电平常为 +20 dBm 甚至 +30 dBm,看似安全,但若 DUT 靠近仪器或存在驻波反射,仍可能损坏前端。工程上建议至少加 20 dB 衰减器,并在仪器端设置对应的参考电平偏移(Ref Level Offset),使读数直接反映 DUT 端口功率。

下面这张图给出从开发主机到空口的完整连接拓扑,以及各环节的关键配置点:

开发主机 nRF Connect SDK west / CMake Segger Embedded Studio nRF Util / J-Link 驱动 J-Link 调试探针 SWD / SWO / RTT Speed 4000 kHz DUT 开发板 nRF52840 / nRF5340 射频端口 SMA RTT 日志输出 单载波 / 调制 / 接收 衰减器 20 dB 保护仪器前端 射频测试仪器 频谱仪 / 矢量信号分析仪 / 综测仪 Ref Level Offset = +20 dB 中心频率 / RBW / 触发方式 测量项:功率、频偏、EVM、杂散 USB SWD RF RF 线缆 LAN / USB / GPIB 控制 关键检查点 1. J-Link 能识别芯片 ID,SWD 速率与排线长度匹配;RTT 日志可正常输出。 2. DUT 射频端口已切换到测试模式(单载波/调制),功率与信道由固件或 CLI 控制。 3. 衰减器与 Ref Level Offset 一致,仪器读数可直接换算为 DUT 端口功率。

五、把链路跑通的验证顺序

搭建完成后,建议按以下顺序逐级验证,避免一次性引入太多变量:

  1. 编译与烧录:用 west build -b nrf52840dk_nrf52840 samples/hello_world 编译,再用 nRF Util 烧录,确认 J-Link 能识别设备。
  2. RTT 日志:在 SES 或 J-Link RTT Viewer 中看到启动日志,说明调试通道正常。
  3. 射频发射:烧录 radio_test 示例或使用 nrfutil trace 配合,让 DUT 输出单载波。用频谱仪在预期频点看到载波,功率与固件设定值一致(考虑线损与衰减器)。
  4. 参数扫描:改变信道、功率等级,观察频谱仪读数是否随之变化,验证控制通路有效。
  5. 接收与协议:切换到综测仪信令模式,测量灵敏度或误包率,确认协议栈与射频前端协同工作。
传导测试中,线缆损耗和衰减器误差会直接叠加到测量结果上。建议在正式测试前用信号源或综测仪校准一次链路损耗,把该值写入仪器的 Ref Level Offset 或测试记录中,避免把线损误判为 DUT 功率偏差。
nRF5340 的网络核负责射频协议栈,应用核通过 IPC 与网络核通信。若只烧录应用核,射频功能不会工作。使用 SES 调试时,需确认网络核固件已通过 west flash --core net 或 nRF Util 单独烧录。