nRF Connect SDK(NCS):v3.0.1
toolchains:v3.0.1
这里做一些简单快速上手的记录,详细内容请看大佬:https://www.cnblogs.com/iini/p/14174427.html
1. 添加头文件和源文件--------CMakeLists.txt文件
老版nRF5 SDK 使用keil 5 配置头文件和源文件
新版NCS 用的是CMakeLists.txt文件
子目录工程\ncs\v3.0.1\nrf\applications\nrf_desktop\src\events路径下的CMakeLists.txt文件
2. 选择Board(板子)进行编译--------查看sample.yaml文件
keil 5 直接选择板子
新版NCS 编译的时候选择板子
至于工程支持什么板子,我们可以在例子下找到sample.yaml文件说明
Nordic定义的所有板子放在目录:zephyr\boards\nordic,以及nrf\boards\nordic
3. 修改image的ROM起始地址和大小,以及运行时所占RAM的起始地址和大小-----DeviceTree文件
keil 5在 Target选项中配置
新版NCS 在DeviceTree文件中修改,路径:C:\ncs\v3.0.1\zephyr\dts\common\nordic\xxx.dtsi
4. 开启/关闭/定义/赋值 宏定义--------autoconf.h 和 devicetree_generated.h
autoconf.h和devicetree_generated.h是编译系统(主要是Python脚本)编译生成的,用户不能直接修改,
只能通过这两个文件的输入文件去间接修改这两个文件。
- autoconf.h:
由多个Kconfig文件和多个以.conf(比如prj.conf)为后缀的文件生成
Kconfig是声明宏定义的地方,
我们可以通过在Applications窗口选择“peripheral_uart”工程,然后点击actions窗口的“nRF Kconfig GUI”条目,
然后点击上面红圈的“Toggle Panel”按钮,查看各个模块里有什么宏定义
而prj.conf等其他conf文件是引用宏或者给宏赋值的地方,我们在此处修改
修改完数据后“nRF Kconfig GUI”条目可能会使用不了,这个时候重新build一下就能重新使用
- devicetree_generated.h:
由多个dts/dtsi和overlay文件编译成,这些文件最终会合并成
一个zephyr.dts文件{ C:\ncs\v3.0.1\nrf\samples\bluetooth\peripheral_uart\ “build\peripheral_uart\zephyr”},
zephyr.dts文件又会转成devicetree_generated.h文件{ C:\ncs\v3.0.1\nrf\samples\bluetooth\peripheral_uart\build\peripheral_uart\zephyr\include\generated\zephyr},
最终通过define(宏定义)的方式在代码中发挥作用
我们可以看到peripheral_uart工程在“Devicetree”条目看到.dts文件,以及里面包含了很多dts/dtsi和overlay文件,
dts/dtsi文件负责定义宏,overlay文件负责修改宏的值。但是app.overlay(或者
用户对Devicetree语法又不熟,以至于很多用户无从下手。
其实,用户可以通过在Applications窗口选择“peripheral_uart”工程,然后点击actions窗口的“Devicetree overlay file”条目修改
overlay文件另一个功能是:同一个工程兼容不同板子外设
nRF54L15使用uart30,nRF52840有可能使用uart1,两个uart编号是不一样的,但是我们又想用同一个程序去兼容不同uart编号,为此我们定义uart别名:
这样在代码中我们可以引用myuart,而不同的板子可以对应不同的overlay文件,不同的overlay文件可以选择不同的uart编号,从而实现一个程序代码兼容不同uart外设。
uart设备句柄可以通过如下API获得:
const struct device *uart = DEVICE_DT_GET(DT_ALIAS(myuart));
既然Kconfig和DeviceTree都可以配置NCS工程,那我要定义一个宏的时候是放在Kconfig里面还是DeviceTree里面?Kconfig主要负责软件的配置,DeviceTree主要负责板子硬件的配置。Devicetree有严格的语法要求,它能定义的宏是预先规定好的并且非常有限,一般来说,我们直接引用现有Devicetree配置文件里面的宏定义,而不额外添加新的宏定义。换句话说,新的宏定义我们一般都放在Kconfig文件里面。
除了prj.conf文件外,board.conf文件也是Zephyr标准conf文件,Zephyr编译系统可以自动找到他们,并和prj.conf里面的配置一起合并,
需要注意的是,board.conf优先级高于prj.conf,
当一个宏同时在prj.conf 和 board.conf里面赋值,以 board.conf里面的赋值为最后结果。
prj.conf是工程级的配置,所以它的配置适用工程下的板子,board.conf是板级的配置,它只适用当下的板子。
请记住,按照Zephyr标准命名方式要求,目录名必须是“boards”,里面的.conf文件必须以板子名字来命名,否则系统将忽略它们,如下