​ nRF Connect SDK,简称NCS,是Nordic最新的SDK平台,该平台支持Nordic所有产品线的所有技术,包括BLE,AoA,NFC,蜂窝网与GPS,Wi-Fi,2.4G,蓝牙Mesh,Zigbee,Thread,Matter, Homekit, FindMy等。

​ NCS是跨平台的(Windows/Linux/OSX),其基础是Zephyr系统。Zephyr系统是Linux基金会维护的一个项目,除了一个基本的Zephyr RTOS之外,还有很多方便的第三方软件库,像是MCUBoot、TCP/UDP/MQTT/TLS等网络库等等。

​ 更多信息可参考:

1. 简介

​ 本节将会详细介绍如何在一台Windows 11的电脑上安装NCS开发环境(Windows 10也适用),包含NCS、编译器以及其他工具。如果你已经安装好NCS开发环境,可以跳过本节

​ 需要安装的内容列表:

序号 软件 分类 用途
1 Visual Studio Code 编辑器 代码文本编辑器,并且通过安装插件的方式为其他开发调试工具提供可视化界面
2 nRF Command Line Tools 工具链 Jlink驱动、nrfjprog等命令行烧录工具
3 nRF Connect for Desktop 桌面工具 桌面工具集合,含SDK安装器、功耗评估、射频抓包等工具
4 Git 工具链 版本管理工具
5 Python 3.9 工具链 为编译套件的python脚本提供运行环境
6 Ninja 工具链 快速构建工具(类似make)
7 CMake 工具链 工程管理器,根据配置生成.ninja或Makefile文件的工具
8 Zephyr SDK 工具链 交叉编译工具链(编译器、链接器等)
9 NCS SDK源码包 含nRF产品驱动包、内核、第三方库等代码和编译配置文件等
10 VS Code: nRF Connect插件包 编辑器 在VS Code中为NCS功能提供可视化

2. 下载安装包并进行安装

​ 上述列表中1~3号软件都是使用安装包的形式进行安装,点击表格中的链接进入官网,下载安装后可以直接双击安装。安装路径需要无中文、空格或“-”,“_”以外的特殊字符。

​ VS Code的安装,这里不做介绍,一步一步安装即可。剩余的两个Nordic的工具,安装方式是类似的。下图仅示例nRF Connect for Desktop的下载方式:

image-20221122214235111

image-20221122213145436
“开始”菜单中安装好的工具(未完全展示)

3. 安装SDK和工具链

3.1. 自动安装与手动安装的区别

​ 列表中4~10号软件有2种安装方式,自动安装手动安装

  • 自动安装(推荐):自动下载SDK和工具链,所有工具链都放在一个文件夹内,编译时,只使用此文件夹内的工具链。工具链与电脑上本身安装的软件不冲突;
  • 手动安装:只拉取SDK,工具链单独安装到电脑里,并添加到PATH环境变量,编译时直接用PATH环境变量。

3.1. 自动安装

打开刚刚安装的nRF Connect for Desktop软件,找到Toolchain Manager,Install然后Open。

image-20221122214549553

打开后,先在SETTINGS中选择自己想要存放NCS和toolchains的位置:

image-20221122215033170

然后,在SDK ENVIRONMENTS中选择想安装的SDK版本进行安装(如①)。由于是从Github拉取,可能会要很久。安装完毕后,可打开VS Code(如②)。也可以在对应目录下打开终端(如③④)。

image-20221122215310523

点击“打开VS Code”,它会弹窗提示,帮你自动安装VS Code的nRF Connect插件包,如下图:

image-20221123161445490

【重要】检查安装是否完整

由于墙的存在,即使没有任何报错,SDK很有可能安装是不完整的。不过不必担心toolchain不完整,因为toolchain不完整的时候会报错。

这时,需要在SDK的目录下打开命令行。但不是直接打开,因为直接打开命令行,环境变量都是PATH。而是要从上图的“Open command prompt”来打开命令行,这时,打开的命令行中的环境变量是指向Toolchain文件夹的。

打开后,输入west update。NCS是由多个Github上的仓库组成的,此命令会依次pull这些仓库,如果有文件缺失,就能从命令行的输出看出来。

如果某些仓库pull失败,就继续不断重复执行west update,因为它是可以断点继续下载的。直到命令不报错为止,则说明仓库全部拉取完毕。

最后执行west zephyr-export,此命令会让工具链中的CMake记住SDK的位置。

3.2. 手动安装方式

安装过程需要网络代理(注意,命令行终端也需要被代理)

(1)【Windows专用】安装choco

choco是一个包管理工具,类似于Ubuntu中的apt-get,可以通过命令行安装软件工具,并自动添加到全局PATH环境变量中

​ 首先右键单击开始菜单,然后打开管理员终端,输入以下命令:

# 设置脚本执行权限
Set-ExecutionPolicy AllSigned

# 从网络端执行安装脚本
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

测试是否安装成功:

choco
# 有版本号输出即为成功

(2)利用choco安装其他工具

部分工具也可自己去官网下载,并用安装包安装,注意安装时要勾选“添加到PATH环境变量”

# 设置choco
choco feature enable -n allowGlobalConfirmation

# 安装cmake (也可以把这步替换成从官网下载cmake安装包,注意安装时要勾选添加进PATH环境变量)
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'

# 安装git (也可以把这步替换成从官网下载git安装包,注意安装时要勾选添加到环境变量)
choco install git

# 安装python (建议把这步换成从官网下载python3.9安装包,并勾选添加到环境变量,通过choco安装容易出错)
choco install python --version=3.9.13

# 安装其他工具
choco install ninja gperf dtc-msys2 wget unzip

Git也建议从官网安装,同时勾选安装Git bash。可以让你在windows上使用bash终端,而不是powershell。

image-20221204224509512

(3)安装GN工具(可选)

GN工具是开发Matter所需的工具。

GN网站下载编译好的Windows压缩包(Getting a binary),推荐在用户目录(C:\Users\<用户名>)下解压。并且添加到PATH环境变量即可。

如果你的Windows用户名是中文,那还是换个无中文的目录。

(4)安装west

west是一个多仓库管理工具(类似Android的repo),支持添加自定义插件。在NCS中,除了可以管理NCS仓库外,也通过插件实现了板卡选择、触发编译动作、触发flash烧写的功能。

利用Python的pip进行安装

pip3 install west
# 若python版本不对,这一步可能会报错

(5)安装NCS

nRF Connect SDK前面已经介绍过,含驱动、内核以及第三方库的源码。

  1. 在一个无中文、无空格的合适路径下打开终端(powershell或bash):
 #创建并进入文件夹
mkdir ncs
cd ncs

# 初始化仓库(从github拉取)
west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.4.2
# 也可选择其他分支或tag,如:
# west init -m https://github.com/nrfconnect/sdk-nrf --mr main
# 但通常不建议用户使用main分支
  1. 更新仓库
#更新仓库
west update

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

  1. 导出Zephyr CMake package,便于CMake自动识别SDK的路径,后续生成工程
west zephyr-export
  1. 安装额外的python依赖

​ 安装python依赖之前,还需要安装”Microsoft Visual C++ Build Tools 14.0”或更高版本:Microsoft C++ Build Tools - Visual Studio,用来编译这些python工具。在上述微软链接下载,会获得一个VS安装工具。只在Workloads栏里选择 **”Desktop Development with C++”**,然后安装即可。

​ 安装python依赖包:

pip3 install -r zephyr/scripts/requirements.txt
pip3 install -r nrf/scripts/requirements.txt
pip3 install -r bootloader/mcuboot/scripts/requirements.txt

(6)安装Zephyr SDK工具链

​ Zephyr SDK是编译器、链接器等工具。建议放在用户目录下(同样的,如果你的用户名是中文,还是换个目录吧)。

​ 下方展示了通过Poweshell命令下载Zephyr SDK的方式。其中Zephyr工具链的版本是我安装时使用的版本。你需要获取最新的版本,最新版本的下载地址可从 Zephyr SDK — Zephyr Project Documentation 获取。

# 进入到用户目录(c:\Users\[用户名])
cd $HOME
# 如果是你的终端是bash而非powershell,则命令为
# cd ~

# 下载(最新版本的下载地址可从上述链接获取)
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.15.1/zephyr-sdk-0.15.1_windows-x86_64.zip

# 解压
unzip zephyr-sdk-0.15.1_windows-x86_64.zip

# 配置
cd zephyr-sdk-0.15.1
setup.cmd

注意:

  • setup.cmd只需执行一次。如果改变了安装位置,需要再次执行。
  • Zephyr SDK安装完成后,会发现:如果在前面安装了ncs的目录下执行west --help会比其他目录下执行west --help多出一些扩展指令,如build,board等等。这是因为NCS中的.west文件夹的配置了Zephyer的base路径,提供了这个仓库独有的插件。这些扩展的指令就是调用了插件进行编译、调试、烧写等工作。
    为了让其他目录下也能使用Zephyr工具,需要设置全局环境变量:
    在Windows环境变量中新建ZEPHYR_BASE环境变量,并把其值设置为ncs安装目录下的zephyr目录的路径即可。

(这个效果和执行一次ncs目录下的zephyr/zephyr-env.cmd脚本是一样的,但这个脚本设置环境变量只是临时生效,关闭终端再另开一个终端就不起作用了。而设置全局环境变量是永久生效。)

(7)安装VS Code插件

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

image-20221122220619736

​ 可以在VS Code的设置中,对插件进行单独的设置,例如可以设置使用工具链的路径。可以对全局进行设置(USER),也可以单独对某个工作区进行设置(WORKSPACE)。

image-20221122220941604 由于我们是手动安装的,已经设置了PATH环境变量。所以把插件设置的工具链路径设为PATH即可。

3.3. SDK更新

手动安装和自动安装的SDK是一样的。如果有新版本SDK出来,想切换到新版本,都可以按照以下步骤操作:

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

这意味着,客户平时不要随便去改SDK中的任何代码。也不要往里添加任何内容。但是编译例程是没问题的,因为例程编译目录build*是被.gitignore忽略掉的。

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

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

检查manifest有无新版本

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

# 查看nfr仓库下有多少版本
cd nrf
git pull
git tag # 按键盘上下键翻阅,按q退出

切换到自己想要的版本

# 检出想要的版本
git checkout v2.4.2

# 更新整个仓库
west update

4. 打开一个例程

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

image-20221209103137554

或者:

image-20221209103240455

含有例程的目录:

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

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

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

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

我们选择一个蓝牙例程,nrf/samples/bluetooth/peripheral_uart,并打开文件夹。这只是在VS Code 中打开,打开后,nRF Connect 插件会检测到这是一个Application文件夹,询问你是否要把它加入到nRF Connect插件的Application中,点击Yes即可:

image-20221209110542991

打开后,在VS Code资源管理器中可以看到文件夹视图:

image-20221209113911545

​ 另外,也可以在Application中看到这个例程:

image-20221209112255254

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-20231027154922771

选择“Copy a sample”

image-20231027155052262

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

image-20231027155146846

这里的例程列表,和第4节中提到的目录结构是一致的。同时也和SDK官网的例程说明是保持一致的,每个例程都有其对应的说明文档:

image-20231027155316876

Nordic商业级应用:https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/applications.html

Nordic例程:https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/samples.html

Zephyr例程:https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/samples/index.html

选择自己新建例程的父目录(我这里是Linux电脑的路径):

image-20231027155535431

选择自己新建例程的文件夹名称:

image-20231027155623993

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

5.2. 使用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,不同的优化级别等等),编译出不同的可执行文件。一个项目下可以创建多个编译目标。

Board

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

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

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

  • Nordic boards:Nordic 出品的官方开发板,以及一些Nordic的demo板

  • All boards:Zephyr 支持的所有开发板

image-20231028172343694

Nordic开发板board配置的命名规则:

例如:nrf52840dk_nrf52840,是说这个板子的配置是为 nrf52840dk 这块开发板上的 nrf52840 这颗 MCU 创建的,会记录这个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设备树与设备驱动模型】

Configuation

选用的Kconfig配置。Zephyr的Kconfig菜单中,很多配置项都是有默认值的。项目内的prj.conf配置文件的作用是,对原始的默认配置进行覆盖。通常只选prj.conf即可,如果有不一样的,可以参考例程的说明文档。

Kconfig fragments

其实和prj.conf差不多,相当于对prj.conf的一个补充。通常,同一个例程支持很多不同的板子的情况下,prj.conf中记录的是例程通用的配置。

boards/xxx.conf中记录的是某种开发板单独需要的配置。boards/下的通常不用选,编译时会自动根据板子选择。

此外还可能有其他的配置文件可以选,说明这个例程支持不同的功能,具体需要看那个例程的文档。

Devicetree overlays

系统选择板子时,板子都会有一个device tree。这里的overlay就是当前例程对板子device tree的增、删、改。所以叫做覆盖(overlay)。默认名称是app.overlayboards/目录下也可能有不同开发板对应的overlay文件。通常也不用选择,编译时会自动使用app.overlay,或者自动根据板子选择。

Extra CMake arguments

跟直接在CMakeLists.txt里面写set(xxx yyy)定义一个宏的值,效果是一样的。格式是-Dxxx=yyy,也就是在命令行中运行CMake时通过-D进行传参。

6.2. 进行编译

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

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

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

image-20221123140646521

补充:命令行编译

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

image-20231027161338719

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

# 利用当前已经创建的build target进行编译
west build

更多用法:

west build -h

编译时可以指定项目根目录、build目录、板子名称、配置文件、overlay文件等。你可以先用上面的图形化的方式在VS Code中进行编译,然后在VS Code终端中查看这次编译的命令是什么。

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

如果不能自动识别到,或者很不稳定。可能是最新的底层Python工具nrfutil在Windows上不太稳定。可以把它改回之前的nrfjprog

打开VS Code Settings:

image-20231027162356248

搜索“Device Provider”,并改为nrfjprog

image-20231027162506329

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日志输出的相关配置:

打开工程根目录下的.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中,先扫描,扫到设备后,再连接:

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. 官方资料

NCS官网

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资料中心

https://docs.nordicsemi.com/

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

Nordic旧版资料中心

https://infocenter.nordicsemi.com/index.jsp

也可以下载到芯片数据手册(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。

11. 其他推荐阅读