前两课完成了开发环境搭建、GPIO 基础操作与设备树入门,第三课《Elements of an nRF Connect SDK application》则是真正掌握工程构建、配置管理与自定义开发的核心一课。本课将完整拆解一个 nRF Connect SDK 应用的所有必备组成要素,从 Kconfig 配置、CMake 构建系统、设备树覆盖层,到多镜像构建(Sysbuild),再到从零创建可运行工程,让开发者彻底理解工程从源码到可执行文件的全流程,为后续自主开发、功能裁剪与工程定制打下坚实基础。
本课面向嵌入式固件工程师、物联网终端开发者,是从 “会跑示例” 走向 “自主建工程” 的必备进阶内容。
课程定位:掌握应用工程的构建与配置全流程
在 nRF Connect SDK 中,任何可编译运行的应用都由一套固定的文件与配置体系支撑,而非简单的单份 main.c 文件。构建系统、配置系统、设备树、源码结构共同决定了工程能否正确编译、功能是否启用、硬件如何映射。
本课以最小工程结构为切入点,围绕 Kconfig 配置、CMake 构建、设备树覆盖层、Sysbuild 多镜像、实操创建工程 五大核心知识点展开,手把手带你从空白文件夹开始,搭建出可打印 “Hello World” 的最小应用,并进一步实现自定义函数、自定义配置、修改串口波特率等高级定制。学完本课,你将具备独立创建、裁剪、定制 nRF Connect SDK 应用的能力。
核心学习目标
完成本课学习后,你将建立 nRF Connect SDK 应用工程的完整知识体系,核心掌握:
- 理解一个 nRF Connect SDK 应用的标准文件结构与各文件作用
- 掌握 prj.conf 与板级配置的关系,理解配置优先级规则
- 学会使用 nRF Kconfig GUI 可视化开启 / 关闭功能模块
- 理解设备树覆盖层(overlay)的作用与使用方法,不修改底层文件实现硬件定制
- 掌握 CMakeLists.txt 基本写法,理解构建系统如何组织源码
- 了解 Sysbuild 多镜像构建系统,知晓多核 / 安全启动场景下的镜像管理
- 从零创建最小应用工程,并实现自定义函数、自定义配置、修改设备树
核心知识模块:从配置到构建的全流程拆解
本课的核心知识围绕 配置系统 → 构建系统 → 设备树覆盖层 → 多镜像构建 → 实操创建 五层架构展开,所有知识点均以最小工程为案例落地,理论与实践一一对应。
模块一:Kconfig 配置系统 —— 应用功能的开关与调节器
nRF Connect SDK 采用 Kconfig 作为统一的软件配置系统,所有功能模块、内核服务、驱动开关都通过配置符号(CONFIG_*)控制,这是实现应用功能裁剪、体积最小化的核心机制。
1. 两类核心配置文件
每个应用必须拥有的配置文件,格式为 CONFIG_符号名=值,用于开启 / 配置当前应用所需的模块,优先级最高。
CONFIG_GPIO=y
CONFIG_SERIAL=y
位于 SDK 内的板级默认配置,提供该开发板的基础驱动使能(如 UART、GPIO、Console),严禁直接修改,如需覆盖需在 prj.conf 中重新定义。
2. 配置优先级规则
当同一个 CONFIG 符号同时出现在 prj.conf 与板级配置中时,应用配置文件 prj.conf 的值永远优先生效。
3. nRF Kconfig GUI 可视化配置
nRF Connect for VS Code 提供图形化配置工具,可浏览、搜索、勾选功能,自动同步到 prj.conf:
- 路径:ACTIONS → nRF Kconfig GUI
- 支持搜索(如搜索 GPIO/UART)
- 三种保存方式:Apply(临时)、Save to file(永久写入 prj.conf)、Save minimal(最小变更)
- 从 NCS v2.8.0 开始,Sysbuild 为默认构建系统,需先选中应用镜像再打开 Kconfig GUI
4. 配置查看方式
- VS Code 中鼠标悬停可查看 CONFIG 符号说明
- 查阅 nRF Connect SDK 官方文档
- Kconfig GUI 内查看详情
模块二:构建系统与关键文件 ——CMake、Sysbuild 与设备树覆盖层
nRF Connect SDK 基于 CMake 构建,配合 Sysbuild 管理多镜像工程,同时使用设备树覆盖层(Overlay) 安全修改硬件描述,不破坏底层设备树文件。
1. CMake 与 CMakeLists.txt
所有 NCS 应用都是 CMake 工程,CMakeLists.txt 是构建入口文件,定义工程最低版本、引入 Zephyr、指定源码文件。
最小工程必备内容:
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(hello_world)
target_sources(app PRIVATE src/main.c)
2. 设备树覆盖层(Devicetree Overlays)
不推荐直接修改 SDK 自带设备树(.dts/.dtsi),使用 .overlay 覆盖文件可安全修改硬件配置:
- 文件名:<board_target>.overlay
- 存放位置:应用根目录或 boards 子文件夹
- 作用:使能节点、修改引脚、更改波特率等
示例(修改 UART0 波特率为 9600):
&uart0 {
current-speed = <9600>;
};
3. Sysbuild 多镜像构建系统
- 从 NCS v2.8.0 开始默认启用
- 用于管理多核(如 nRF5340)、安全启动、多核无线协议等多镜像场景
- Sysbuild 配置文件:sysbuild.conf、Kconfig.sysbuild
- 配置前缀:SB_CONFIG_*
- 已废弃:旧版多镜像(parent/child images)
4. Trusted Firmware-M(TF-M)安全分区
针对 nRF54/nRF53/nRF91 等 Armv8-M 架构芯片,支持安全 / 非安全分区:
- <board_target>:单镜像,无安全隔离
- <board_target>/ns:非安全镜像,TF-M 运行在安全环境
模块三:应用标准文件结构 —— 最小工程必备文件
一个可独立编译的最小 nRF Connect SDK 应用必须包含以下文件:
app/
├── CMakeLists.txt # 构建脚本
├── prj.conf # 应用配置
└── src/
└── main.c # 应用入口
可扩展文件:
- Kconfig:自定义配置符号
- <board_name>.overlay:设备树覆盖层
- boards/:板级专属覆盖层与配置
实操练习:从零创建应用 + 自定义工程
本课包含两个核心实操,完全遵循官方步骤,可直接复现。
练习 1:从零创建最小 Hello World 应用
目标:从空白文件夹开始,创建可编译、可烧录、周期性打印日志的应用。
- 创建文件夹 l3_e1,建立最小文件结构
- 编写 CMakeLists.txt(使用最小模板)
- prj.conf 留空(板级配置默认开启 Console)
- 编写 src/main.c
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
int main(void)
{
while (1) {
printk("Hello World!\n");
k_msleep(1000);
}
}
- 在 VS Code 中打开应用,添加构建配置
- 编译、烧录
- 打开串口终端(115200 8N1)查看输出
*** Booting nRF Connect SDK ***
*** Using Zephyr OS ***
Hello World!
Hello World!
练习 2:自定义应用 —— 添加函数、配置、修改设备树
基于练习 1 工程,实现三大定制:
1. 添加自定义函数
- 创建 src/myfunction.c / myfunction.h
- 实现求和函数 sum()
- 在 CMakeLists.txt 中添加源文件
target_sources(app PRIVATE src/myfunction.c)
2. 添加自定义 Kconfig 配置
- 应用根目录创建 Kconfig 文件
source "Kconfig.zephyr"
config MYFUNCTION
bool "Enable my function"
default n
- 在 prj.conf 使能
CONFIG_MYFUNCTION=y
- CMake 中条件编译
target_sources_ifdef(CONFIG_MYFUNCTION app PRIVATE src/myfunction.c)
- main.c 中条件调用
#ifdef CONFIG_MYFUNCTION
#include "myfunction.h"
#endif
3. 使用设备树覆盖层修改 UART 波特率
- 创建 <board_target>.overlay
- 修改 UART 波特率为 9600
&uart0 {
current-speed = <9600>;
};
- 全新编译(Pristine build)
- 串口终端改为 9600 波特即可正常接收日志
课后测评:检验应用组成知识的掌握程度
本课配套官方课后测评,检验你对配置系统、构建系统、工程结构、设备树覆盖层的理解。
测评核心考察点
- 应用文件结构:最小工程必备文件、各文件作用
- Kconfig 配置:prj.conf 与板级配置关系、优先级、Kconfig GUI 使用
- 构建系统:CMakeLists.txt 作用、Sysbuild 基本概念
- 设备树覆盖层:overlay 文件命名、语法、使用场景
- 实操能力:创建工程、条件编译、修改串口波特率
完成测评可快速定位薄弱点,确保完全掌握应用组成与构建流程。
本课的学习价值:搭建自主开发的工程基础框架
第三课是 nRF Connect SDK 开发从示例复用走向自主创造的分水岭:
- 彻底理解工程从源码到可执行文件的构建链路
- 掌握配置裁剪能力,让应用体积最小、资源占用最优
- 学会安全定制硬件描述,不破坏 SDK 底层文件
- 理解多镜像构建,为后续多核开发、蓝牙、Mesh、Matter 打下基础
- 所有知识点适用于 UART、I2C、SPI、无线等所有外设开发