RT-Thread 创建自己的bsp(stm32)
1. 知识准备
如果没有以下的知识储备,也可以根据本文的制作过程,制作出一个工程。但还是需要对rtthread的系统有准确的认知,才能更好的去开发,解决开发过程中遇到的问题,官方有详细的文档和api参考手册
制作一个 BSP 的过程就是构建一个新系统的过程,因此想要制作出好用的 BSP,要对 RT-Thread 系统的构建过程有一定了解,需要的知识准备如下所示:
- 掌握 STM32 系列 BSP 的使用方法
- 了解 BSP 的使用方法,可以阅读 BSP 说明文档 中使用教程表格内的文档。了解外设驱动的添加方法可以参考《外设驱动添加指南》。
- 了解 Scons 工程构建方法
RT-Thread 使用 Scons 作为系统的构建工具,因此了解 Scons 的常用命令对制作新 BSP 是基本要求。 - 了解设备驱动框架
在 RT-Thread 系统中,应用程序通过设备驱动框架来操作硬件,因此了解设备驱动框架,对添加 BSP 驱动是很重要的。 - 了解 Kconfig 语法
RT-Thread 系统通过 menuconfig 的方式进行配置,而 menuconfig 中的选项是由 Kconfig 文件决定的,因此想要对 RT-Thread 系统进行配置,需要对 kconfig 语法有一定了解。 - 熟悉 CubeMX 工具的使用
在新的 STM32 系列 BSP 中利用了 CubeMX 工具对底层硬件进行配置,因此需要了解 CubeMX 工具的使用方法。
2. clone rt-thread代码到本地
git clone https://github.com/RT-Thread/rt-thread.git
3. 切换到指定分支
根据需求选择不同的版本
4. 目录结构
MINGW64 /d/workspace/for_confluece/rt-thread (master)
$ tree -L 1 -F
.
|-- AUTHORS
|-- ChangeLog.md
|-- Jenkinsfile
|-- Kconfig
|-- LICENSE
|-- README.md
|-- README_de.md
|-- README_es.md
|-- README_zh.md
|-- bsp/ Board support package,RT-Thread 板级支持包(IAR/MDK 工程在 BSP 目录下的具体的 BSP 中)
|-- components/ RT-Thread 的各个组件目录
|-- documentation/ 一些说明文件,如代码风格说明
|-- examples/
|-- include/ RT-Thread 内核的头文件
|-- libcpu/ 各类芯片的移植代码,此处包含了 STM32 的移植文件
|-- src/ RT-Thread 内核的源文件
`-- tools/ RT-Thread 命令构建工具的脚本文件
8 directories, 9 files
5. 开始创建bsp
5.1 到bsp目录下,找到对应的芯片的bsp
以stm32f405为例,找到对应bsp
进入到该目录可以看到,这是一个MDK/IAR工程,接下来的操作,均在该目录下完成
5.2 手动修改部分
因为目前的bsp是针对相近型号单片机,所以我们需要根据具体的型号,配置不同的参数,下表为所有需要配置的内容。
项目 | 需要修改的内容说明 |
---|---|
CubeMX_Config (文件夹) | CubeMX 工程:芯片型号,时钟源,下载方式,使能串口外设,配置时钟树,生成对应工程只是为了获得board/CubeMX_Config/Src/main.c下的SystemClock_Config()拷贝到board.c中 |
linker_scripts (文件夹) | BSP 特定的链接脚本 |
board.c/h | 系统时钟、GPIO 初始化函数、芯片存储器大小(根据具体芯片修改 FLASH 和 RAM 的相关参数) |
Kconfig | 芯片型号、系列、外设资源 |
SConscript | 芯片启动文件、目标芯片型号 |
修改工程模板 | 打开mdk或IAR修改芯片。调试下载方式等 |
因为我们选的芯片,恰巧为该bsp默认的芯片,所以,链接脚本,和ram,rom大小都不需要再配置,只需要使用CubeMX,配置芯片的外设即可。
如果所选芯片与默认芯片不同,参考官方文档,修改其余内容
双击\board\CubeMX_Config\CubeMX_Config.ioc,打开CubeMX工程
配置系统时钟、外设引脚等,步骤如下图所示:
打开外部时钟、设置下载方式、打开串口外设(注意只需要选择串口外设引脚即可,无需配置其他参数):
配置系统时钟:
可以设置项目名称,并在指定地址重新生成 CubeMX 工程。也可以什么都不改,只选择IDE类型:
注意:在生成代码时,不要勾选以下选项(即:不让其生成单独的 .c/.h 驱动文件,直接全部更新到 rt-thread 要使用的 stm32xxx_hal_msp.c 文件中)
最终 CubeMX 生成的工程目录结构如下图所示(其他文件可以不删除):
5.3 修改board/Kconfig文件
原始文件如下:只有uart2一个外设
menu "Hardware Drivers Config"
config SOC_STM32F405RG
bool
select SOC_SERIES_STM32F4
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
menu "Onboard Peripheral Drivers"
endmenu
menu "On-chip Peripheral Drivers"
config BSP_USING_GPIO
bool "Enable GPIO"
select RT_USING_PIN
default y
menuconfig BSP_USING_UART
bool "Enable UART"
default y
select RT_USING_SERIAL
if BSP_USING_UART
config BSP_USING_UART2
bool "Enable UART2"
default y
config BSP_UART2_RX_USING_DMA
bool "Enable UART2 RX DMA"
depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA
default n
endif
source "libraries/HAL_Drivers/Kconfig"
endmenu
menu "Board extended module Drivers"
endmenu
endmenu
添加uart1,处理好依赖关系
menu "Hardware Drivers Config"
config SOC_STM32F405RG
bool
select SOC_SERIES_STM32F4
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
menu "Onboard Peripheral Drivers"
endmenu
menu "On-chip Peripheral Drivers"
config BSP_USING_GPIO
bool "Enable GPIO"
select RT_USING_PIN
default y
menuconfig BSP_USING_UART
bool "Enable UART"
default y
select RT_USING_SERIAL
if BSP_USING_UART
config BSP_USING_UART2
bool "Enable UART2"
default y
config BSP_UART2_RX_USING_DMA
bool "Enable UART2 RX DMA"
depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA
default n
config BSP_USING_UART1
bool "Enable UART1"
default y
config BSP_UART1_RX_USING_DMA
bool "Enable UART1 RX DMA"
depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
default n
endif
source "libraries/HAL_Drivers/Kconfig"
endmenu
menu "Board extended module Drivers"
endmenu
endmenu
5.4 重新生成工程
在该目录下打开env工具(env介绍和安装参考准备工作)
执行menuconfig
配置kernel中console输出串口(默认为uart2)为uart1
配置串口等外设
使用 env 工具输入命令 scons --target=mdk5 重新生成工程,即可使打开keil工程编译烧录测试
总结:
通过制作bsp过程,需要思考的问题
- cubemx生成的代码是如何与rtt生成的工程联系起来的(可以通过代码调用关系理解)
- board下的Kconfig作用(如果添加一个spi设备该如何操作)