3. nRF开发环境搭建

nRF 系列芯片(如 nRF52840、nRF5340)的现代开发方式已经不再是单纯使用 Keil 或 IAR 加寄存器配置,而是围绕 nRF Connect SDK(NCS) 构建。NCS 本质上是 Nordic 对 Zephyr RTOS 的发行版封装:它把 Zephyr 内核、HAL、蓝牙协议栈、802.15.4、Thread、Zigbee、Matter、驱动、示例工程和构建工具整合在一起,通过 west 工具统一管理。理解 NCS 与 Zephyr 的关系,是搭建环境的第一步。

可以把整个开发环境理解为四层:最底层是 工具链(编译器、CMake、Ninja、Python、west、设备树工具),中间是 Zephyr RTOS 内核与子系统,上层是 NCS 应用层与协议栈,最上层是 你的应用工程。四层之间通过 CMake 构建系统和 Kconfig 配置系统连接。下图展示了这一结构以及从源码到烧录的完整数据流。

nRF Connect SDK 开发环境分层与构建烧录数据流 ① 工具链层 GNU Arm GCC CMake Ninja Python3 west nrfjprog / J-Link dtc ② Zephyr RTOS 内核与子系统 内核调度 / 线程 设备驱动模型 设备树 DTS Kconfig 日志 / Shell 电源管理 ③ NCS 应用层与协议栈 SoftDevice Ctrl 蓝牙 LE 协议栈 802.15.4 Thread Matter / Zigbee nRF 驱动扩展 ④ 应用工程 prj.conf CMakeLists.txt src/main.c boards/*.overlay sysbuild 构建与烧录命令流 west build -b nrf52840dk/nrf52840 → west flash → west debug 输出:build/zephyr/zephyr.elf / zephyr.hex / zephyr.map

一、安装方式选择:Toolchain Manager 还是手动安装

Nordic 官方推荐使用 nRF Connect for VS Code 扩展配合 Toolchain Manager 安装。这种方式会自动下载匹配版本的 NCS、Zephyr、GNU Arm GCC、Python 依赖和 west,并管理多个 SDK 版本共存。对于课程学习和工业项目开发,建议采用这种方式,避免手动安装时 Python 包版本冲突、CMake 路径错误等常见问题。

手动安装适合需要定制工具链或 CI 环境的场景,核心步骤是:安装 Python 3.8+、安装 west、west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.6.0、west update、安装 requirements.txt 中的 Python 依赖、安装 Zephyr SDK。无论哪种方式,最终都要保证 west 命令可用,且 ZEPHYR_BASE 环境变量指向正确的 Zephyr 目录。

二、工程创建:从示例到自定义应用

NCS 提供了大量示例工程,位于 nrf/samples 和 zephyr/samples 下。创建工程有两种常用方式:一是直接复制示例目录,二是使用 west build 指定应用目录。一个最小应用工程通常包含以下文件:

my_sensor_app/
├── CMakeLists.txt        # 声明工程名、引入 Zephyr 构建系统
├── prj.conf              # Kconfig 配置,如开启蓝牙、日志、传感器驱动
├── src/
│   └── main.c            # 应用入口,包含 main() 与线程定义
└── boards/
    └── nrf52840dk_nrf52840.overlay   # 板级设备树覆盖,配置引脚与外设

其中 CMakeLists.txt 的最小内容为:

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(my_sensor_app)
target_sources(app PRIVATE src/main.c)

prj.conf 中按需开启配置,例如工业采集终端常用的配置:

CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_GPIO=y
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="nrf_industrial_node"

三、编译:west build 的关键参数

编译命令的核心是 west build。首次编译需要指定板子和应用目录,例如针对 nRF52840 DK:

west build -b nrf52840dk/nrf52840 -d build my_sensor_app

其中 -b 指定板级目标,-d 指定构建目录。若使用 sysbuild(多镜像构建,如 MCUboot + 应用),可加 --sysbuild。编译成功后,构建目录下会生成 zephyr.elf、zephyr.hex、zephyr.map 等文件。若编译报错,优先检查:板级名称是否正确、ZEPHYR_BASE 是否设置、Python 依赖是否完整、设备树 overlay 中的引脚是否与硬件冲突。

常用清理命令:west build -t pristine 可清除构建缓存,解决因配置变更导致的增量编译异常。

四、烧录与调试:west flash 与 west debug

烧录前需确保 J-Link 驱动已安装、开发板通过 USB 连接、nrfjprog --version 可正常输出。烧录命令:

west flash -d build
west debug -d build

west flash 会自动调用 nrfjprog 或 J-Link 将 zephyr.hex 写入芯片。若使用外部调试器或自定义烧录器,可通过 --runner 指定。烧录完成后,可通过 RTT(Real-Time Transfer)查看日志:

west rtt -d build

RTT 是 Nordic 调试中非常实用的工具,它不占用 UART 引脚,直接通过 J-Link 读取日志,适合工业现场调试。若日志无输出,检查 CONFIG_LOG 与 CONFIG_USE_SEGGER_RTT 是否开启。

五、环境验证清单

检查项命令 / 方法预期结果
west 可用west --version输出 west 版本号
Zephyr 路径echo $ZEPHYR_BASE指向 zephyr 目录
工具链arm-none-eabi-gcc --version输出 GCC 版本
J-Linknrfjprog --version输出 nrfjprog 版本
板子识别nrfjprog --ids显示 J-Link 序列号
编译验证west build -b nrf52840dk/nrf52840 samples/hello_world生成 zephyr.hex
工业项目中,NCS 版本与芯片型号必须匹配。例如 nRF5340 需要 NCS v2.x 以上,且网络核与应用核的固件需分别构建。烧录前务必确认板级目标名称,如 nrf5340dk/nrf5340/cpuapp 与 nrf5340dk/nrf5340/cpunet 是两个不同目标。