嵌入式系统:驱动层
作者:互联网
Hardware Abstraction Layer:对硬件(外设)进行抽象
一、外设的抽象
1.外设“类”
外设结构体
- 每个外设的所有寄存器的地址是集中且连续的
- 每个寄存器相对于外设段地址,都有相同的偏移量
- 寄存器类型:uint32_t、uint16_t、uint8_t 代表单个寄存器长度
typedef struct{
寄存器类型 寄存器名;
...
} PPP_TypeDef;
2.外设“对象”
外设结构体指针
- 存储器映射:在同一型号MCU中,都被分配一个固定的外设段地址
- 外设段地址的形式为 0xhhhh hhhh UL
#define PPPx_BASE 该外设段地址
#define PPPx ((PPP_Type *) PPPx_BASE)
3.“寄存器”
引用外设结构体指针的成员变量
某个外设的段地址+某个寄存器的偏移量
PPPx->寄存器名
4.“接口函数”
对“寄存器”位操作:实现外设的各种功能
PPP_操作名(){
...
PPPx->寄存器名...//进行相关的位操作
...
}
5.ST提供驱动包
STM32Cube固件包:STM32Cube_FW_XX_Vx.x.x
|-Driver 驱动源文件
|-|-【重要】CMSIS
|-|-【重要】stm32XXxx_HAL_Driver
|-|-BSP:ST为官方开发板设计的板级驱动包:NUCLEO板、探索套件板Discovery、评估板EVAL
|-Middlewares:中间件
|-Project :工程文件官方开发板的demo
|-Utilities :公用组件,包括demo的音频、视频、字库
|-Documentation :使用文档
|-Relase_Notes: 版本更新说明
CMSIS:Cortex Microcontroller Software Interface Standard 由ARM设计的CortexM软件接口标准,ARM实现部分接口,厂商实现部分接口
- CMSIS作为外设最底层驱动:ARM对CM核内外设、ST对STM32的片上外设进行抽象(数据结构和接口函数)
stm32XXxx_HAL_Driver :ST设计的HAL库
- 依赖于CMSIS,主要实现STM32外设的接口函数
- ST:为了更换不同型号MCU时,减少移植的工作量,增加了一个抽象层
BPS:板级支持包
- 依赖于HAL,实现开发板外设的接口函数
- 开发板厂商:为了调整
开发板
时,减少应用层移植的工作量,增加了一个抽象层
应用层:主要使用HAL库和BSP库提供的接口函数
二、CMSIS
CubeMX工程目录 | 外设的数据结构、接口函数 | STM32Cube固件包的Driver目录 |
---|---|---|
Drivers\... | core_cm4.h等文件 | CMSIS\Include |
Drivers\... | stm32f4xx.h stm32f411xe.h system_stm32f4xx.h |
CMSIS\Include\Device\ST\STM32F4xx\Include |
- 【ARM定义】CM外设的结构体、结构体指针、接口函数:core_cm4.h等文件
- 【厂商ST定义】STM32的外设的结构体、结构体指针:stm32f4xx.h、stm32f411xe.h
三、STM32 HAL
CubeMX工程目录 | 外设的数据结构、接口函数 | STM32Cube固件包的Driver目录 |
---|---|---|
Drivers\... | stm32f4xx_hal.h stm32f4xx_hal_cortex.h stm32f4xx_hal_ppp.h stm32f4xx_hal_ppp_ex.h |
STM32F4xx_HAL_Driver\Inc |
Drivers\... | stm32f4xx_hal.c stm32f4xx_hal_cortex.c stm32f4xx_hal_ppp.c stm32f4xx_hal_ppp_ex.c |
STM32F4xx_HAL_Driver\Src |
1.HAL设计
HAL接口函数
- 初始化函数
- IO操作函数:入口参数为句柄、轮询后缀start/stop、中断后缀start_it/stop_it、DMA后缀Start_DMA
- 控制函数
- 状态函数
HAL数据结构
HandleTypeDef:句柄数据类型
- Instance:外设实例(外设寄存器)
- InitTypeDef:每一类功能都有单独的初始化参数
- 外设状态:保护锁、运行状态
- DMA通道句柄
- IO buffer
四、BSP
标签:...,HAL,系统,hal,嵌入式,寄存器,驱动,外设,接口函数 来源: https://www.cnblogs.com/rayoli/p/14808321.html