1. 课程导入与开发环境搭建

智能家居无线终端,本质上是一台“带无线连接能力、可长期低功耗运行、能直接或间接接入家庭网络”的嵌入式设备。它可能是一枚温湿度传感器、一只门磁、一个墙面开关,也可能是一盏可调色温的灯。与手机、路由器这类“强算力、常供电”的设备不同,这类终端通常由电池供电,需要数月甚至数年不换电池,同时还要保证数据能可靠地送达网关或云端。Nordic nRF 系列芯片正是围绕这一需求设计的:以 Cortex-M 内核为计算核心,集成 2.4 GHz 多协议射频,配合成熟的协议栈与 SDK,让开发者把精力放在“业务逻辑”而不是“射频调通”上。

本课程以 Nordic 官方主推的 nRF Connect SDK(简称 NCS)为主线,从零搭建开发环境,并完成第一个可烧录、可观察的 LED 闪烁工程。这一章不追求功能复杂,而是把“工具链—工程—编译—烧录—观察”这条链路彻底打通,后续所有章节都建立在这条链路之上。

1.1 无线终端的典型构成与选型思路

一个典型的智能家居无线终端,硬件上大致分为四部分:主控与射频(nRF 芯片)、传感或执行单元(温湿度传感器、继电器、LED 驱动等)、供电与电源管理(纽扣电池、DC-DC、LDO)、调试与量产接口(SWD 调试口、串口日志、OTA 升级通道)。软件上则分为应用层、协议栈层(蓝牙 LE、Thread、Zigbee、Matter 等)和底层驱动(GPIO、I2C、SPI、ADC、PWM)。

Nordic 目前在售的主流型号可以按“算力—内存—射频能力”三个维度来选:

型号内核Flash / RAM无线能力典型用途
nRF52810Cortex-M4192 KB / 24 KB蓝牙 LE低成本传感器、Beacon
nRF52832Cortex-M4F512 KB / 64 KB蓝牙 LE、ANT、2.4G 私有通用终端、可穿戴
nRF52840Cortex-M4F1 MB / 256 KB蓝牙 LE、Thread、Zigbee、USBMatter 终端、网关从机
nRF5340双 Cortex-M331 MB / 512 KB蓝牙 LE Audio、Thread、Zigbee高端终端、音频设备
nRF54L15Cortex-M331.5 MB / 256 KB蓝牙 LE、Thread、2.4G 私有新一代低功耗终端

选型时先问三个问题:需要跑什么协议(只跑蓝牙 LE,nRF52810/52832 足够;要跑 Thread 或 Matter,至少 nRF52840)、固件有多大(带 OTA 双区升级时,Flash 需求会翻倍)、要不要 USB 或音频(需要则直接看 nRF52840 或 nRF5340)。本课程后续示例以 nRF52840 DK 为默认开发板,它资源充足、资料最全,适合把协议栈、OTA、低功耗等知识点都跑一遍。

1.2 nRF Connect SDK 与工具链安装

NCS 是 Nordic 基于 Zephyr RTOS 构建的完整 SDK,包含协议栈、驱动、示例和构建系统。它和早期的 nRF5 SDK 最大的区别是:NCS 用 Zephyr 的设备树(Devicetree)和 Kconfig 来描述硬件与配置,工程结构更统一,跨芯片移植更容易。安装 NCS 推荐使用 nRF Connect for VS Code 扩展,它把工具链、SDK、调试器都集成在 VS Code 里,避免手动配置环境变量。

安装流程可以概括为四步:

  1. 安装 VS Code,并在扩展市场搜索安装 nRF Connect for VS Code Extension Pack。
  2. 打开 nRF Connect 侧边栏,进入 Manage toolchains,安装一个工具链版本(例如 v2.6.x),它会自动下载 arm-zephyr-eabi 编译器、CMake、Ninja、west 等。
  3. 进入 Manage SDKs,安装对应版本的 NCS(例如 v2.6.0)。SDK 会以 west 工作区形式下载到本地。
  4. 连接 nRF52840 DK,安装 nRF Command Line Tools(含 nrfjprog 和 J-Link 驱动),确保能识别到板子。

安装完成后,可以在终端验证:

west --version
nrfjprog --version
nrfjprog --ids

如果 nrfjprog --ids 能打印出类似 1050123456 的序列号,说明调试器与板子通信正常。这一步是后续烧录的前提,务必先确认。

建议把工具链和 SDK 安装在默认路径(Windows 下通常是 C:\ncs),路径中不要有中文和空格,否则 CMake 和 west 容易报错。

1.3 第一个 LED 闪烁工程:从创建到烧录

NCS 自带大量示例,LED 闪烁最经典的入口是 zephyr/samples/basic/blinky。在 VS Code 中打开 nRF Connect 侧边栏,选择 Create a new application,然后选择 Copy a sample,搜索 blinky,指定目标板为 nrf52840dk/nrf52840,选择刚才安装的 SDK 版本,最后指定工程存放目录。创建完成后,工程目录里会出现 CMakeLists.txt、prj.conf、src/main.c 等文件。

打开 src/main.c,核心逻辑非常短:

#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

#define LED0_NODE DT_ALIAS(led0)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

int main(void)
{
    if (!gpio_is_ready_dt(&led)) {
        return 0;
    }
    gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);

    while (1) {
        gpio_pin_toggle_dt(&led);
        k_msleep(500);
    }
    return 0;
}

这里有两个关键点值得注意。第一,DT_ALIAS(led0) 不是直接写引脚号,而是通过设备树别名找到 LED0。nRF52840 DK 的板级设备树里已经把 led0 映射到 P0.13,所以代码与硬件解耦,换板子时通常不用改应用代码。第二,gpio_pin_toggle_dt 配合 k_msleep(500) 实现 500 ms 翻转一次,也就是 1 Hz 闪烁,肉眼很容易观察。

编译时,在 nRF Connect 侧边栏选择 Build,构建配置选 debug 或 release 均可。构建成功后,选择 Flash,工具会调用 west flash,通过 J-Link 把固件写入 nRF52840。烧录完成后,板子上的 LED1(对应 led0)应以约 1 秒周期亮灭交替。

如果 LED 不闪,按以下顺序排查:

  • 确认 nrfjprog --ids 能识别到板子,否则检查 USB 线和 J-Link 驱动。
  • 确认构建目标板选择的是 nrf52840dk/nrf52840,而不是其他型号。
  • 确认烧录后按了复位键,或重新上电,避免程序停在旧状态。
  • 用串口工具打开对应 COM 口,查看是否有启动日志输出,判断程序是否真正运行。

下面这张图把“选型—环境—工程—烧录—观察”这条链路的关键对象和判断点集中呈现出来,便于在动手前先建立整体印象。

nRF 智能家居终端开发链路:从选型到第一个 LED 工程 ① 芯片选型 协议需求 Flash / RAM 余量 USB / 音频 / OTA 本课程:nRF52840 DK 蓝牙 LE / Thread / Zigbee ② 工具链安装 VS Code + nRF Connect Toolchain v2.6.x NCS SDK v2.6.0 nrfjprog --ids 验证 J-Link 驱动 + 命令行工具 ③ 创建工程 Copy sample: blinky 目标板 nrf52840dk main.c + prj.conf DT_ALIAS(led0) → P0.13 设备树解耦硬件引脚 ④ 编译与烧录 Build (west build) Flash (west flash) J-Link → SWD 复位后运行 LED1 以 1 Hz 闪烁 结果观察与常见排障 LED1 亮灭交替 周期约 1 s 串口日志输出 确认程序已启动 不闪:查 nrfjprog --ids 板型 / 复位 / 供电 换板子只改设备树 应用代码基本不动 关键约定 工具链与 SDK 路径不含中文和空格;构建目标板必须与实物一致;烧录后先复位再观察 设备树别名 led0 在 nRF52840 DK 上映射到 P0.13,代码通过别名访问,不直接写引脚号