本帖最后由 wangqy_ic 于 2023-9-20 13:55 编辑
#申请原创#
移植 ZephyrRTOS 至 APM32F1 系列 MCU 之
移植基础框架
目录
目录结构确定目录结构是为了更好的符合 Zephyr 的一些移植要求,也便于与 Zephyr 结合但又不会影响 Zephyr 源码。这样的开发方式,也是我非常喜欢这个 RTOS 的一个原因。 先列出本项目的目录结构,之后简要介绍这些目录的作用和目的。为了便于后续的说明,我们暂时把这个目录的路径约定为 E:\z4geehy 。
├─boards
│ └─arm
│ └─apm32f103vc_mini
├─dts
│ ├─arm
│ │ └─geehy
│ │ └─f1
│ └─bindings
│ ├─clock
│ ├─gpio
│ └─serial
├─include
│ └─zephyr
│ ├─drivers
│ │ └─clock_control
│ └─dt-bindings
│ ├─clock
│ └─pinctrl
├─modules
│ └─hal
│ ├─apm32f10x
│ │ └─Libraries
│ └─drivers
│ ├─clock_control
│ ├─flash
│ ├─gpio
│ ├─include
│ ├─pinctrl
│ └─serial
├─soc
│ └─arm
│ └─geehy_apm32
│ ├─apm32f1
│ └─common
└─zephyr
- boards 开发板/评估板的定义。子目录的结构为:<arch>/<board>,arch 对应架构,例如:arm。 board 对应某个开发板,例如:└─apm32f103vc_mini。
- dts Driver Tree 相关内容。子目录是两类,一是 <arch>,定义 soc 相关的 Driver Tree 内容;二是 bindings,对应 soc 外设相关内容。
- include dts 相关的头文件。
- modules 这个目录存放半导体厂商提供的驱动
- soc soc 及相关驱动
- zephyr 这个目录下就只有一个文件 module.yml,该文件描述了我们这个 module 的信息,已经配置和构建所必须的内容,详细说明参见这个链接。
移植要点依次介绍几个重要的文件,这些文件就构成了移植的基本框架。基本框架搭建好之后,这个移植就能走上正轨,起飞指日可待~
zephyr 目录这个目录下只有 module.yml 这一个文件。文件内容为: name: hal_geehy
build:
cmake-ext: True
kconfig-ext: True
settings:
board_root: .
- name 本 module 的名称,会在配置界面 (TOP) -> Modules 下看到 hal_geehy 条目。(图1)
- build 条目告诉构建工具(west)怎样集成本 module:
- settings 分别指定几个目录,看名称应该都很容易理解。路径是相对目录,是相对于 module.yml 的上级目录,也就是 zephyr 目录所在的目录(有点拗口)。举个例子,board_root 的值是“.”,west 构建时 -b 参数指定了板子名称,配置时也要在本目录下搜索 board 相关的配置。
图1:
modulesmodules 目录有 modules.cmake 文件 和 hal 文件夹
modules.cmake 文件这个文件是 cmake 构建说明,有用的内容只有两行: set(ZEPHYR_HAL_GEEHY_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}/hal)
set(ZEPHYR_HAL_GEEHY_KCONFIG ${CMAKE_CURRENT_LIST_DIR}/hal/Kconfig)
这里说明了两个变量:ZEPHYR_HAL_GEEHY_CMAKE_DIR 和 ZEPHYR_HAL_GEEHY_KCONFIG
这两个变量的名称是有要求的,分别是: - ZEPHYR_<module_name>_CMAKE_DIR:对应 cmake 目录,这里的值也就是 modules/hal 目录。
- ZEPHYR_<module_name>_KCONFIG:对应 kconfig 文件,这里的值也就是 modules/hal/Kconfig 文件。
module_name 就是 zephyr/module.yml 里定义的 name 的值,需要把字母数字以外的字符都换成下划线。
hal 目录这个目录存放半导体厂商提供的驱动库以及相关的适配文件,主要有: - Kconfig Kconfig 配置项文件
- CMakeLists.txt CMake 相关文件
Kconfig 文件的主要内容是各个外设驱动的配置开关,最后引入各个外设驱动的详细配置: config USE_GEEHY_HAL_ADC
bool
config USE_GEEHY_HAL_CAN
bool
config USE_GEEHY_HAL_CRC
bool
config USE_GEEHY_HAL_DAC
bool
# 省略更多内容...
rsource "drivers/*/Kconfig"
CMakeLists.txt 主要是增加几个编译 Flag,并且根据外设的配置决定那些文件需要加入构建: zephyr_library()
if(CONFIG_CPU_CORTEX_M4)
zephyr_compile_definitions( -DCORE_CM4 )
elseif(CONFIG_CPU_CORTEX_M7)
zephyr_compile_definitions( -DCORE_CM7 )
endif()
zephyr_include_directories(common)
zephyr_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../include)
if(CONFIG_APM32F10X_LD)
zephyr_compile_definitions(APM32F10X_LD)
elseif(CONFIG_APM32F10X_MD)
zephyr_compile_definitions(APM32F10X_MD)
elseif(CONFIG_APM32F10X_HD)
zephyr_compile_definitions(APM32F10X_HD)
elseif(CONFIG_APM32F10X_CL)
zephyr_compile_definitions(APM32F10X_CL)
endif()
if(CONFIG_SOC_SERIES_APM32F1X)
zephyr_include_directories(
apm32f10x/Libraries/APM32F10x_StdPeriphDriver/inc
apm32f10x/Libraries/Device/Geehy/APM32F10x/Include
)
zephyr_library_sources(apm32f10x/Libraries/Device/Geehy/APM32F10x/Source/system_apm32f10x.c)
zephyr_library_sources(apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_rcm.c)
zephyr_library_sources(apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_misc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_ADC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_adc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_BAKPR apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_bakpr.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_CAN apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_can.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_CRC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_crc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_DAC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_dac.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_DBGMCU apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_dbgmcu.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_DMA apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_dma.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_DMC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_dmc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_EINT apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_eint.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_FMC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_fmc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_GPIO apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_gpio.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_I2C apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_i2c.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_IWDT apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_iwdt.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_PMU apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_pmu.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_QSPI apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_qspi.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_RTC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_rtc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_SCI2C apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_sci2c.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_SDIO apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_sdio.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_SMC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_smc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_SPI apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_spi.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_TMR apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_tmr.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_USART apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_usart.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_WWDT apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_wwdt.c)
add_subdirectory(drivers)
endif()
soc 目录这个目录是 MCU 移植的重要内容,目录结构是: └─arm
└─geehy_apm32
├─apm32f1
├─<other mcu series>
└─common
arm 对应 ARCH;之下是 geehy_apm32 对应厂商及 SOC 序列;之下是各个型号的 SOC 的内容。 主要的移植内容是: - SOC 配置说明:一系列 Kconfig 文件
- 链接脚本
- 启动时需要执行的特殊操作,如果有的话。
文件内容不少,但是都很容易理解,请参考源码仓库的内容。 结合 ZephyrRTOS 的一些使用经验,在划分型号时请结合 MCU 的实际功能,按功能多寡来规划 MCU 的归属,而不是厂商的型号字面意思。这样的话编写 Kconfig 文件/CMake 文件都能逐渐拓展开去。
boards 目录这个目录是开发板/评估板的配置及针对性的代码。结构是: └─arm
├─apm32f103vc_mini
└─<other board>
arm 对应 ARCH;之下是各个开发板,这里只有1个:apm32f103vc_mini。 开发板移植的必须文件: apm32f103vc_mini.dtsapm32f103vc_mini.yamlapm32f103vc_mini_defconfigboard.cmakeKconfig.boardKconfig.defconfig前三个文件,文件名称最好与文件夹名称相同,后三个文件的文件名称固定不变。 - .dts 文件,是板子 Driver Tree 说明文件
- .yaml 文件记录了板子信息
- _deconfig 文件保存 kconfig 配置项
- board.cmake 保存与调试器相关参数,如 jlink/pyocd 连接参数。
- Kconfig.board 板子配置项,至少包含板子定义一项,如:BOARD_APM32F103VC_MINI 。
- Kconfig.defconfig 板子名称配置项
结语基础移植框架的要点就上述的这些文件。
这个移植涉及文件内容非常多,但好在代码内容都容易理解,可以借助上面的内容,结合源码理解,就非常容易在新的 MCU 上跑起来。
至于驱动的开发,还需多篇文章才能说清楚,就只能在新文章里继续了~
源码仓库:https://gitee.com/quincyzh/zephyr_modules_apm32 欢迎⭐
Modules 相关内容:https://docs.zephyrproject.org/latest/develop/modules.html
// END
|
博主,对于这个 板子的移植能讲述的在清除一点吗,有些疑问