Appearance
HAL库驱动框架
- 外设初始化
- 外设使用
对外设进行封装
xx_HandleTypeDef(xx外设的句柄结构体)
- Instance成员, xx_TypeDef, 保存实际操控的对象
c
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
记录实际操控的寄存器, 在stm32f103xe.h文件里面
- xx_InitTypeDef
用于初始化一个具体的对象
- Hdma*成员, DMA_HandleTypeDef类型, 可以有多个
- LOCK锁, HAL_LockTypeDef类型
- STATUS状态, HAL_xx_StateTypeDef
初始化方法
- HAL_xx_Init, 参数一般是句柄结构体
- HAL_xx_MspInit, 会完成底层相关资源的初始化, 比如时钟, 使用到的引脚, 中断使能, DMA开启等, 会在Init函数里面进行调用, 这个需要用户来进行实现
一般在.c文件的How to use this driver里面有
外设的使用
- 阻塞轮训
xx_start
xx_read/xx_write
函数特征, 需要传入一个Timeout参数
cHAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
- 中断
xx_start_it => HAL_XX_IRQHandler => HAL_XX_xxCallback
xx_read_it/xx_write_it
以IT进行结尾的函数
cHAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
- DMA
xx_start_dma
xx_read/write_dma
cHAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
- 其他方式
标志位的查询, 中断的使能\失能, 时钟的使能\失能
回调函数
HAL库使用了很多的回调函数, 用户自己实现, 但是会导致这个库的性能比较低下, 在中断里面会调用不同的回调函数
总结
- 定义并且填充句柄结构体
- 遵守HAL库的规范, 通过HAL_xx_MspInit函数初始化GPIO等资源
- 调用HAL库的HAL_xxx_Init函数
- 初始化完成, 开始使用外设
- 查看.c文件的使用说明