一、前言
zephyr是一款小型物联网嵌入式RTOS,目前支持多款硬件平台,本文就是介绍下对zephyr支持的硬件平台移植的适配。
二、工程目录简介
├── arch 包含和硬件体系结构相关的代码,每种平台占一个相应的目录
├── boards 板级代码及相关的配置文件,例如stm32h743的就在目录zephyrproject/zephyr/boards/arm/nucleo_h743zi,我们适配自定义单板也主要是修改这个目录
├── cmake 构建 Zephyr 需要额外的构建脚本
├── doc 系统文档目录
├── drivers 设备驱动,每个不同的驱动占用一个子目录
├── dts devicetrree 源文件,用于描述特定板子的设备细节,如外设寄存器数量及寄存器地址
├── ext 其他功能的支持
├── include 包括所有公共 api 的文件,除了在 lib 下定义的部分
├── kernel 与架构无关的内核代码
├── lib 库代码,包括最小的标准 C 库
├── misc 不属于任何其他顶级目录的杂项代码
├── modules 提供特定芯片系列的一些外设配置选项
├── samples 演示使用 Zephyr 特性的示例应用程序
├── scripts 用于构建和测试 Zephyr 应用程序的各种程序和其他文件。
├── soc SoC 相关代码和配置文件,如 nRF9160 soc
├── subsys zephyr 子系统,包括 USB,网络,文件系统及蓝牙等
├── tests 测试 Zephyr 特性的代码
├── CMakeLists.txt CMake 构建系统的顶层文件,包含构建 Zephyr 所需的大量逻辑
├── Kconfig 顶层 Kconfig 文件,它引用 Kconfig.zephyr 文件。也可以在顶级目录中找到
├── west.yml West 清单,列出由 West 命令行工具管理的外部存储库
三、适配动作
本文以移植stm32h743系列soc为例,具体芯片型号为STM32H743IIT6;
首先了解一下一个单板目录的文件结构组成,包括:
Kconfig.board:与Kconfig.defconfig配合使用,共同组成项目编译选项配置,完成Kconfig功能
nucleo_h743zi.dts:设备树文件,定义单板的各项设备驱动的数据信息,也是我们适配需要重点修改的文件
board.cmake:定义单板编译链接下载的方式
Kconfig.defconfig:与Kconfig.board配合使用,共同组成项目编译选项配置,完成Kconfig功能
nucleo_h743zi.yaml:描述单板硬件各项数据信息,包括单板型号、flash大小、ram大小、支持的设备驱动等
doc/:里面存放单板相关的文档和图片说明
nucleo_h743zi_defconfig:定义单板的各种开关以及指定系统时钟频率
support/:st-link才有此文件夹,负责支持openocd
下面开始展示下怎么自定义一个单板目录,其实zephyr对于各个平台的单板的适配都做的很好,所以真正改动的地方不会太多:
1)首先在zephyr目录下找到自己想要适配的芯片目录,在同级目录下复制一个,我这里是h743,所以我复制的是nucleo_h743zi单板目录,取名nucleo_h743zephyr,之后下面的所有改动都在这个目录下进行
2)doc和support这俩目录基本不用改动,同系列soc这俩目录是通用的
3)board.cmake:如果你用的是st-link则不需要修改,如果用的是jlink请参考支持jlink的板子填写
4)Kconfig.board:将改为
(注释内容也最好跟着修改体现一致性,我这里没改是错误举动)
5)Kconfig.defconfig:将改为
6)nucleo_h743zephyr_defconfig:将原本复制过来的nucleo_h743zi_defconfig更名为nucleo_h743zephyr_defconfig,并在里面添加系统时钟频率设置CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=400000000 #II6为400MHz,具体要根据芯片手册设置
7)nucleo_h743zephyr.dts:将原本复制过来的nucleo_h743zi.dts更名为nucleo_h743zephyr.dts,这个里面会描述大量驱动设备的数据,例如管脚接口,地址信息,引用的设备,这个需要根据芯片开发手册和硬件原理图去调整
8)nucleo_h743zephyr.yaml:将复制过来的nucleo_h743zi.yaml更名为nucleo_h743zephyr.yaml,对立面关于单板型号的描述从H743ZI改为H743ZEPHYR,主要是name和identifier这俩属性,其余是通用不需要修改
9)还有就是有些应用需要制定特殊配置,这时候需要在应用的工程目录下添加.overlay文件,zephyr的驱动样例就有大量操作,例如adc里面就指定通道信息,比较奇怪的是节点名@后面数字超过15需要使用十进制否则代码识别不了,例如使用通道19就要写成channal@19
至此就将板子接上stLink与主机相连,在CMakeLists.txt同级目录下执行west build -b nucleo_h743zephyr -p编译自定义单板工程,使用west flash命令烧写