3、开发环境搭建:安装nRF Connect SDK、Zephyr RTOS、编译工具链,配置VS Code或命令行环境,并完成第一个LED闪烁例程

nRF Connect SDK(nCS)是Nordic Semiconductor推出的统一软件开发套件,它基于Zephyr RTOS构建,集成了协议栈、驱动、板级支持包(BSP)以及丰富的应用示例。搭建一个可靠、可复现的开发环境,是后续实现温湿度传感器数据采集、异常检测算法和蓝牙告警功能的基础。本章将系统讲解从零开始搭建nCS开发环境的完整流程,涵盖工具链安装、VS Code与命令行两种工作流的配置,并通过一个LED闪烁例程验证环境正确性。

nRF Connect SDK 开发环境搭建与验证链路 主机环境 Ubuntu 22.04 / Win10+ 8GB RAM / 20GB磁盘 编译工具链 GNU ARM GCC 12.3 CMake 3.20+ / Ninja nRF Connect SDK v2.6.x + Zephyr RTOS west / nrfutil 目标硬件 nRF52840 DK nRF5340 DK west build -b nrf52840dk_nrf52840 CMake + Ninja + DeviceTree + Kconfig 烧录 nrfjprog / pyOCD / J-Link 调试 RTT / 串口 / Ozone 验证输出:LED闪烁 + 串口日志 观察GPIO电平翻转 / 打印Hello World 常见问题:工具链版本不匹配 / west update失败 / 板级配置缺失 / 串口权限不足 解决:使用nrfutil统一管理版本,检查udev规则,确认west workspace结构

上图展示了从主机环境到目标硬件烧录调试的完整工具链链路。整个环境搭建的核心思路是:用west工具统一管理SDK版本和模块依赖,用CMake/Ninja完成构建,用nrfjprog或pyOCD完成烧录。下面我们将分步骤展开。

3.1 核心原理:nCS、Zephyr与west的协作机制

nRF Connect SDK并非一个独立的RTOS,而是基于Zephyr RTOS的发行版。Nordic在Zephyr上游内核之上,增加了自己的SoC系列支持(如nRF52840、nRF5340)、BLE协议栈(SoftDevice Controller)、802.15.4栈、以及各种传感器驱动和应用层库。这种架构带来的直接好处是:开发者可以复用Zephyr庞大的生态(设备树、驱动框架、网络协议栈),同时获得Nordic针对其硬件优化的专有组件。

west是Zephyr的元工具(meta-tool),它通过一个manifest仓库(通常为nrf)来定义所有子模块的Git仓库和版本。执行west update时,west会按照manifest文件中的描述,将Zephyr、mcuboot、nrfxlib、hal_nordic等数十个仓库拉取到本地并锁定到精确的commit。这种机制确保了构建的可复现性——团队中所有成员使用同一份manifest,就能得到完全一致的SDK状态。

构建系统方面,Zephyr使用CMake作为构建系统生成器,Ninja作为底层编译调度器。开发者通过west build命令间接调用CMake,CMake会读取设备树(Device Tree)源文件(.dts和.dtsi)来描述硬件资源,读取Kconfig配置来裁剪内核和驱动功能。最终生成的目标文件(.hex、.bin)通过烧录工具写入开发板Flash。

关键理解:nCS = Zephyr内核 + Nordic扩展包 + 应用代码。west负责“拉取和锁定版本”,CMake负责“解析硬件描述和配置”,Ninja负责“真正编译”。三者缺一不可。

3.2 操作流程:从零安装到环境验证

以下流程以Ubuntu 22.04 LTS为例(Windows 10/11用户建议使用WSL2或直接使用nRF Connect for Desktop中的Toolchain Manager)。整个安装过程约需30-60分钟,取决于网络速度。

步骤1:安装系统依赖包

sudo apt update
sudo apt install --no-install-recommends git cmake ninja-build gperf \
  ccache dfu-util device-tree-compiler wget \
  python3-dev python3-pip python3-setuptools python3-tk python3-wheel \
  xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1

步骤2:安装nRF Connect SDK工具链管理器

Nordic提供了nrfutil命令行工具,它可以自动下载并管理特定版本的nCS和配套的ARM GCC编译器。推荐使用这种方式,因为它能避免手动配置环境变量的繁琐和版本冲突。

# 安装nrfutil
pip3 install nrfutil
# 登录Nordic账号(免费注册)
nrfutil login
# 安装nCS v2.6.1(包含Zephyr和工具链)
nrfutil toolchain-manager install --ncs-version v2.6.1
# 启动该工具链环境(会进入一个子shell,环境变量已配置好)
nrfutil toolchain-manager launch --ncs-version v2.6.1

进入launch后的shell,可以验证工具链是否就绪:

west --version
cmake --version
arm-zephyr-eabi-gcc --version

如果看到版本号输出,说明工具链安装成功。此时west命令已经指向nCS自带的west,而不是系统全局的west。

步骤3:获取SDK源码并初始化工作区

在launch的shell中,创建一个工作目录并获取nRF Connect SDK主仓库:

mkdir ~/ncs_work && cd ~/ncs_work
west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.6.1
west update

west update会拉取约20多个子模块,总大小约3-5GB。这一步耗时较长,请确保网络稳定。如果中途失败,重新执行west update即可,west支持断点续传。

步骤4:配置VS Code(可选但推荐)

Nordic官方提供了nRF Connect for VS Code扩展包,它集成了项目创建、构建、烧录、调试、设备树可视化等功能。安装方式:

  1. 在VS Code扩展市场搜索“nRF Connect”并安装(Nordic Semiconductor官方发布)。
  2. 安装完成后,按Ctrl+Shift+P,输入“nRF Connect: Open Welcome Page”。
  3. 在欢迎页中,点击“Select a Toolchain”,选择之前通过nrfutil安装的v2.6.1工具链路径(通常位于~/.nrfutil/toolchains/)。
  4. VS Code会自动识别SDK路径,并加载所有示例程序。

对于习惯命令行的开发者,也可以完全使用终端操作。VS Code的集成终端会自动继承nrfutil launch的环境变量。

步骤5:编译并烧录第一个LED闪烁例程

我们使用nRF52840 DK开发板(板载4个用户LED和4个用户按键)作为目标硬件。在nCS中,LED闪烁的示例位于zephyr/samples/basic/blinky。

cd ~/ncs_work
west build -b nrf52840dk_nrf52840 zephyr/samples/basic/blinky -d build/blinky
west flash -d build/blinky

如果一切顺利,开发板上的LED0(绿色)会以500ms的间隔闪烁。同时,通过串口(默认波特率115200)可以看到Zephyr的启动日志。

经验提示:如果使用nRF5340 DK,请将-b参数改为nrf5340dk_nrf5340-cpuapp。nRF5340是双核芯片,需要明确指定构建哪个核的应用。

3.3 案例拆解:一次完整的LED闪烁例程构建与排障

下面通过一个实际案例,展示从构建到运行的全过程,并分析一个典型错误。

背景与目标:某工程师使用nRF52840 DK,在Ubuntu 22.04上按照上述步骤安装完nCS v2.6.1后,执行west build命令,期望编译通过并烧录成功。

初始现象:构建过程中出现以下错误:

-- Found Python3: /usr/bin/python3 (found suitable version "3.10.12", minimum required "3.8")
-- Found west: /home/user/.local/bin/west
-- Board: nrf52840dk_nrf52840
-- Found toolchain: host (Zephyr SDK)
error: command 'arm-zephyr-eabi-gcc' failed: No such file or directory

分析判断过程:错误信息显示“Found toolchain: host (Zephyr SDK)”,这表示CMake没有找到Nordic提供的ARM交叉编译器,而是错误地使用了主机GCC。原因通常是ZEPHYR_TOOLCHAIN_VARIANT环境变量未设置,或者ZEPHYR_SDK_INSTALL_DIR指向了不存在的路径。在nCS v2.6.x中,默认工具链变体是zephyr,但需要显式指定SDK路径。

实际操作步骤:

  1. 检查环境变量:echo $ZEPHYR_TOOLCHAIN_VARIANT,发现输出为空。
  2. 在launch的shell中,手动设置:export ZEPHYR_TOOLCHAIN_VARIANT=zephyr。
  3. 找到Zephyr SDK的实际安装路径:find ~/.nrfutil -name "zephyr-sdk*" -type d,得到路径如~/.nrfutil/toolchains/v2.6.1/opt/zephyr-sdk。
  4. 设置export ZEPHYR_SDK_INSTALL_DIR=~/.nrfutil/toolchains/v2.6.1/opt/zephyr-sdk。
  5. 重新执行west build -b nrf52840dk_nrf52840 zephyr/samples/basic/blinky -d build/blinky,构建成功。

结果对比:修复前,构建在配置阶段即失败;修复后,构建耗时约30秒,生成build/blinky/zephyr/zephyr.hex文件。执行west flash后,LED0开始闪烁,串口输出*** Booting Zephyr OS build v2.6.1 ***。

风险与代价:如果直接使用系统自带的GCC编译,虽然能通过语法检查,但生成的二进制无法在ARM Cortex-M4上运行,会导致烧录后无现象或硬件异常。因此,必须确保交叉编译器路径正确。

复盘经验:nrfutil launch虽然配置了大部分环境,但ZEPHYR_SDK_INSTALL_DIR有时不会自动导出。建议在~/.bashrc中写入以下内容,避免每次手动设置:

export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=~/.nrfutil/toolchains/v2.6.1/opt/zephyr-sdk

3.4 常见误区与总结复盘

在环境搭建过程中,以下问题出现频率最高,需要特别注意:

误区/问题 现象 根因 解决方案
使用系统全局west west命令找不到或版本过旧 pip安装的west与nCS不匹配 始终在nrfutil launch的shell中操作
工具链变体未指定 编译时使用gcc而非arm-zephyr-eabi-gcc ZEPHYR_TOOLCHAIN_VARIANT未设置 export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
SDK路径错误 找不到Zephyr SDK中的cmake模块 ZEPHYR_SDK_INSTALL_DIR指向错误 使用find命令确认实际路径
串口无输出 烧录成功但看不到日志 串口权限不足或波特率错误 sudo usermod -aG dialout $USER;检查波特率115200
west update卡住 长时间无进度 网络问题或Git代理未配置 设置git config --global http.proxy;或使用Nordic镜像源

总结复盘:搭建nCS环境的核心要点可以归纳为“一个工具链、两个环境变量、三条命令”。一个工具链指nrfutil管理的ARM GCC;两个环境变量是ZEPHYR_TOOLCHAIN_VARIANT和ZEPHYR_SDK_INSTALL_DIR;三条命令是west init、west update、west build。只要这三者正确,后续开发就会顺畅。此外,建议在项目初期就使用west build -t menuconfig熟悉Kconfig配置,使用west build -t guiconfig可视化查看设备树状态,这些工具能极大提升调试效率。

风险提示:不要随意升级nCS版本或Zephyr内核版本,除非你清楚manifest的变化。不同版本的BLE协议栈API可能有差异,升级后可能导致现有代码无法编译。建议为每个项目固定一个nCS版本,并在README中记录manifest的commit hash。