安装nRF-Connect-SDK
本文更新日期:2025.2.5,支持NCS v2.9.0
nRF Connect SDK,简称NCS,是Nordic最新的SDK平台。该平台支持Nordic的三大产品线:
- 短距离 2.4G MCU:
- Bluetooth LE(主机、从机、主从一体、多主多从、BLE MESH、AoA/AoD蓝牙测向、LE Audio、 PAwR、Channel Sounding)
- 基于802.15.4的OpenThread和Zigbee
- 2.4G私有协议(ESB)
- 中距离 Wi-Fi 收发器:
- nRF700x系列的Wi-Fi收发器,低功耗双频Wi-Fi6,QSPI/SPI接口。NCS提供700x系列的Zephyr驱动和例程。
- 长距离 蜂窝 模组:
- 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的强大特性
- 全面的内核服务
- 多线程,支持协程和基于优先级的抢占。兼容POSIX pthreads API。
- 多种动态内存分配工具,支持固定大小或可变大小的内存块
- 支持多种信号量同步机制;支持多种线程间通讯机制(消息队列、字节流等)
- CPU电源管理和外设电源管理
- 多种调度策略可选
- 高度可定制性、模块化开发
- 支持许多架构(x86, ARM, RSIC-V)
- 堆栈、内核、驱动、线程间内存保护
- 允许编译时静态定义资源(线程、内存池、队列等),提高性能
- 提供具有一致性的设备驱动模型,并且支持DeviceTree
- 全功能网络协议栈(包括LwM2M和BSD Sockets),OpenThread,BLE
- 跨平台开发(Windows/Linux/MacOS)
- 支持多种文件系统(ext2, LittleFS, FatFS…),还支持FCB(Flash Circular Buffer)
- 强大的模块化日志框架,支持多种后端(串口、RTT、BLE、network、filesystem…)
- 易于开发的Shell
- 在非易失存储器上保存配置,掉电不丢失
- 支持在Linux上运行Zephyr模拟器
- 远程资源管理(通过串口、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环境变量。
其中有些软件不是安装完就能工作,还需要连网下载其他功能。如果工作环境不能连网,有离线安装的需求,请参考:
- nrfutil离线安装方法
- nRF Connect for Desktop离线安装方法
- nRF Connect for VS Code插件离线安装方法(待补充)
VS Code的安装这里不做介绍。VS Code的插件可以在VS Code插件市场搜索nRF Connect for VS Code Extension pack来一次性安装所有需要的插件。
其他的Nordic的工具安装方式是类似的。下图仅示例nRF Connect for Desktop的下载方式:
JLink驱动
在SEGGER - JLink官网下载JLINK驱动。其中JLink的版本参考NCS依赖:
打开文档后,先把文档版本对齐为你要安装的NCS版本:
然后查看JLink需要的版本:
也可以用
nrfutil device --version
对照查看nrfutil device需要的JLink版本。注意,下表对应的不是NCS的版本。
SEGGER J-Link version Tested with… v8.10f device
v2.7.11 and newerv7.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 |
其他依赖: Microsoft Visual C++ Redistributable
Linux USB规则
对于LinuxPC,需要安装:
sudo apt install libusb-1.0-0 |
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插件。
(2)安装Toolchain
在插件的Welcome界面,选择安装新的Toolchain
先设置安装路径(也可以不设置),然后点击选择要安装的NCS版本。
这里设置的是所有toolchain的父目录。Windows默认安装路径是
C:\\ncs\
,Linux下是${HOME}/ncs/
,MacOS下设置无效。例如:
后续安装SDK时也可以设置同样的路径,这样最后电脑上的NCS都会装在一起。
Toolchain会自动下载并解压,里面的工具不会被添加PATH环境变量中,也不需要添加到PATH。防止工具链中的软件和你电脑上已经安装的同名软件产生冲突(如Python)。
(3)进入Toolchain环境
要想使用这个Toolchain中的工具,需要用单独的命令行环境。这个环境我们后面会经常用到:
如何确定当前终端中所用的工具是toolchains文件夹里,而不是PC里其他位置安装的?
在Linux中,可以用
which
命令查看某个软件的路径:类似地,在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:
这里的安装路径,最好与toolchain使用相同的父目录:
然后回车安装。
从Github拉取总是失败怎么办?也可以手动通过命令行安装SDK。Github的拉取可以断点续传,不断重复最终可以下载完。见下一小节。
3.2. 手动拉取或者更新SDK
在刚刚打开的nRF Connect命令行中,找到想要安装SDK的位置,执行以下步骤:
(1)拉取主仓库
# 进入到toolchain安装的父目录,默认C:\ncs,或者${HOME}/ncs/ |
- 这一步如果下载失败想重新下载,需要把创建的ncs文件夹下的所有内容删除干净,尤其是
.west
隐藏文件夹。然后再次执行前面的west init ...
即可;- 如果网络实在差,可以从百度网盘下载,见《开发你的第一个nRF Connect SDK(NCS)/Zephyr应用程序》 - iini - 博客园 (cnblogs.com)
(2)拉取其他子仓库
# 主仓库已经拉取完毕,拉取其他子仓库,直接在当前目录下执行 |
由于国内网络DNS污染的原因,这一步也经常失败,但是没关系,每次
west update
都能下载一点点,如果失败了,就重复west update
就行了。不需要像west init
失败一样删除干净重新下载。可以用个脚本循环执行,直到west update无报错。
(3)导出Zephyr CMake package
west zephyr-export |
(4)后续更新和切换SDK版本
SDK通过git管理的好处是,你可以方便地切到新版本或者老版本。注意此方法只能切换SDK,各个版本的toolchain还是需要单独安装。当然,如果你硬盘够大,把所有要用的SDK都分别安装也可以。
按照以下步骤操作:
- 确保SDK中的git仓库状态均为Clean
这意味着,开发者平时不要随便去改SDK中的任何代码。但是编译例程是没问题的,因为例程的默认编译目录build/
是被.gitignore
忽略掉的。
# 此命令可查看当前git仓库的状态 |
但是NCS中的仓库很多。也可以用VS Code打开整个NCS,用git界面图形化查看是否每个仓库均为clean。
- 检查manifest有无新版本
NCS中,nrf为主仓库,nrf的版本即为整个SDK的版本
# 查看nfr仓库下有多少版本 |
- 切换到自己想要的版本
# 检出想要的主仓库nrf版本 |
4. 打开一个例程
从VS Code 的一个全新窗口,选择打开文件夹:
打开整个SDK目录,这样做是为了看代码跳转时,SDK中的代码也能跳转到:
然后在VS Code中再打开一个例程:
我们选择v2.9.0\nrf\samples\bluetooth\peripheral_uart
编译例程参考后续章节。
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中打开一个新窗口
在 VS Code中,选择左侧nRF Connect for VS Code插件,进入Welcome页面,先检查toolchain和SDK是否已经检测到。
然后点击Create a new application
创建新工程。
选择“Copy a sample”
选择自己想要拷贝的例程,支持文字搜索:
这里的例程列表,和第4节中提到的目录结构是一致的。同时也和NCS官网的例程说明文档是保持一致的,下图位置打开官网文档:
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怎么用,可以从这里面找。
选择自己新建工程的位置:
然后就可以打开新的工程。
5.2. 添加Workspace
这样的独立工程是可以编译的,但是后续编译完,看代码时,按Ctr+鼠标左键跳转的代码在SDK内部,就无法跳过去了。所以,需要把SDK和当前工程添加到同一个VS Code Workspace中。
选择添加文件夹到Workspace
直接把整个NCS和当前工程添加到同一个Workspace中:
保存当前workspace:
下次打开时,只需双击workspace文件,就能直接打开当前workspace(含工程目录+SDK)
最后记得修改.gitignore
文件,避免污染git记录:
5.3. 使用git跟踪你的代码修改
展开查看
如果你从没用过git,需要先配置用户名和邮箱。这个用户名和邮箱不是登陆什么网站用的,而是一个签名,在提交代码时用于标记这段代码是谁提交的。这个配置存在你电脑的本地,并且是全局的,对所有git仓库都有效。
git config --global user.name "Jayant.Tang"
git config --global user.email "jayant.tang@nordicsemi.no"
新建的工程都会自动初始化git仓库,我们可以看到.gitignore文件:
你可以把.vscode/
添加到其中
如果你不熟悉Git以及Git在VS Code中的使用,强烈建议去学习一下,它极大的方便了代码的管理。
例如:如果安装了git history插件,就可以查看提交历史:
Git History提供了很方便的视图,可以看到每次commit都改动了哪些代码和配置(左侧是旧的,右侧是新的):
更多Git的使用,可以去网上了解其他教程。本文不再赘述。
6. 编译工程
6.1. 创建一个编译目标(Build Target)
所谓编译目标就是在同一套代码下,可能有不同的配置项(Debug/Release,不同的优化级别等等),编译出不同的可执行文件。一个项目下可以创建多个编译目标。
Toolchain和SDK版本
在build界面设置Toolchain和SDK版本:
目前在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中所有的板子
Zephyr Board target 配置的命名规则:
例如:
nrf52840dk/nrf52840
,是说这个target是为 nRF52840DK 这块开发板上的 nrf52840 这颗 MCU 创建的。Board Target的配置文件会记录这个MCU的外设地址,以及此MCU连接的外部硬件的信息(如SPI Flash)。例如:
nrf9160dk/nrf9160
和nrf9160dk/nrf52840
,都是nRF9160DK这块开发板的配置。但是这块开发板上有两颗MCU/SoC,一颗是9160 SiP,另一颗是52840。所以有两个配置可选,分别为这两颗MCU/SoC编译固件。例如:
nrf5340dk/nrf5340/cpuapp
和nrf5340dk/nrf5340/cpunet
,都是nrf5340dk这块板子的配置,并且这块板子上只有nRF5340这一颗主控。但是nRF5340是一颗双核MCU,所以,可以有两种配置来区分两个核。这两个核的固件是分开运行的,因此编译时也是分别编译的。例如:
nrf5340dk/nrf5340/cpuapp
和nrf5340dk/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编译与配置系统》:
编译选项
可以设置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进行编译。
如果后续要再次编译这个target,可以在APPLICATIONS栏选中自己要构建的工程和target。然后在ACTIONS栏通过build按钮进行项目的构建。
按Build旁的圆圈箭头按钮,可以全部重新编译。
6.3. 命令行编译
补充:命令行编译
按 “ CTRL + ` “,可以呼出终端。点击“+”号右边的下拉箭头,选择nRF Connect:
这样打开的终端,其环境变量指向前面安装的toolchain。
编译命令示例:
west build -b nrf52840dk/nrf52840 -d build -p -- -DCONF_FILE="prj.conf" |
更多用法:
west build -h |
7. 连接设备
nrf-connect插件,底层调用的是nrfjprog
或nrfutil
命令来连接开发板上的JLink。因此,需要通过USB线连接到JLink口。
以nRF52840DK为例,中间最大的带有贴纸的芯片为JLink主控(官方称其为Interface MCU),左侧为JLink USB口,此接口可以用来给整块板供电。
需确保左下角电源开关打开。左侧中间位置的开关置于VDD挡位,右上角开关置于DEFAULT挡位(如上图)。
对于一些有多颗MCU的开发板,注意要使用拨码开关选择自己要调试的MCU,例如nRF9160DK可选择9160和52840:
然后就可以在VS Code中识别到设备了:
8. 烧录固件
连接并成功识别到Jlink后,可以通过ACTIONS栏中的Flash
按钮触发烧录动作:
也可以通过命令行进行烧录:
west flash |
备注:
这样直接烧录,有一部分项目可能会烧写失败,显示:
这是因为,Nordic的MCU中通常都有一个用于存储用户信息的寄存器(UICR),可以认为是一块特殊的flash区域,存储了客户自己的加密密钥、引脚配置等产品信息。由于信息安全的原因,是不允许在保持UICR不变的情况下烧写新的固件的。相关资料,可以参考Nordic芯片数据手册的UICR章节。
这种情况下只能全片擦除然后再烧录,点击Flash右边的按钮:
或者使用命令行方式:
west flash --force --erase此外,还有一种可能是,调试接口启用了保护,需要recover这颗芯片来解除保护。
通常,右下角会有弹窗来问你是否要recover,就选择Yes就好。
如果没有效果,也可以用命令行来recover
nrfjprog --recover如果是nRF5340这种双核芯片,那么网络核也要recover
nrfjprog --recover --coprocessor CP_NETWORK
9. 运行并测试
连接的设备,可以看到Jlink上的主控芯片、串口以及RTT。
这里的串口是MCU上真实的物理串口,在开发板上通过PCB走线连接到Jlink,然后Jlink把这个串口转化为USB虚拟串口。
新款开发板,板载的Jlink是拿5340做的,这种新款开发板有两个USB虚拟串口:
但是对于52840DK来说,开发板上只连了一个串口,另一个是空的。具体是哪个?要试一下,因为可能USB枚举的顺序不一样。
对于5340DK, 7002DK来说,两个串口分别对应Application Core和Network Core的日志输出。
9.2. 连接串口
点击串口,选择波特率,即可打开串口。串口接收的信息在Terminal展示:
这个串口工具类似于Putty,按下键盘的按键就立即发送出去一个字符,不会显示自己发出了什么。便于在这个串口上运行命令行终端之类的,这也是Zephyr所支持的。
9.3. 连接RTT
RTT是Segger提供的日志调试手段,全称Real Time Transmit。MCU将日志打印到内部缓存中,然后利用Jlink的高速通道,把日志打印到电脑上。这个方法不需要占用串口外设,而且速度极快,对CPU运行影响小。
大多数例程的默认日志输出是串口。但本例程是蓝牙串口透传,串口需要传输用户数据,因此在本例程中日志的默认输出就已经是RTT了,无需再配置RTT。
要查看RTT日志输出的相关配置,打开工程根目录下的
.prj
文件:
可以看到:
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:
9.4. 测试peripheral_uart例程
一般来说,需要两块开发板,一块烧peripheral_uart
,一块烧central_uart
。两块开发板上电后会自动连接。从一个开发板串口输入的数据,会从另一个开发板输出。
但是这里我们只有一块开发板,那么BLE central我们就用手机。iOS应用商店可以下载nRF Connect
,安卓可以在谷歌商店下载,或者直接去Github下载APK。
通过BLE连接设备
在nRF Connect APP中,先scan搜索附近蓝牙。scan按钮一开始是三角形,点击开始扫描后,变成方形。
扫到设备后,再连接:
开发板接收数据
可以在串口看到数据:
开发板发送数据
BLE协议是Client-Server架构。BLE协议规定,从机作为Server,只能被Client读、写上面的属性。默认情况下不能主动发消息到Client。除非Client使能了Notify的功能,Server才能Nortify到Client。更多信息,大家可以搜索CCCD(Client Characteristic Configuration Descriptor)。这里,就需要点亮TX属性的CCCD:
然后在串口中通过键盘输入内容:hello+回车。屏幕上不会显示东西,但是按键确实会发送出去。
这个串口工具类似于Putty,按下键盘的按键就立即发送出去一个字符,不会在屏幕上显示自己发出了什么。
这里之所以要加回车,是因为例程代码就是这么写的。在串口回调函数内,检测到回车,才会把串口数据打包从蓝牙发出。
至此,我们完成了在nRF52840DK上的peripheral_uart
例程的编译、烧录与运行测试。
10. 阅读代码、跳转与搜索
当一个工程编译完毕后,工程中的函数与变量、Kconfig配置、设备树都是可以ctrl+鼠标左键点击跳转到定义的。为了能够跳转和搜索到SDK中的代码,记得按照前面第5.2小节的方法,把NCS和当前工程添加到同一个Workspace中。
然后,就可以在nRF插件中进行浏览了:
Source File中是所有参与编译的源码。其中Application下的是当前工程中的源码;nRF Connect SDK下的是NCS中参与编译的源码(不参与编译的不会在里面);Generated下是工具链自动生成的一些代码(中断向量表、Kconfig转换成宏等等)。
由于我们前面已经把SDK放进了VS Code workspace,所以可以直接搜索代码:
点击上面的搜索按钮后,会自动跳转到VS Code搜索界面,并且已经自动填充好文件搜索范围:
在浏览和搜索的过程中,时刻注意自己选中的是整个工程的Build Target还是子工程的Build Target
以免影响后续的编译情况。
11. 官方资料
Nordic TechDocs资料中心
目前最新的资料中心,可以通过技术或产品系列进行分类,查找想要的资料。芯片数据手册(Specification)、开发板说明都可以在这里查看。
记得进入NCS文档后,第一步先选择文档的版本与自己使用的NCS版本一致:
从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
进入官网,首先看到右上角可以选择文档的版本,需要与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  也可以下载到芯片数据手册(Specification)、开发板说明、技术白皮书等。这里也有目前已停止维护的nRF5 SDK的文档。Nordic官网
一些商业新闻和产品介绍。但是最重要的是一些工具软件、开发板原理图/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按钮:
AI训练了所有的Nordic官网资料,以及DevZone论坛中的帖子。可以用中文问他:
Nordic DevAcademy官方课程
https://academy.nordicsemi.com/
类似于慕课的网站,目前有NCS,BLE、Wi-Fi、Cellular等课程。有视频结合题目,适合英文好的读者去学习,是非常适合入门的课程。