Skip to content

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参数

c
HAL_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进行结尾的函数

c
HAL_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

c
HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
  • 其他方式

标志位的查询, 中断的使能\失能, 时钟的使能\失能

回调函数

HAL库使用了很多的回调函数, 用户自己实现, 但是会导致这个库的性能比较低下, 在中断里面会调用不同的回调函数

总结

  1. 定义并且填充句柄结构体
  2. 遵守HAL库的规范, 通过HAL_xx_MspInit函数初始化GPIO等资源
  3. 调用HAL库的HAL_xxx_Init函数
  4. 初始化完成, 开始使用外设
  5. 查看.c文件的使用说明