STM32系列驱动介绍
在RTT实时操作系统中,各种各样的设备驱动是通过一套I/O设备管理框架来管理的。
设备驱动框架给上层应用提供了一套标准的设备操作API,开发者通过调用这些标准设备操作API,可以高效地完成和底层硬件外设的交互。
使用同一套标准的API开发应用程序,使应用程序具有更好的移植性。
底层驱动的升级和修改不会影响到上层代码。
驱动和应用程序相互独立,方便多个开发者协同开发。
驱动分类介绍
对于一个BSP而言,有如下三类驱动:
- 片上外设驱动:指MCU芯片上的外设,例如硬件定时器,ADC和看门狗等。
- 板载外设驱动:指MCU之外,开发板上外设,例如TF卡,以太网卡和LCD等。
- 扩展模块驱动:指可以通过扩展接口或者杜邦线连接的开发板的模块,例如ESP8266模块。
STM32系列BSP制作教程
为了让广大开发者更好、更方便地使用 BSP 进行开发,RT-Thread 开发团队重新整理了现有的 STM32 系列的 BSP,推出了新的 BSP 框架。新的 BSP 框架在易用性、移植便利性、驱动完整性、代码规范性等方面都有较大提升,在新的 BSP 框架下进行开发,可以大大提高应用的开发效率。
和RTT以往提供的BSP不同,在新的BSP文件夹中将不会包含固件库、外设驱动等可以被多个BSP引用的代码文件。
将这些通用的文件统一存放在Library文件夹中,通过在特定BSP中引用这些文件的方式,来包含BSP中所需的库文件或者驱动文件。
这种方式不仅大大提高了代码复用率,降低了 BSP 的维护成本,而且可以更方便地给开发者提供更丰富的驱动文件,让开发者可以更容易地找到自己需要的资源。
新的 BSP 框架还引入了 CubeMX 工具,可以使用该工具来对 BSP 中使用的外设引脚进行配置。
CubeMX 工具提供了图形化的配置界面,这种图形化的配置方式对开发者来说更加直观,不仅可以让开发者灵活地配置 BSP 中使用的资源,并且可以让开发者对资源的使用情况一目了然。
BSP框架介绍
每一个STM32系列的BSP由三部分组成,分别是通用库、BSP模板和特定开发板BSP。
- 通用库:stm32/libraris,用于存放HAL库以及基于HAL库的多系列通用外设驱动文件。
- F1系列BSP工作模板:stm32/libraries/templates/stm32f10x,F1系列BSP模板,可以通过修改改模板制作更多F1系列BSP
- 特定开发板BSP:stm32/stm32f103-atk-nano,在BSP模板的基础上修改而成
RTT的构建与配置系统
KConfig在RTT中的工作机制
C语言项目的裁剪配置本质上是通过条件编译和宏的展开来实现的,RTT借助KConfig这套机制更方便的实现了这一功能。
以Windows下Env工具中的使用为例,简述Kconfig在RTT的工作机制。
Kconfig机制包括了Kconfig文件和配置UI界面(如menuconfig,pyconfig等)。
Kconfig文件中的配置项会映射至rtconfig.h中
Kconfig文件可以随源码分散至各级子目录,便于灵活修改
Kconfig文件在源码中呈现树形结构,需要在工程的根目录下存在一份顶层Kconfig文件,顶层Kconfig文件在文件中通过source语句显示地调用各子目录下的Kconfig文件。
Env在根目录下执行menuconfig命令后会递归解析各级Kconfig文件,然后提供如下配置界面,完成相应的配置后并保存,根目录下会存在一份.config文件保存当前选中的配置项,并将**.config文件转化为RTT的系统配置文件rtconfig.h**。
Kconfig源于Linux内核的配置构建系统。
语法
注释
# This is a comment
config语句
定义了一组新的配置项
config BSP_USING_GPIO
bool "Enable GPIO"
select RT_USING_PIN
default y
help
config gpio
- .config表示一个配置选项的开始,紧跟着的BSP_USING_GPIO是配置选项的名称,config下面几行定义了该配置选项的属性。属性可以是该配置选项的类型、输入提示、依赖关系、默认值、帮助信息。
- bool表示配置选项的类型,每个config菜单项都要有类型定义,变量有5种类型
bool 布尔类型
tristate 三态类型
string 字符串
hex 十六进制
int 整型 - select是反向依赖关系的意思,即当前配置选项被选中,则RT_USING_PIN就会被选中。
- default表示配置选项的默认值,bool类型的默认值可以是y/n。
- help表示帮助信息。
通过env选中以上配置界面的选项后,
最终可在 rtconfig.h 文件中生成如下两个宏
#define RT_USING_PIN
#define BSP_USING_GPIO
config BSP_USING_WDT
bool "Enable Watchdog Timer"
select RT_USING_WDT
default n
#define BSP_USING_WDT
#define RT_USING_WDT
config RT_CONSOLE_DEVICE_NAME
string "the device name for console"
defalut "uart1"
#define RT_CONSOLE_DEVICE_NAME "uart1"
config BSP_I2C1_SCL_PIN
int "I2C1 scl pin number"
range 1 176
defalut 116
#define BSP_I2C1_SCL_PIN 116
menu/endmenu语句
menu语句用于生成菜单
menu "Hardware Drivers Config"
config BSP_USING_COM2
bool "Enable COM2 (uart2 pin conflict with Ethernet and PWM)"
select BSP_USING_UART
select BSP_USING_UART2
default n
config BSP_USING_COM3
bool "Enable COM3 (uart3 pin conflict with Ethernet)"
select BSP_USING_UART3
default n
endmenu
menu之后的字符串是彩蛋猫,menu和endmenu之间有很多config语句
if/endif语句
menu "Hardware Drivers Config"
menuconfig BSP_USING_CAN
bool "Enable CAN"
default n
select RT_USING_CAN
if BSP_USING_CAN
config BSP_USING_CAN1
bool "Enable CAN1"
default n
endif
endmenu
当没有选中“Enable CAN”时
menuconfig语句
menuconfig语句表示带菜单的配置项
menu "Hardware Drivers Config"
menuconfig BSP_USING_UART
bool "Enable UART"
default y
select RT_USING_SERIAL
if BSP_USING_UART
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
endmenu
menuconfig与config语句很相似,但它在config的基础之上,要求所有的子选项作为独立的行显示。
depends on表示依赖某个配置选项,depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA,表示只有当BSP_USING_UART1和RT_SERIAL_USING_DMA 配置选项同时被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项
source语句
用于读取另一个文件中的Kconfig文件