ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

nRF Connect SDK (NCS) 安装完全指南:从零搭建 Zephyr 开发环境

2026/10/1 12:14:31 拓冰建站 浏览量
nRF Connect SDK (NCS) 安装完全指南:从零搭建 Zephyr 开发环境 先说说我自己的经历。第一次装 nRF Connect SDKNCS的时候我整整花了两天。不是因为我不会装软件而是因为我对 NCS 的预期还停留在像 STM32CubeMX 一样解压即用的阶段结果它一上来就甩给我几十个 Git 仓库、一套 Python 工具链、一个构建系统外加一个交叉编译工具链。那种感觉就像你想装个电灯泡结果发现得先把整栋楼的电路重新捋一遍。这篇东西就是写给即将入坑 Nordic 芯片开发的朋友尤其是 nRF52、nRF53、nRF91 系列的新手。我会把 NCS 安装这件事彻底拆开讲明白为什么不建议把它当普通 SDK 看待、版本怎么选、图形化安装和命令行安装两条路线怎么走、怎么验证装好了、以及我踩过的几个坑。看完之后不管你用 Windows 还是 Linux应该都能自己独立把环境搭起来。1. 装之前先搞明白NCS 不是普通 SDK而是一个全家桶工程1.1 NCS 里面到底有什么nRF Connect SDKNCS是 Nordic Semiconductor 官方推出的软件开发套件但它不是传统意义上那种几个 .lib 文件加一堆头文件的 SDK。NCS 的本质是一套以 Zephyr RTOS 为核心的源码仓库集合官方把你做无线项目几乎能用到的所有东西都塞进了同一个大工程里。具体点说一次完整的west update之后你的本地至少会出现这些仓库nrfNordic 主仓库包含大量示例工程、驱动、子系统比如 BLE、Thread、Matter 相关的例程基本都在这里。zephyrZephyr RTOS 内核本身NCS 的底层操作系统。mcuboot引导程序做 OTA 升级时绕不开它。nrfxNordic 芯片寄存器级外设驱动类似你自己写的 HAL 层。nrfxlibNordic 的加密库、协议栈相关库。mbedtlsTLS/加密库做安全通信时用到。还有cmsis、hal_nordic、openthread、matter等子模块加起来二三十个仓库很正常。正因为是这种全家桶设计NCS 才能在同一个框架下同时支持 nRF52 的低功耗蓝牙、nRF53 的双核异构、nRF91 的蜂窝物联网。但代价就是安装复杂度直线上升。简单说装 NCS 不是一个解压 SDK的动作而是部署一整套现代嵌入式工程环境的动作。1.2 三个绕不开的概念west、Kconfig、设备树装 NCS 的过程中你一定会碰到三个名词。不理解它们你装完也不知道自己装了啥理解了三分钟就能说清装起来也更有底。第一个是 west。west 是一个用 Python 写的跨平台工具由 Zephyr 项目主导开发职责有两个一是项目管理二是构建前端。安装时执行的west init和west update就是在做项目管理——它读一个 manifest 仓库对 NCS 来说就是sdk-nrf里定义的清单然后把所有子模块按指定版本拉到本地。构建时执行的west build则是把 CMake、Ninja、编译器串起来。第二个是 Kconfig。Kconfig 是内核领域常见的配置系统NCS/Zephyr 用它管理所有功能开关和参数。你在工程目录里看到的prj.conf里面写的CONFIG_BTy、CONFIG_NRF_BT_LESC_PRIVACYy就是 Kconfig 语法。它的特点是配置项之间有复杂的依赖关系你改了一个开关可能连带改出几十个隐藏配置。装 NCS 阶段你不需要会写但要明白构建时系统会根据prj.conf和板级默认配置生成一个完整的.config文件编译行为就是由这个文件决定的。第三个是设备树Device Tree。设备树用文本文件描述硬件资源芯片有哪些外设、引脚怎么分配、外设的寄存器基地址是多少。Nordic 的每一块 DK 开发板都有现成的.dts/.dtsi文件。举例来说如果想把 UART 引脚从默认位置改到 P0.06/P0.08你要改的不是寄存器映射代码而是设备树节点里的pinctrl配置。这个概念对从寄存器开发转过来的人冲击最大但不影响安装。1.3 为什么必须先把全家桶逻辑搞清楚我把这些概念提前讲不是为了掉书袋而是因为它们直接决定了你接下来安装步骤的每一步。安装 NCS本质就三件事把一堆 Git 仓库从远程拉到本地west initwest update。装一套配套的编译工具链GCC for ARM、CMake、Ninja、Zephyr SDK。让构建系统把源码和工具链正确连接起来west build。如果你在安装之前就知道是这个逻辑那后面遇到下载了一大堆东西但不知道干嘛或者编译时找不到编译器这种问题你不会慌因为你知道问题多半出在第 2 步或第 3 步的衔接上。反之如果你只是照着某个教程一步步点装完后大概率会陷入文件那么多我该打开哪个的迷茫。我从论坛和群里看到了太多这种问题根本原因就是缺了这一层整体认知。2. 版本组合矩阵先定 NCS 版本再谈安装2.1 NCS 版本与芯片、工具链的匹配关系很多人一上来就问怎么装 NCS但很少有人先问装哪个版本的 NCS。这个问题不问清楚安装过程会非常痛苦。NCS 的版本号规则是vX.Y.Z的形式例如v2.9.0。在版本背后存在一条完整的约束链每个 NCS 版本绑定一个特定版本的 Zephyr 内核同时绑定一套特定版本的 ARM 交叉编译工具链GCC还有对应版本的 CMake、Ninja、west 等工具。更麻烦的是不同版本的 NCS 对芯片系列的支持程度也不同譬如某些 nRF53 系列的新特性只在较新的 NCS 版本里才可用。具体到安装时你需要注意如果用 nRF Connect for Desktop 的 Toolchain Manager它会自动为你选择的 NCS 版本匹配正确的工具链用户不需要手动选。如果用命令行nrfutil toolchain-manager install --ncs-version v2.9.0这种命令也会自动拉对应工具链。最怕的是自己用系统装的 GCC 去编译 NCS几乎没有一次能成功因为版本错位会引发大量编译错误。每个 NCS 版本对应哪个 Zephyr 版本、支持哪些芯片官方 Release Notes 都写得清清楚楚。安装前花两分钟看一眼比出错后花两小时排查值太多。2.2 选新还是选旧我的建议我的建议分两种情况。如果你是想快速学习、验证硬件直接选 Toolchain Manager 里显示的最新稳定版比如 v2.9.x 这类。不用纠结新版通常修了旧版大量 bug示例也在持续更新跟着官方 SDK 走最快。如果你是在做量产产品建议反向操作确认你要用的协议栈和芯片特性在某个版本上稳定运行后就锁定这个版本并把它记录到 west manifest 里。不要在产品开发中途追新版本那会带来连锁更新很可能今天还能编过明天某个依赖仓库一变项目就编不过了。我见过不少人被这种事折磨到怀疑人生本质上就是没有做版本锁定。还有一条铁律不要用 main 分支做产品。NCS 的 main 分支每天都在动示例接口、Kconfig 选项说改就改。你基于 main 写代码等于把房子盖在流沙上。2.3 版本跟随教程比跟随潮流更重要这里多说一句。很多新手刚学会安装就跑去网上搜教程结果发现教程里写的prj.conf配置项在自己的 SDK 里根本不存在或者示例代码的 API 长得不一样。这不是你装错了而是版本不一致。NCS 从 v1.x 到 v2.x中间经历过一次大规模重构很多旧接口直接废弃了。就算在 v2.x 内部不同小版本之间也经常出现 API 调整。所以我的经验法则特别简单你看的教程用什么版本你装什么版本。等把整个流程跑通了再考虑升级否则你连是不是版本问题都判断不了。3. 新手首选路线nRF Connect for Desktop 的 Toolchain Manager 安装全流程3.1 下载并安装 nRF Connect for Desktop如果你用的是 Windows或者只是想快速跑起来不用想太多直接用 Nordic 官方提供的 nRF Connect for Desktop。去官网下载对应系统的安装包。这里提个醒这个软件是基于 Electron 的桌面应用安装包体积不小200MB 起步下载时要有耐心。安装完成后打开侧边栏能看到一排工具 App找到 Toolchain Manager点 Install 把它装上。这一步基本没有坑唯一容易让人困惑的是为什么我装个 SDK 还要先装一个桌面软件。实际上 nRF Connect for Desktop 只是一个容器真正的工具链和 SDK 都由里面的 Toolchain Manager 来管理。3.2 用 Toolchain Manager 下载 Toolchain 和 SDK打开 Toolchain Manager 后界面顶部会列出 Nordic 支持的 NCS 版本比如 v2.6.0、v2.7.0、v2.9.0 等。选择一个版本点击 Install它就会开始下载。这一阶段要重点说明Toolchain Manager 不只是下载编译器它会一次性把整个 NCS 依赖的 SDK 源码、Zephyr 内核、所有子模块以及编译工具链全部拉下来。所以下载体积通常在 1.5GB 到 2GB 以上时间长短完全取决于网络情况。下载完成后你可以看到 SDK 被安装到特定目录。在 Windows 上一般是C:\Users\你的用户名\ncsLinux 上默认在~/ncs这个目录结构是以后所有项目的根目录。如果你想省事可以在这个界面直接点Open VS Code它会自动把 nRF Connect for VS Code 扩展和对应的工具链环境一起准备好。3.3 在 VS Code 里创建工程、编译并烧录Toolchain Manager 装好后你的开发环境其实已经算搭好了剩下的问题只是怎么把代码写出来并跑起来。实际上 Nordic 官方推荐的做法是配合 VS Code 扩展使用。流程如下打开 VS Code确保 nRF Connect 扩展已在侧边栏出现。点击侧边栏的 nRF Connect 图标。选择 Create a new project 或者直接 Open a sample。在弹出的窗口里选一个示例我强烈建议第一次选peripheral_blinky原因后面再说。选择你的开发板型号比如 nRF52840 DK 就选nrf52840dk_nrf52840。项目生成后在 Actions 面板点 Build 编译。点击 Flash通过板载调试器把固件烧到板子里。如果你手头有 nRF52840 DK做完这一套板载 LED 应该就开始闪烁了。这就是 NCS 安装成功的第一个可见信号。3.4 图形化安装路线的优缺点我用这个方案带过好几个实习生它的优点确实明显不需要手动敲命令对 Windows 新手极其友好。版本绑定由工具自动处理几乎不会出现工具链不匹配。后续切工程、看日志、管理多个 SDK 版本都方便。但它也有硬伤下载过程 GUI 偶尔看起来像假死进度条半天不动。别慌等就行或者看任务管理器里的网络占用。不适合无显示器环境也没法脚本化批量部署。对于习惯命令行的工程师来说按钮再多也不如一句west build直接。所以如果你未来有 CI/CD 自动化、服务器编译、或者深度定制环境的需求请直接看下面的命令行路线。4. 进阶路线Linux 下用命令行完整安装 NCS4.1 准备系统依赖我个人日常开发主力是 Ubuntu 22.04 LTS这一节就以它为基准。如果你用其他发行版包管理命令稍有区别但依赖项大差不差。在一台干净的 Ubuntu 上先执行sudo apt update sudo apt install -y \ 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你会注意到这一串包分了几类cmake和ninja-build底层构建系统west 在背后调用的就是它们。gperf和device-tree-compilerZephyr 构建时解析 Kconfig 和设备树文件的工具。python3-*系列NCS 的工具链大量依赖 Python 包。libsdl2-dev只在编译 native_sim 模拟器目标时需要没有它也不影响板子编译但有了它你可以在 PC 上直接跑 Zephyr 程序。这些包一次装齐比后面缺一个装一个省心得多。4.2 安装 nrfutil 并拉取 ToolchainNCS 官方这几年一直在推nrfutil这个命令行工具它替代了早期一堆分散的脚本。安装方式很简单pip3 install nrfutil export PATH$PATH:~/.local/bin然后安装指定版本的 Toolchainnrfutil toolchain-manager install --ncs-version v2.9.0这条命令背后的逻辑值得说一下。它会去 Nordic 的服务器下载一个预先构建好的目录里面包含了 NCS 编译需要的完整工具链ARM GCC 交叉编译器、CMake、Ninja、Zephyr SDK以及被 NCS 锁定好版本的各种 Python 依赖。安装完成后工具链默认被放在~/ncs/toolchains/下的某个带哈希值的子目录中。排错时记住这个路径后面会用到。4.3 用 west 拉取 NCS 源码工具链就绪后接下来拉取源码。先创建 NCS 根目录并进入mkdir ~/ncs cd ~/ncs pip3 install west然后初始化 workspace。这里要特别注意 manifest 仓库和 manifest revision 这两个概念west init -m https://github.com/nrfconnect/sdk-nrf.git --mr v2.9.0-m指定 manifest 仓库地址对 NCS 来说就是sdk-nrf--mr全称是--manifest-rev用来指定拉取哪个分支或标签。我每次都写v2.9.0这种明确的 tag而不是 main原因在 2.2 里已经说过了。执行完后west update这一步就是真正把 sdk-nrf 之外的所有子仓库全部拉到本地。请把~/ncs放到一块空间充足的 SSD 上这个目录很快会长到 10GB 以上。首次west update可能要花比较久取决于网络。4.4 进入 Toolchain 环境并编译装好之后直接执行west build大概率会失败报错要么是找不到cmake要么是找不到 Zephyr SDK。这是因为你的当前 shell 还没有加载 Toolchain 的环境变量。正确做法是用 nrfutil 启动一个配置好的子 shellnrfutil toolchain-manager launch --shell这个命令会把你刚才在 4.2 里安装的~/ncs/toolchains/xxxx目录里的所有路径变量注入当前 shell包括PATH、ZEPHYR_TOOLCHAIN_VARIANT等。之后你在这个 shell 里执行west build才能顺利找到一切。这里我建议你把虚拟环境也一并配好。NCS 的 Python 包依赖非常多全部装到系统 Python 里容易产生冲突养成用 venv 的习惯能省很多事python3 -m venv ~/ncs/.venv source ~/ncs/.venv/bin/activate pip3 install west以后每次构建前先执行source ~/ncs/.venv/bin/activate再执行nrfutil toolchain-manager launch --shell保证环境干净。5. 烧录验证把 Blinky 跑起来证明安装不是纸面成功5.1 为什么第一个示例我推荐 blinky装完环境后很多人喜欢直接去跑一个大而全的 BLE 示例比如peripheral_uart或heart_rate_monitor结果编译了十几分钟报了一堆看不懂的错心态直接崩掉。我的建议是第一个工程务必选nrf/samples/blinky。理由很简单——它只涉及一个 GPIO 反转操作不初始化蓝牙协议栈不依赖射频相关配置编译时间最短出错环节最少。用它能最大化验证你的安装是否真正可用而不是你的蓝牙代码写得对不对。5.2 编译过程到底发生了什么进入示例目录cd ~/ncs/nrf/samples/blinky west build -b nrf52840dk_nrf52840 -d build这里-b指定目标板-d指定构建输出目录。如果是第二次构建建议加--pristine清掉缓存避免旧配置干扰west build -b nrf52840dk_nrf52840 --pristine在编译过程中CMake 会做一堆事情解析目标板的设备树扫描所有相关模块的 Kconfig 配置生成中间文件最后调用 ARM GCC 把全部源码编译链接成固件。结束时终端会打印出 RAM/Flash 占用情况类似Memory region Used Size Region Size %age Used FLASH: 14020 B 1 MB 1.34% RAM: 4272 B 256 KB 1.63%看到这个输出基本可以确定环境没问题。生成的关键产物有两个build/zephyr/zephyr.elf带调试信息的可执行文件和build/zephyr/zephyr.hex烧录用 hex。再补充一种不需要任何硬件的验证方式。如果你手头没有 DK 板可以让 Zephyr 以模拟器方式在 PC 上直接运行cd ~/ncs/zephyr/samples/hello_world west build -b native_sim ./build/zephyr/zephyrnative_sim是 Zephyr 的模拟目标板编译产物就是一个普通的 Linux/Windows 可执行文件运行后能看到Hello World!打印。需要提醒的是老教程里这个板名叫native_posix在新版本里已经改成了native_sim注意区分。5.3 烧录到真实开发板连接上 nRF52840 DK确保板载调试器被系统识别然后执行west flashwest flash会自动调用底层的烧录工具Nordic DK 板载的是 J-Link 调试器所以 Linux 下通常需要把用户加入dialout组sudo usermod -aG dialout $USER然后重新登录。执行完west flash看到绿色 LED 闪烁这就是 NCS 安装成功的最终实锤。6. 安装后最容易翻车的几个问题以及我的处理方法6.1 Windows 的长路径问题Windows 用户第一次跑west update时最常遇到的错误就是路径太长导致的 clone 失败。这是因为 NCS 的仓库结构非常深很容易超过 Windows 默认的 255 字符路径限制。解决方法有两个建议同时做git config --system core.longpaths true这个命令用管理员权限打开终端执行。还有一个更彻底的办法把整个ncs目录直接放到盘符根部比如C:\ncs不要放在C:\Users\你的名字\Documents\这种长路径下面。路径短了很多莫名其妙的文件访问错误也会自动消失。6.2 首次 west update 网络中断怎么办west update需要拉取几十个仓库就算网络条件不错中断一次也很正常。关键是你要知道两件事第一west 和 git 都支持断点重入。中断后重新执行west update它会跳过已经拉取成功的仓库从失败的地方继续不会从头再来。所以别怕重试就好。第二你可以通过调大 git 的 HTTP 缓冲来降低中断概率git config --global http.postBuffer 1048576000如果某个仓库反复拉取失败要么换个网络环境试试要么错峰重试。等一到两个小时后网络空闲期再跑一遍往往就通了。不要试图手动改动 west 的 manifest 去绕过某个仓库那会把依赖关系搞乱。6.3 Toolchain 与 SDK 版本不匹配的典型报错这类报错常见于用旧版工具链编译新版 SDK或反之。报错信息通常长这样ERROR: Zephyr SDK version x.x.x is not supported或者编译过程中出现一堆-march...相关的错误。根源就是编译器版本太老不认识新内核的编译参数。处理方法很固定卸载当前 toolchain重新安装与你的 NCS 版本严格配套的 toolchainnrfutil toolchain-manager uninstall --ncs-version v2.9.0 nrfutil toolchain-manager install --ncs-version v2.9.0如果是用 Toolchain Manager 安装的直接在 GUI 上把版本下拉框切到和你的工程一致的版本再重新编译即可。6.4 pip 依赖冲突如果你这台机器上装过很多 Python 包直接在系统级pip3 install west有可能把某些包白屏升级导致其他工具挂掉。更稳妥的方式是我在 4.4 里提到的 venv 方案python3 -m venv ~/ncs/.venv source ~/ncs/.venv/bin/activate pip3 install west一旦用了虚拟环境你会发现版本冲突问题大幅减少。尤其是在多项目并行的服务器上这个习惯极其重要。6.5 同时维护多个 NCS 版本的环境污染我平时同时维护两个客户项目一个锁在 v2.6.0一个锁在 v2.9.0很容易出现切到另一个项目就编不过的情况。排查下来大部分时候是环境变量还停留在上一个 toolchain 目录。我的操作习惯是每个项目独立目录比如~/work/proj_a、~/work/proj_b。每个目录内各自执行对应版本的west init和west update。每次构建前用nrfutil toolchain-manager launch --shell切进当前项目配套的 toolchain 环境。在项目根目录放一个.env文本记录 NCS 版本号和 toolchain 哈希目录方便一个月后回来看还认得。这样一套流程下来环境混乱基本被消灭剩下的就是纯粹的代码问题。6.6 学会读构建日志最后补一个通用排查技能构建报错时不要只看终端最后几行就慌着去百度。先确认几个位置本次构建的 Kconfig 配置项在build/zephyr/.config里想确认某个开关是否生效去那里搜。最终合并后的设备树在build/zephyr/zephyr.dts想确认引脚配置是否生效去那里搜。最关键的报错一般在终端输出的最后 20 行内如果是链接错误前面往往有undefined reference字样那是缺失函数导致的。掌握了读日志很多问题你都不需要问别人自己看一眼就明白。装 NCS 这件事说难也难说简单也简单关键看你怎么定义装完。我见过不少人安装完 GUI打开 VS Code 点了 Build看到 LED 闪烁就觉得完事了结果一写自己的代码就到处碰壁。我的习惯是每次在新电脑上配 NCS都会把创建虚拟环境 → west init → west update → 编译 blinky → 编译 native_sim 模拟器 → 烧录到真实开发板这一整条链路完整跑通。因为这条链路覆盖了环境变量、依赖、构建系统、烧录工具的所有环节任何一环没配对后面都会被放大成疑难杂症。花半天把工作台打扎实比后面三天两头排查环境问题划算得多。