# 【Thingy:91X】测评 篇二:Thingy:91X开发介绍
### 开发环境准备
Thingy:91X的开发环境基于Nordic Semiconductor的nRF Connect SDK,官方提供了一套Vscode插件,可以帮助开发者快速搭建开发环境;另外,Nordic Semiconductor还提供了nRF Connect for Desktop和nRF util等可利用的工具。
#### 安装nRF Connect 工具链
> 工具链包含编译器、链接器和其他构建工具。
在Vscode中的nRF Connect插件中,选择`Install Toolchain`并指定版本,可以自动完成安装工具链,这里是支持断点续传的,如果中途下载失败,可以重新开始,它会自动跳过已经下载的部分。
nRFutil也提供了工具链管理的功能,只需要先安装可选指令`nrfutil install sdk-manager`,之后就可以通过`nrfutil sdk-manager toolchain install --ncs-version version`自动安装指定工具链。
#### 拉取nRF Connect SDK
> SDK包含源代码、库、驱动和示例。
nRF Connect SDK的代码库较大,拉取时间较长,拉取过程会同步许多子模组仓库,网络不稳定的话可能会导致拉取失败,需要手动进入nRF终端进行`west update`来更新子模组仓库。
在Vscode的nRF Connect插件中,我们可以通过Manage SDKs选择一个SDK版本进行安装,它会拉取sdk-nrf的代码库初始化为一个west工作区,然后进行update操作。如果update失败,可以手动进入nRF终端进行`west update`来更新子模组仓库,全部拉取完成后,再执行`west zephyr-export`指令,此时点击扩展提供的刷新按钮或者重启Vscode,我们拉取的SDK版本就能被识别在列表中了。
官方的扩展包提供了nRF终端扩展,可以直接在Vscode中使用nRF终端进行操作,入口如图:
这样我们就可以不通过直接使用nRFutil命令工具让终端进入nRF环境了。
NCS集成了 Zephyr RTOS 以及各种完整的应用、示例和协议栈,如低功耗蓝牙、蓝牙网格、Wi-Fi、Matter、Thread/Zigbee 和 LTE-M/NB-IoT/GPS、TCP/IP。 它还包括 CoAP、MQTT、LwM2M 等中间件、各种库、硬件驱动程序、TFM-M和MCUBoot。
- nRF Connect SDK几个重要目录
nrf/applications/: 接近商业应用的完整示例。
nrf/samples/ & zephyr/samples/: 功能或协议的基础示例。
zephyr/tests/: 各模块的测试代码,查找API用法的重要资源。
modules/hal/nordic/nrfx/samples/src/: 底层nrfx驱动示例。
nrf/include/ & zephyr/include/zephyr/: 公共API头文件。
modules/hal/nordic/nrfx/drivers/include/: 底层nrfx驱动API头文件。
zephyr/boards/ & nrf/boards/: 板级支持文件(DTS, Kconfig, defconfig)。
zephyr/drivers/: Zephyr标准驱动实现。
zephyr/subsys/: Zephyr子系统(网络、文件系统、蓝牙等)。
dts/: SoC级Device Tree文件。
### ncs工程概览
> ncs工程与Zephyr工程的结构基本一致,他内嵌了Zephyr RTOS的所有功能,并沿用了Zephyr的编译系统。
#### 项目结构
> nRF项目使用`Kconfig`作为配置工具,使用`CMake`作为构建系统,并且采用Linux常见的`Device Tree`构建板级支持。
我们可以在nRF Connect SDK的samples目录下找到许多示例项目,下面以hello_world为例,我们可以看到:
```
hello_world
├── CMakeLists.txt
├── prj.conf
├── src
│ └── main.c
└── sample.yaml
```
NCS工程使用CMake作为构建系统,不同于传统IDE(如Keil)基于图形界面的工程管理方式。
每个NCS工程(或模块)的核心是CMakeLists.txt文件。它使用CMake语法来:
- 指定项目名称。
- 添加源文件 (target_sources)。
- 添加包含目录 (target_include_directories)。
- 链接库 (target_link_libraries)。
- 查找并包含Zephyr内核及其他模块 (find_package(Zephyr REQUIRED HINTS...))。
- 设置编译选项和定义。
Zephyr和NCS的各个组件(驱动、协议栈、库)都在其各自目录下包含CMakeLists.txt和Kconfig文件。顶层应用的CMakeLists.txt通过`find_package(Zephyr ...)`触发整个构建系统,系统会根据Kconfig配置递归地包含所需模块的CMakeLists.txt,从而自动添加必要的源文件和依赖。
例如,hello_world示例的CMakeLists.txt看似只添加了main.c,但编译时,由于Kconfig默认启用了内核和串口(依赖于所选Board),相关的驱动和内核文件(及其CMakeLists.txt)会被自动包含进来。
> 注意标准命名: CMakeLists.txt, Kconfig, prj.conf, app.overlay,
.overlay, pm_static.yml 等都是具有特殊含义的标准文件名,编译系统会自动识别它们。使用非标准名称的文件需要手动指定生效。
#### 构建项目编译配置
> 编译NCS工程前必须指定目标硬件板(Board)。
Board的作用: 类似于Keil中选择Device,Board定义了:
- 目标芯片型号 (SoC)。
- 硬件布局(引脚分配、外设连接)。
- 默认的外设启用状态。
- 内存布局(Flash/RAM起始地址和大小,分区信息)。
Board定义位置: 标准Board定义通常位于 zephyr/boards// 或 nrf/boards// 目录下。
> 示例项目根目录下的 sample.yaml 文件通常会列出该示例经过测试并支持的Board列表。
Board命名通常格式为 ///。例如 nrf54l15dk/nrf54l15/cpuapp/ns 表示nRF54L15 DK开发板,使用nRF54L15 SoC的应用核(Cortex-M33),运行在非安全域(通常需要TF-M或SPM)。
内存布局:
- 单映像应用的Flash/RAM布局通常在板级Device Tree文件 (.dts) 的 partitions 节点中定义。
- 多映像应用(如带Bootloader)的布局由Partition Manager (PM) 管理,通常通过 pm_static.yml 或 partitions.yml 文件定义。
##### 使用Kconfig和DeviceTree配置工程
NCS/Zephyr使用Kconfig和DeviceTree两大系统来配置软件功能和硬件资源,它们最终都会生成C头文件供代码使用,但我们不能直接修改生成的头文件,而是通过Kconfig和DeviceTree的配置文件来控制生成的内容。
**Kconfig (软件配置):**
作用: 控制软件模块(内核特性、驱动、协议栈、库、应用程序选项)的启用/禁用及参数设置。
相关文件:
Kconfig: 各模块定义配置选项、类型、默认值、依赖关系。
prj.conf: 应用程序的主要配置文件,用于覆盖默认值 (CONFIG_XXX=y/n/value)。
.conf (可选): 特定于板卡的配置。
这些配置最终合并生成 build/zephyr/.config 和 build/zephyr/include/generated/autoconf.h。代码中通过 #ifdef CONFIG_XXX 或直接使用 CONFIG_XXX 的值来获取配置。
我们可以通过nRF扩展的 `nRF Kconfig GUI` 或命令行的 `west build -t menuconfig/guiconfig` 来图形化查看和临时修改配置(需要永久修改应写入prj.conf)。
**Device Tree (硬件配置):**
作用: 描述硬件平台布局(SoC、外设、引脚连接、内存地址、中断等)。
相关文件:
.dtsi (SoC/Board): 定义芯片级和板级基础硬件资源。
.overlay (应用程序的主要硬件配置文件): 用于修改或添加板级硬件配置,如更改引脚功能、定义连接的传感器、禁用外设等。标准命名为 app.overlay (通用) 或 .overlay (特定板卡)。
最终构建编译配置时会合并生成 build/zephyr/zephyr.dts (扁平化的设备树) 和 build/zephyr/include/generated/devicetree_generated.h。代码通过 `DT_...` 宏(如 DT_NODELABEL, DT_ALIAS, DT_PROP, GPIO_DT_SPEC_GET, I2C_DT_SPEC_GET, SPI_DT_SPEC_GET 等)来获取硬件信息(设备句柄、引脚号、寄存器地址、属性值等)。
nRF扩展也提供了 `Devicetree Visual Editor` 可用于图形化查看和编辑设备树。
#### 烧录程序
[Thingy91x无Jlink烧录方法](https://academy.nordicsemi.com/flash-instructions-for-the-thingy91/)
> Thingy:91X的烧录方式与Thingy:91相同,可使用nRF Connect for Desktop中的nRF Programmer工具进行烧录。
烧录完成我们可就能看到我们的Hello World了。