本文更新日期:2025.2.5,支持NCS v2.9.0

nRF Connect SDK,简称NCS,是Nordic最新的SDK平台。该平台支持Nordic的三大产品线:

  1. 短距离 2.4G MCU
    • Bluetooth LE(主机、从机、主从一体、多主多从、BLE MESH、AoA/AoD蓝牙测向、LE Audio、 PAwR、Channel Sounding)
    • 基于802.15.4的OpenThread和Zigbee
    • 2.4G私有协议(ESB)
  2. 中距离 Wi-Fi 收发器:
    • nRF700x系列的Wi-Fi收发器,低功耗双频Wi-Fi6,QSPI/SPI接口。NCS提供700x系列的Zephyr驱动和例程。
  3. 长距离 蜂窝 模组
    • nRF91系列,是支持CAT-NB1(NB-IoT)和CAT-M1的系统级封装(SiP),全球运营商认证。超低功耗,小尺寸,支持Open CPU和 AT Commands方式开发。

软件上,还支持Matter,HomeKit,Apple FindMy,Google FindMy,Amazon Sidewalk,ANT+等物联网协议;硬件上,还支持Nordic的2.4G无线功率放大器(PA)和电源管理芯片(PMIC)。

NCS基于Zephyr系统。Zephyr系统是一个开源嵌入式实时操作系统项目,由Linux基金会和众多厂商维护。Zephyr系统除了基本的ROTS之外,还有很多中间件,软件库,硬件驱动等等。

Zephyr的强大特性

  1. 全面的内核服务
    • 多线程,支持协程和基于优先级的抢占。兼容POSIX pthreads API。
    • 多种动态内存分配工具,支持固定大小或可变大小的内存块
    • 支持多种信号量同步机制;支持多种线程间通讯机制(消息队列、字节流等)
    • CPU电源管理和外设电源管理
  2. 多种调度策略可选
  3. 高度可定制性、模块化开发
  4. 支持许多架构(x86, ARM, RSIC-V)
  5. 堆栈、内核、驱动、线程间内存保护
  6. 允许编译时静态定义资源(线程、内存池、队列等),提高性能
  7. 提供具有一致性的设备驱动模型,并且支持DeviceTree
  8. 全功能网络协议栈(包括LwM2M和BSD Sockets),OpenThread,BLE
  9. 跨平台开发(Windows/Linux/MacOS)
  10. 支持多种文件系统(ext2, LittleFS, FatFS…),还支持FCB(Flash Circular Buffer)
  11. 强大的模块化日志框架,支持多种后端(串口、RTT、BLE、network、filesystem…)
  12. 易于开发的Shell
  13. 在非易失存储器上保存配置,掉电不丢失
  14. 支持在Linux上运行Zephyr模拟器
  15. 远程资源管理(通过串口、USB、BLE、network管理固件升级与版本回滚,文件系统资源等)

NCS在Zephyr的基础上提供了更多的脚本工具、协议栈、驱动、功能库等等。

NCS中有许多例程。其中有Zephyr自带的一些基础例程,如线程、LED/Button、TCP/UDP等;也有Nordic提供的高级例程,如BLE键鼠、蓝牙多连接、Matter例程等。NCS官网针对每个例程都提供了文档。

更多信息可参考:

1. 简介

本节将会详细介绍如何在一台Windows 11的电脑上安装NCS开发环境(Windows 10也适用),包含NCS、编译器以及其他工具。其他平台的安装也是类似的,参考好官网英文教程即可。

需要安装的内容列表:

序号 软件 分类 用途
1 Visual Studio Code 编辑器 代码文本编辑器,并且通过安装插件的方式为其他开发调试工具提供可视化界面
2 nRF Command Line Tools 命令行工具 nrfjprog命令行烧录工具(后续将被nRF Util取代)
3 nRF Util 命令行工具 更高级的命令行工具,类似于包管理器,可以安装各种子命令。包括烧录、管理toolchain/SDK、DFU、BLE抓包、蜂窝ModemTrace
4 nrf-udev 配置文件 【Linux专用】配置USB设备权限,可识别Nordic USB设备
5 nRF Connect for Desktop 桌面工具 Nordic桌面工具集合
6 Jlink驱动 驱动 JLink驱动需要单独安装。
7 NCS Toolchain 编译工具链 一个独立的工具链文件夹,含Git、CMake、Python、Ninja、GCC等工具,与你电脑上已经安装的环境不冲突
8 NCS SDK源码包 SDK本体,含内核、驱动、模块、协议栈等等的源码

2. 安装开发工具

Nordic软件工具

上述列表中2~5号软件都可以自行安装,点击表格中的链接进入官网,下载安装后可以直接双击安装。安装路径需要最好无中文、空格,且文件夹层数不要太深。其中,nrfutil需要添加到PATH环境变量。

其中有些软件不是安装完就能工作,还需要连网下载其他功能。如果工作环境不能连网,有离线安装的需求,请参考:

VS Code的安装这里不做介绍。VS Code的插件可以在VS Code插件市场搜索nRF Connect for VS Code Extension pack来一次性安装所有需要的插件。

image-20250204233110265

其他的Nordic的工具安装方式是类似的。下图仅示例nRF Connect for Desktop的下载方式:

image-20221122214235111

JLink驱动

SEGGER - JLink官网下载JLINK驱动。其中JLink的版本参考NCS依赖

打开文档后,先把文档版本对齐为你要安装的NCS版本:

image-20250205021043601

然后查看JLink需要的版本:

image-20250205021126347

也可以用nrfutil device --version对照查看nrfutil device需要的JLink版本。注意,下表对应的不是NCS的版本

SEGGER J-Link version Tested with…
v8.10f device v2.7.11 and newer
v7.94i device v2.5.4 to v2.7.10, ble-sniffer v0.9.0 and newer, trace v3.0.0 and newer, 91 v0.5.0.
v7.94e device v2.1.1 to v2.5.3.
v7.88j device v2.0.2 to v2.0.3.

安装JLink驱动时,一定要带上JLinkUSB驱动:

# For windows
.\JLink_Windows_V794i_x86_64.exe -InstUSBDriver=1

其他依赖: Microsoft Visual C++ Redistributable

Linux USB规则

对于LinuxPC,需要安装:

sudo apt install libusb-1.0-0

# 先从https://github.com/NordicSemiconductor/nrf-udev/releases下载deb包
sudo dpkg -i nrf-udev_1.0.1-all.deb

3. 安装编译工具链和SDK

Toolchain和SDK是两个独立的文件夹,它们都可以自动下载。

Toolchain是在Nordic服务器上的压缩包,直接按照后面步骤自动下载自动安装即可。

SDK是放在GitHub上的许多仓库的合集,主仓库是sdk-nrf。当你能稳定科学地上网,直接自动安装即可。如果网络不稳定,可能就需要用命令行多次拉取。

3.1. 自动安装工具链和SDK

(1)安装VS Code插件

打开VS Code,在插件中心搜索nRF Connect for VS Code Extension Pack,这个插件包会自动安装其他nRF Connect 所需的VS Code插件。

image-20221122220619736

(2)安装Toolchain

在插件的Welcome界面,选择安装新的Toolchain

image-20250204234236367

先设置安装路径(也可以不设置),然后点击选择要安装的NCS版本。

image-20250204234741583

这里设置的是所有toolchain的父目录。Windows默认安装路径是C:\\ncs\,Linux下是${HOME}/ncs/,MacOS下设置无效。例如:

image-20250204235145339

后续安装SDK时也可以设置同样的路径,这样最后电脑上的NCS都会装在一起。

Toolchain会自动下载并解压,里面的工具不会被添加PATH环境变量中,也不需要添加到PATH。防止工具链中的软件和你电脑上已经安装的同名软件产生冲突(如Python)。

(3)进入Toolchain环境

要想使用这个Toolchain中的工具,需要用单独的命令行环境。这个环境我们后面会经常用到:

image-20250205000107113

image-20250205000139731

如何确定当前终端中所用的工具是toolchains文件夹里,而不是PC里其他位置安装的?

在Linux中,可以用which命令查看某个软件的路径:
image

类似地,在Windows PowerShell环境中,可以用where命令来查看一个软件的位置。

对于没有显示器的服务器环境,或者脚本中需要使用工具链的情况,可以用nrfutil实现。

准备nrfutil:

## 确保已经安装nrfutil,并添加到环境变量。
## 并且已经安装了nrfutil toolchain-manager

# 首先,如果前面安装toolchain时,没有安装到默认路径,此处需要设置你的安装路径
nrfutil toolchain-manager config --set install-dir=D:\Project\ncs

# 检查nrfutil是否找到工具链
nrfutil toolchain-manager list

Version Toolchain
* v2.9.0 D:\Project\ncs\toolchains\b620d30767

在工具链环境下执行单个命令

# 移动到一个目录中,并执行命令
nrfutil toolchain-manager launch --ncs-version v2.9.0 --chdir <my_dir> -- <my_commands>

# 例如,在`C:\`下执行 `ls -la`
nrfutil toolchain-manager launch --ncs-version v2.9.0 --chdir C:\ -- ls -la

直接进入一个带有toolchain作为path的shell环境

# Windows PowerShell
nrfutil toolchain-manager launch --ncs-version v2.9.0 -- powershell

# Windows CMD
nrfutil toolchain-manager launch --ncs-version v2.9.0 -- cmd

# 进入后,可用env命令检查环境变量
env
# Linux下必须使用--shell参数
nrfutil toolchain-manager launch --ncs-version v2.9.0 --shell

(4)安装SDK

你可以仿照上面安装Toolchain的方式来安装SDK

image-20250205003637807

image-20250205003702063

这里的安装路径,最好与toolchain使用相同的父目录

image-20250205003730244

然后回车安装。

从Github拉取总是失败怎么办?也可以手动通过命令行安装SDK。Github的拉取可以断点续传,不断重复最终可以下载完。见下一小节。

3.2. 手动拉取或者更新SDK

在刚刚打开的nRF Connect命令行中,找到想要安装SDK的位置,执行以下步骤:

image-20250205005413929

(1)拉取主仓库

# 进入到toolchain安装的父目录,默认C:\ncs,或者${HOME}/ncs/
cd D:\Project\ncs

# 创建并进入SDK文件夹
mkdir v2.9.0
cd v2.9.0

# 初始化仓库(从github拉取对应Tag的主仓库)
west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.9.0

image-20250205005309635

(2)拉取其他子仓库

# 主仓库已经拉取完毕,拉取其他子仓库,直接在当前目录下执行
west update

由于国内网络DNS污染的原因,这一步也经常失败,但是没关系,每次west update都能下载一点点,如果失败了,就重复west update就行了。不需要像west init失败一样删除干净重新下载。

可以用个脚本循环执行,直到west update无报错。

(3)导出Zephyr CMake package

west zephyr-export

(4)后续更新和切换SDK版本

SDK通过git管理的好处是,你可以方便地切到新版本或者老版本。注意此方法只能切换SDK,各个版本的toolchain还是需要单独安装。当然,如果你硬盘够大,把所有要用的SDK都分别安装也可以。

按照以下步骤操作:

  1. 确保SDK中的git仓库状态均为Clean

这意味着,开发者平时不要随便去改SDK中的任何代码。但是编译例程是没问题的,因为例程的默认编译目录build/是被.gitignore忽略掉的。

# 此命令可查看当前git仓库的状态
git status

但是NCS中的仓库很多。也可以用VS Code打开整个NCS,用git界面图形化查看是否每个仓库均为clean。

  1. 检查manifest有无新版本

NCS中,nrf为主仓库,nrf的版本即为整个SDK的版本

# 查看nfr仓库下有多少版本
cd nrf
git pull
git tag # 按键盘上下键翻阅,按q退出
  1. 切换到自己想要的版本
# 检出想要的主仓库nrf版本
git checkout v2.6.0

# 更新nrf之外的整个NCS仓库
west update

4. 打开一个例程

从VS Code 的一个全新窗口,选择打开文件夹

image-20221209103137554

或者:

image-20221209103240455

打开整个SDK目录,这样做是为了看代码跳转时,SDK中的代码也能跳转到

image-20250205012245435

然后在VS Code中再打开一个例程:

image-20250205012416141

我们选择v2.9.0\nrf\samples\bluetooth\peripheral_uart

image-20250205012602448

编译例程参考后续章节。

NCS中所有例程的位置:

NCS 
|-- nrf
| |-- applications/ # Nordic商业级例程
| |-- samples/ # Nordic外设、蓝牙、LTE等例程
| |-- tests/ # 组件API测试例程
`-- zephyr
|-- samples # Zephyr Kernel、各类板子、各类传感器芯片例程
`-- tests # 组件API测试例程

zephyr/samples/中有RTOS的组件例程、Zephyr支持的各类厂商的板卡例程、各类传感器的例程等,其中也有蓝牙例程。

zephyr/tests/中有全部的API测试例程。

nrf仓库的目录结构仿造zephyr仓库,也有samples/tests/目录。samples/中有Nordic提供的软件库例程、Zephyr未收录的例程(如 nRF9160的LTE)等。

5. 以例程为模板创建新工程

上一节讲解了如何打开一个例程。

如果我们只是打开例程,例程的文件夹还是在ncs仓库内部,受到ncs的git仓库的管理。如果想自己开发项目,用git管理自己项目的版本,就需要创建新工程。

NCS支持把例程当作模板,复制到NCS外部,并创建新工程。

5.1. 创建新工程

NCS支持以例程作为模板,复制并创建新的工程。这也是Nordic非常推荐的方式。

首先在VS Code中打开一个新窗口

image-20231027154653607

在 VS Code中,选择左侧nRF Connect for VS Code插件,进入Welcome页面,先检查toolchain和SDK是否已经检测到。

然后点击Create a new application创建新工程。

image-20250205012805758

选择“Copy a sample”

image-20250205012842271

选择自己想要拷贝的例程,支持文字搜索:

image-20250205012920701

这里的例程列表,和第4节中提到的目录结构是一致的。同时也和NCS官网的例程说明文档是保持一致的,下图位置打开官网文档:

image-20250205013013188

Nordic商业级应用:https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/applications.html

Nordic例程:https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/samples.html

Zephyr例程:https://docs.nordicsemi.com/bundle/ncs-latest/page/zephyr/samples/index.html

此外,还有一些模块的例程不会出现在这个界面,但是可供参考:

  • ${NCS}/modules/hal/nordic/nrfx/samples/src/: NRFX外设驱动库例程。如果用户不想用、或者Zephyr没有提供某些外设的标准驱动,则可以使用NRFX驱动,其用法和老的nRF5 SDK基本一致。
  • ${NCS}/zephyr/tests:zephyr所有的API的测试用例。如果你不知道某个Zephyr API怎么用,可以从这里面找。

选择自己新建工程的位置:

image-20250205013142630

然后就可以打开新的工程。

5.2. 添加Workspace

这样的独立工程是可以编译的,但是后续编译完,看代码时,按Ctr+鼠标左键跳转的代码在SDK内部,就无法跳过去了。所以,需要把SDK和当前工程添加到同一个VS Code Workspace中。

选择添加文件夹到Workspace

image-20250205013547421

直接把整个NCS和当前工程添加到同一个Workspace中:

image-20250205013658240

保存当前workspace:

image-20250205013723666

下次打开时,只需双击workspace文件,就能直接打开当前workspace(含工程目录+SDK)

image-20250205013906343

最后记得修改.gitignore文件,避免污染git记录:

image-20250205013949727

5.3. 使用git跟踪你的代码修改

展开查看

如果你从没用过git,需要先配置用户名和邮箱。这个用户名和邮箱不是登陆什么网站用的,而是一个签名,在提交代码时用于标记这段代码是谁提交的。这个配置存在你电脑的本地,并且是全局的,对所有git仓库都有效。

git config --global user.name "Jayant.Tang"
git config --global user.email "jayant.tang@nordicsemi.no"

新建的工程都会自动初始化git仓库,我们可以看到.gitignore文件:

image-20231027155922698

你可以把.vscode/添加到其中

如果你不熟悉Git以及Git在VS Code中的使用,强烈建议去学习一下,它极大的方便了代码的管理。

例如:如果安装了git history插件,就可以查看提交历史:

image-20221122235338251

Git History提供了很方便的视图,可以看到每次commit都改动了哪些代码和配置(左侧是旧的,右侧是新的):

image-20221122235416865

​ 更多Git的使用,可以去网上了解其他教程。本文不再赘述。

6. 编译工程

6.1. 创建一个编译目标(Build Target)

所谓编译目标就是在同一套代码下,可能有不同的配置项(Debug/Release,不同的优化级别等等),编译出不同的可执行文件。一个项目下可以创建多个编译目标。

image-20250205014115409

Toolchain和SDK版本

在build界面设置Toolchain和SDK版本:

image-20250205022811532

目前在Build界面设置,可以让同一个工程用不同的环境进行编译,测试区别。之前的VS Code版本,是在Welcome界面全局设置Toolchain和SDK版本。注意这个改动比较大。

Board Target

创建Build时,需要选择自己使用的板子,Zephyr自带许多厂商的开发板配置。

下图中,Board target下拉框是用来选板子的,下方还有三个过滤器,来过滤可选的板子:

  • Compatible boards:本例程适配的板子,如果选择这些板子,不需要任何修改就可以烧录进去使用

  • Nordic SoC:使用了Nordic SoC的板子,可能是一些demo板或第三方板子

  • Nordic Kits:Nordic 出品的官方开发板

  • All boards:Zephyr中所有的板子

image-20250205023002380

Zephyr Board target 配置的命名规则:

image-20250205023618902

例如:nrf52840dk/nrf52840,是说这个target是为 nRF52840DK 这块开发板上的 nrf52840 这颗 MCU 创建的。Board Target的配置文件会记录这个MCU的外设地址,以及此MCU连接的外部硬件的信息(如SPI Flash)。

例如:nrf9160dk/nrf9160nrf9160dk/nrf52840,都是nRF9160DK这块开发板的配置。但是这块开发板上有两颗MCU/SoC,一颗是9160 SiP,另一颗是52840。所以有两个配置可选,分别为这两颗MCU/SoC编译固件。

例如:nrf5340dk/nrf5340/cpuappnrf5340dk/nrf5340/cpunet,都是nrf5340dk这块板子的配置,并且这块板子上只有nRF5340这一颗主控。但是nRF5340是一颗双核MCU,所以,可以有两种配置来区分两个核。这两个核的固件是分开运行的,因此编译时也是分别编译的。

例如:nrf5340dk/nrf5340/cpuappnrf5340dk/nrf5340/cpuapp/ns,都是nrf5340dk开发板上,nrf5340芯片的应用核的配置。但是,这颗应用核使用的CPU是Cortex-M33,基于Arm V8架构,提供了TrustZone的安全保护技术,同样的一个外设寄存器,可以有安全(Secure)和非安全(Non-Secure)两个地址,这样可以把安全应用和非安全应用隔离开来。因此,这两个board配置的不同之处,就是从安全地址还是非安全地址去访问芯片上的外设资源。

例如:nrf52833dk/nrf52820。这块开发板上只有nrf52833这一块主控。但是由于nRF52833和nRF52820同属nRF52系列,52820上的资源是52833的子集,并且Nordic并未单独为52820制作开发板,因此可以用52833来模拟52820。此配置文件限制了52833上的硬件资源,使其表现和52820相同。

更详细的信息牵扯到DeviceTree,可参考:《理解Zephyr编译与配置系统》有关Boards的章节。

NCS v2.6.x之前,采用的是根据SoC架构来分类板子的方式,那时候板子名称都是独立的,用下划线连接:如nrf52840dk_nrf52840

NCS v2.7.0开始,采用了Zephyr Hardware Model v2,才产生这个区别。

在CMake中,有以下变量可以获取板子信息:

># Board name,如nrf52840dk
>${BOARDS}

># Board qualifiers,如/nrf5340/cpuapp
>${BOARD_QUALIFIERS}

># 完整的Board target,如nrf5340dk/nrf5340/cpuapp
>${BOARDS}${BOARD_QUALIFIERS}

># 转换为下划线的格式,如nrf5340dk_nrf5340_cpuapp
>${NORMALIZED_BOARD_TARGET}

配置文件

各种配置文件、追加配置文件,可参考《理解Zephyr编译与配置系统》

image-20250205025318126

编译选项

image-20250205025414518

可以设置Build目录,优化等级等等。Sysbuild可参考《理解Zephyr编译与配置系统》,v2.7.0后默认使用sysbuild。

6.2. 进行编译

【注意】NCS v2.9.0在中文Windows系统上有个编码Bug,需要修改v2.9.0\zephyr\scripts\list_boards.py。否则无法编译。

with board_yml.open('r') as f:

改为

with board_yml.open('r', encoding='utf-8') as f:

新建完build target后,点击Build Configuration进行编译。

image-20250205031140383

如果后续要再次编译这个target,可以在APPLICATIONS栏选中自己要构建的工程和target。然后在ACTIONS栏通过build按钮进行项目的构建。

按Build旁的圆圈箭头按钮,可以全部重新编译。

image-20250205031114268

6.3. 命令行编译

补充:命令行编译

按 “ CTRL + ` “,可以呼出终端。点击“+”号右边的下拉箭头,选择nRF Connect:

image-20231027161338719

这样打开的终端,其环境变量指向前面安装的toolchain。

编译命令示例:

west build -b nrf52840dk/nrf52840 -d build -p -- -DCONF_FILE="prj.conf"
# -d 指定编译目录为./build
# -b 板子为nrf52840dk/nrf5284
# -p 表示pristine build,全部重新编译。
# 在--之后可以添加CMake选项。如-D表示设置CMake变量。
# -DCONF_FILE等价于在CMakeLists.txt中写 set(CONF_FILE prj.conf)
# 更多CMake配置文件选项,参考https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/app_dev/config_and_build/cmake/index.html#providing_cmake_options

更多用法:

west build -h

7. 连接设备

nrf-connect插件,底层调用的是nrfjprognrfutil命令来连接开发板上的JLink。因此,需要通过USB线连接到JLink口。

image-20221209144123203

以nRF52840DK为例,中间最大的带有贴纸的芯片为JLink主控(官方称其为Interface MCU),左侧为JLink USB口,此接口可以用来给整块板供电。

需确保左下角电源开关打开。左侧中间位置的开关置于VDD挡位,右上角开关置于DEFAULT挡位(如上图)。

对于一些有多颗MCU的开发板,注意要使用拨码开关选择自己要调试的MCU,例如nRF9160DK可选择9160和52840:

image-20221209153801993

​ 然后就可以在VS Code中识别到设备了:

image-20221209144833292

8. 烧录固件

连接并成功识别到Jlink后,可以通过ACTIONS栏中的Flash按钮触发烧录动作:

image-20221123160139273

​ 也可以通过命令行进行烧录:

west flash

备注:

这样直接烧录,有一部分项目可能会烧写失败,显示:

image-20221123160245857

这是因为,Nordic的MCU中通常都有一个用于存储用户信息的寄存器(UICR),可以认为是一块特殊的flash区域,存储了客户自己的加密密钥、引脚配置等产品信息。由于信息安全的原因,是不允许在保持UICR不变的情况下烧写新的固件的。相关资料,可以参考Nordic芯片数据手册的UICR章节。

这种情况下只能全片擦除然后再烧录,点击Flash右边的按钮:

image-20221123160832598

或者使用命令行方式:

west flash --force --erase

此外,还有一种可能是,调试接口启用了保护,需要recover这颗芯片来解除保护。

通常,右下角会有弹窗来问你是否要recover,就选择Yes就好。

如果没有效果,也可以用命令行来recover

nrfjprog --recover

如果是nRF5340这种双核芯片,那么网络核也要recover

nrfjprog --recover --coprocessor CP_NETWORK

9. 运行并测试

连接的设备,可以看到Jlink上的主控芯片、串口以及RTT。

image-20231028103135931

这里的串口是MCU上真实的物理串口,在开发板上通过PCB走线连接到Jlink,然后Jlink把这个串口转化为USB虚拟串口。

新款开发板,板载的Jlink是拿5340做的,这种新款开发板有两个USB虚拟串口:

image-20231027164658632

image-20231027163914699

但是对于52840DK来说,开发板上只连了一个串口,另一个是空的。具体是哪个?要试一下,因为可能USB枚举的顺序不一样。

对于5340DK, 7002DK来说,两个串口分别对应Application Core和Network Core的日志输出。

9.2. 连接串口

image-20221209154745021

​ 点击串口,选择波特率,即可打开串口。串口接收的信息在Terminal展示:

image-20231027162835862

这个串口工具类似于Putty,按下键盘的按键就立即发送出去一个字符,不会显示自己发出了什么。便于在这个串口上运行命令行终端之类的,这也是Zephyr所支持的。

9.3. 连接RTT

RTT是Segger提供的日志调试手段,全称Real Time Transmit。MCU将日志打印到内部缓存中,然后利用Jlink的高速通道,把日志打印到电脑上。这个方法不需要占用串口外设,而且速度极快,对CPU运行影响小。

大多数例程的默认日志输出是串口。但本例程是蓝牙串口透传,串口需要传输用户数据,因此在本例程中日志的默认输出就已经是RTT了,无需再配置RTT。

要查看RTT日志输出的相关配置,打开工程根目录下的.prj文件:

image-20221209161912543

可以看到:

CONFIG_LOG=y                 # 启用日志系统
CONFIG_USE_SEGGER_RTT=y # 启用RTT
CONFIG_LOG_BACKEND_RTT=y # 日志后端选用RTT
CONFIG_LOG_BACKEND_UART=n # 日志后端不选用串口
CONFIG_LOG_PRINTK=n # 不启用PRINTK日志

如下图连接RTT:

image-20221209170245563

9.4. 测试peripheral_uart例程

一般来说,需要两块开发板,一块烧peripheral_uart,一块烧central_uart。两块开发板上电后会自动连接。从一个开发板串口输入的数据,会从另一个开发板输出。

但是这里我们只有一块开发板,那么BLE central我们就用手机。iOS应用商店可以下载nRF Connect,安卓可以在谷歌商店下载,或者直接去Github下载APK

通过BLE连接设备

在nRF Connect APP中,先scan搜索附近蓝牙。scan按钮一开始是三角形,点击开始扫描后,变成方形。
扫到设备后,再连接:

image-20231028104626601

开发板接收数据

image-20231028104717740

image-20231028104734696

可以在串口看到数据:

image-20231028104845188

开发板发送数据

BLE协议是Client-Server架构。BLE协议规定,从机作为Server,只能被Client读、写上面的属性。默认情况下不能主动发消息到Client。除非Client使能了Notify的功能,Server才能Nortify到Client。更多信息,大家可以搜索CCCD(Client Characteristic Configuration Descriptor)。这里,就需要点亮TX属性的CCCD:

image-20231028105348055

然后在串口中通过键盘输入内容:hello+回车。屏幕上不会显示东西,但是按键确实会发送出去。

这个串口工具类似于Putty,按下键盘的按键就立即发送出去一个字符,不会在屏幕上显示自己发出了什么。

这里之所以要加回车,是因为例程代码就是这么写的。在串口回调函数内,检测到回车,才会把串口数据打包从蓝牙发出。

image-20231028105643833

至此,我们完成了在nRF52840DK上的peripheral_uart例程的编译、烧录与运行测试。

10. 阅读代码、跳转与搜索

当一个工程编译完毕后,工程中的函数与变量、Kconfig配置、设备树都是可以ctrl+鼠标左键点击跳转到定义的。为了能够跳转和搜索到SDK中的代码,记得按照前面第5.2小节的方法,把NCS和当前工程添加到同一个Workspace中。

然后,就可以在nRF插件中进行浏览了:

image

Source File中是所有参与编译的源码。其中Application下的是当前工程中的源码;nRF Connect SDK下的是NCS中参与编译的源码(不参与编译的不会在里面);Generated下是工具链自动生成的一些代码(中断向量表、Kconfig转换成宏等等)。

由于我们前面已经把SDK放进了VS Code workspace,所以可以直接搜索代码:

image

点击上面的搜索按钮后,会自动跳转到VS Code搜索界面,并且已经自动填充好文件搜索范围:

image

在浏览和搜索的过程中,时刻注意自己选中的是整个工程的Build Target还是子工程的Build Target

image-20250205032032135

以免影响后续的编译情况。

11. 官方资料

Nordic TechDocs资料中心

https://docs.nordicsemi.com/

目前最新的资料中心,可以通过技术或产品系列进行分类,查找想要的资料。芯片数据手册(Specification)、开发板说明都可以在这里查看。
image

记得进入NCS文档后,第一步先选择文档的版本与自己使用的NCS版本一致:
image

从2024.6.18开始,NCS官网和Infocenter都会下线。所有开发资料都会集中在TechDocs。上图中我们可以看到,除了各个产品系列的介绍之外,下方有nRF Connect SDK和老的nRF5 SDK的资料,点击跳转进去即可。

关于文档的结构,可以展开下面章节中被折叠的信息来了解。

NCS官网

此网站已于2024.6.18被Nordic资料中心替代

展开查看

https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/index.html

image-20231028162512499

进入官网,首先看到右上角可以选择文档的版本,需要与SDK的版本对应。

然后可以看到中间的一排标签页:

  • Zephyr Project:是Zephyr官方文档的一个镜像,包含Zephyr RTOS内核服务、操作系统API、各种驱动、协议支持以及它们的例程文档。一些比较通用的功能的如日志、Flash存储、线程间通信等功能的文档都在这里面。它对应的是NCS中的zephyr文件夹。

  • nRF Connect SDK: 是Nordic在Zephyr系统上扩展的各种Nordic独有的库、驱动和例程的文档。里面大多数是一些Nordic独有的技术,对应的是NCS中的nrf文件夹。

  • nrfx与nrfxlib:Nordic的外设驱动库,是最接近寄存器操作的一层,和目前已经停止维护的的nRF5 SDK中的nrfx几乎是一样的。在Zephyr中,通常应用层只需调用Zephyr的标准API,Nordic提供的底层驱动会把nrfxlib和一些寄存器操作封装成Zephyr的标准API。通常,只有客户在对MCU外设功能进行较为深入的开发时,会参考到这一块的文档。

  • MCUboot:MCUboot是一个开源的第三方安全bootloader,支持很多系统和平台,Zephyr只是其中之一。很多支持OTA的例程基本都是使用MCUboot

  • Trust Firmware-M:ARM提出了平台安全架构(Platform Security Architecture, PSA),意思就是说,客户自己开发软件容易有安全漏洞,因此运行环境应分为安全环境(SPE)非安全环境(NSPE)。客户开发的程序,属于非安全环境。安全环境的程序,由厂商提供,主要提供一些安全存储、安全启动之类的API给客户的非安全环境来调用。Trust Firmware-M(TFM)是安全环境的一个样板固件。 如果你使用了nRF5340或者nRF9160这种带有ARM v8架构的主控平台,则在编译选板子时,都可以看到_s_ns后缀。_s的意思是说,客户直接在安全环境开发程序,安全性全由客户自己掌控。_ns的意思是说,客户在非安全环境开发程序,编译时,Zephyr会自动把TFM一起编译进去,和客户的应用程序一起工作。对于9160来说,由于要和蜂窝modem进行交互,因此,牵扯到蜂窝网络操作的例程,都必须选择nrf9160dk_nrf9160_ns

  • Matter:Matter是智能家居的新标准,目的是打破厂商之间的壁垒,实现生态融合。从连接方式上讲,Matter是基于局域网IPv6的,因此,Wi-Fi和Thread都是可以作为Matter的底层的。从配网方式上讲,Matter通过BLE来传输认证信息,此外可以通过NFC或者二维码的方式,让手机快速的找到要配网的这个设备的BLE广播。此页面主要是Matter SDK的文档,并不局限于在Nordic MCU上进行开发。如果要找Matter在Nordic产品上运行的例程,还是要去nRF Connect SDK页面的Samples目录下去寻找。

  • Kconfig:Zephyr系统中有大量的Kconfig配置,Nordic扩展的库、驱动中也有大量Kconfig配置。如果你不知道一个Kconfig配置是干什么的,可以在这个页面进行搜索。

总之,NCS官网里面有大量的技术细节,在运行一个例程之前,一定要参照网站中该例程的说明进行操作。

Nordic旧版资料中心(Info Center)

此网站已于2024.6.18被Nordic资料中心替代
如果要查询老的nRF5 SDK资料,看:https://docs.nordicsemi.com/bundle/sdk_nrf5_v17.1.0/page/index.html

展开查看 https://infocenter.nordicsemi.com/index.jsp ![](https://img2024.cnblogs.com/blog/3028998/202406/3028998-20240618103019099-1297214744.png) 也可以下载到芯片数据手册(Specification)、开发板说明、技术白皮书等。这里也有目前已停止维护的nRF5 SDK的文档。

Nordic官网

https://www.nordicsemi.com/

一些商业新闻和产品介绍。但是最重要的是一些工具软件开发板原理图/PCB/BOM之类,需要在这里下载。

例如:

nRF52840DK开发板默认例程、Jlink固件、原理图等https://www.nordicsemi.com/Products/Development-hardware/nRF52840-DK/Download?lang=en#infotabs

DevZone开发者论坛

https://devzone.nordicsemi.com/

有问题可以在上面搜索,也可以用英文提问。每天都有原厂support team查看问题并回复。Nordic注册客户,还可以提交private ticket,解决一些与代码、板子有关的问题,也可以审核PCB。

Nordic AI

TechDoc和DevZone网站右下角都有Ask AI按钮:

image-20250205032231322

AI训练了所有的Nordic官网资料,以及DevZone论坛中的帖子。可以用中文问他:

image-20250205032554493

Nordic DevAcademy官方课程

https://academy.nordicsemi.com/

类似于慕课的网站,目前有NCS,BLE、Wi-Fi、Cellular等课程。有视频结合题目,适合英文好的读者去学习,是非常适合入门的课程。

12. 其他推荐阅读