深入了解HAL库的功能和使用方法
HAL库
1、初识HAL库
1.1 CMSIS 简介
CMSIS(微控制器软件接口标准):Crotex Microcontroller Software Interface Standard,是由ARM和与其合作的芯片厂商、软件工具厂商,共同制定的标准
1.2 HAL库 简介
ST为了方便用户开发STM32芯片开发提供了三种库:
2、STM32Cube 固件包浅析
STM32Cube固件包即:ST公司基于自己的产品,根据上文ARM官方的CMSIS规范架构标准,提供的CMSIS-Pack
2.1 STM32Cube固件包文件夹简介
2.2 CMSIS文件夹关键文件
3、HAL库框架结构
3.1 HAL库文件夹结构
以STM32F1系列为例:
3.2 HAL库文件介绍
以STM32Cube_F1_v1.8.0为例:
文件 | 描述 |
---|---|
stm32f1xx_hal.c stm32f1xx_hal.h | HAL库的初始化、系统滴答,HAL库延时函数等相关函数 |
stm32f1xx_hal_conf.h | HAL库的用户配置文件,用于裁剪HAL库、配置晶振参数等 |
stm32f1xx_hal_def.h | 包含HAL库通用的美剧类型数据和宏定义 |
stm32f1xx_hal_cortex.c stm32f1xx_hal_cortex.h | 内核通用函数定义和声明,如NVIC、MPU、系统软复位、Systick等,其实主要是对core_cm2.h文件的相关函数再次封装 |
stm32f1xx_hal_ppp.c stm32f1xx_hal_ppp.h | 某任意外设驱动源码,PPP表示任意外设 |
stm32f1xx_hal_ppp_ex.c stm32f1xx_hal_ppp_ex.h | 主要是存放外设的扩展(特殊)功能的驱动源码,PPP表示任意外设 |
stm32f1xx_ll_ppp.c stm32f1xx_ll_ppp.h | LL库驱动源码,在部分stm32f1xx_hal_ppp.c或stm32f1xx_hal_ppp_ex.c中会被调用 |
3.3 HAL库API函数和变量命名规则
a. 命名规则
文件名称 | stm32f1xx_hal_ppp.(c/h) | stm32f1xx_hal_ppp_ex.(c/h) |
---|---|---|
函数名 | HAL_PPP_Function | HAL_PPPEx_Function |
外设句柄 | PPP_HandleTypeDef | 无 |
外设工作参数初始化结构体 | PPP_InitTypeDef | PPP_InitTypeDef |
配置参数结构体 | PPP_YyyyConfTypeDef | PPP_YyyyConfTypeDef |
即让某个外设(PPP)完成某个功能(Function),常见的有以下几种:
初始化/反初始化函数:HAL_PPP_Init(),HAL_PPP_DeInit()
外设读写函数:HAL_PPP_Read(),HAL_PPP_Write(),HAL_PPP_Transmit(),HAL_PPP_Receive()
控制函数:HAL_PPP_Set (),HAL_PPP_Get ()
状态和错误:HAL_PPP_GetState (),HAL_PPP_GetError ()
b. HAL库的回调函数
这部分允许用户重定义,并在其中实现用户自定义的功能,使用HAL库最常用的API之一:
回调函数 | 举例 |
---|---|
HAL_PPP_MspInit()/_MspDeInit() | HAL_USART_MspInit()由 HAL_PPP_Init()这个API调用,主要在这个函数中实现外设对应的GPIO、时钟、DMA,和中断开启的配置和操作 |
HAL_PPP_ProcessCpltCallback | HAL_USART_TxCpltCallback 由外设中断或DMA中断调用,调用时API内部已经实现中断标记的清除的操作,用户只需要专注于自己的软件功能实现即可 |
HAL_PPP_ErroCallback | HAL_USART_ErrorCallback外设或DMA中断中发生的错误,用于作错误处理 |
4、如何使用HAL库
以STM32F1系列为例,HAL库的用户配置文件
获取stm32f1xx_hal_conf.h的方法:
裁剪HAL库外设驱动源码(不进行编译):
设置外部晶振频率:
/* 外部高速晶振频率对应的宏定义 */
#if !defined (HSE_VALUE)
#if defined(USE_STM3210C_EVAL)
#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */
#endif
#endif /* HSE_VALUE */
/* 外部低速晶振频率对应的宏定义 */
#if !defined (LSE_VALUE)
#define LSE_VALUE ((uint32_t)32768) /* 外部低速振荡器的值,单位 HZ */
#endif /* LSE_VALUE */