3、开发环境搭建:安装nRF Connect SDK、Zephyr RTOS、编译工具链,配置VS Code或命令行环境,并完成第一个LED闪烁例程
nRF Connect SDK(nCS)是Nordic Semiconductor推出的统一软件开发套件,它基于Zephyr RTOS构建,集成了协议栈、驱动、板级支持包(BSP)以及丰富的应用示例。搭建一个可靠、可复现的开发环境,是后续实现温湿度传感器数据采集、异常检测算法和蓝牙告警功能的基础。本章将系统讲解从零开始搭建nCS开发环境的完整流程,涵盖工具链安装、VS Code与命令行两种工作流的配置,并通过一个LED闪烁例程验证环境正确性。
上图展示了从主机环境到目标硬件烧录调试的完整工具链链路。整个环境搭建的核心思路是:用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。
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扩展包,它集成了项目创建、构建、烧录、调试、设备树可视化等功能。安装方式:
- 在VS Code扩展市场搜索“nRF Connect”并安装(Nordic Semiconductor官方发布)。
- 安装完成后,按
Ctrl+Shift+P,输入“nRF Connect: Open Welcome Page”。 - 在欢迎页中,点击“Select a Toolchain”,选择之前通过nrfutil安装的v2.6.1工具链路径(通常位于
~/.nrfutil/toolchains/)。 - 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的启动日志。
-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路径。
实际操作步骤:
- 检查环境变量:
echo $ZEPHYR_TOOLCHAIN_VARIANT,发现输出为空。 - 在launch的shell中,手动设置:
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr。 - 找到Zephyr SDK的实际安装路径:
find ~/.nrfutil -name "zephyr-sdk*" -type d,得到路径如~/.nrfutil/toolchains/v2.6.1/opt/zephyr-sdk。 - 设置
export ZEPHYR_SDK_INSTALL_DIR=~/.nrfutil/toolchains/v2.6.1/opt/zephyr-sdk。 - 重新执行
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可视化查看设备树状态,这些工具能极大提升调试效率。