HAL 库

HAL 库文章介绍了 STM32 的 HAL 库 包括 CMSIS 标准 HAL 库的三种类型以及 STM32Cube 固件包的结构

大家好,欢迎来到IT知识分享网。

HAL库

1、初识HAL库

1.1 CMSIS 简介

CMSIS(微控制器软件接口标准):Crotex Microcontroller Software Interface Standard,是由ARM和与其合作的芯片厂商、软件工具厂商,共同制定的标准

  • ARM官方提供的CMSIS规范架构

在这里插入图片描述

1.2 HAL库 简介

ST为了方便用户开发STM32芯片开发提供了三种库:

  • 标准外设库:Standard Peripheral Libraries
    • ST最早的库,现在还在用
    • 目前只兼容 F0/F1/F3/F2/F4/L1 系列
    • 目前已停止维护
  • HAL库(硬件抽象层):Hardware Abstraction Layer
    • ST目前主推的库
    • 全系列兼容
    • 兼容性好、移植方便,但效率不太高
  • LL库:Low Layer
    • 与HAL库困捆绑发布
    • 全系列兼容
    • 轻量级、效率高
    • 不匹配部分复杂外设,比如 USB

2、STM32Cube 固件包浅析

STM32Cube固件包即:ST公司基于自己的产品,根据上文ARM官方的CMSIS规范架构标准,提供的CMSIS-Pack

2.1 STM32Cube固件包文件夹简介

  • _htmresc:图片文件
  • Documentation:STM32Cube说明文档
  • Drivers:驱动源码

在这里插入图片描述

  • Middlewares:中间文件

在这里插入图片描述

  • Projects:ST官方开发板案例
  • Utilities:公共组件
  • 其他文件
    • License.md:软件版权信息
    • package.xml:固件包版本信息
    • Readme.md:自述
    • Release_Notes.html:补充或更新说明

2.2 CMSIS文件夹关键文件

  • CMSIS文件夹下文件目录

在这里插入图片描述

  • 关键文件
    • Device:微控制器专用头文件、启动文件、专用系统文件
    • Include:Cortex-M内核及其设备文件、编译器相关头文件

3、HAL库框架结构

3.1 HAL库文件夹结构

STM32F1系列为例:

在这里插入图片描述

  • Inc:HAL库和LL库驱动源码头文件
  • Src:HAL库和LL库驱动源码
  • .chm后缀文件:用户手册

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的方法:
    • 可以从在官方的例程(Projects文件夹)中直接复制
    • 可以从在HAL库驱动源码头文件(Inc文件夹)中复制stm32f1xx_hal_conf_template.h并重命名
  • 裁剪HAL库外设驱动源码(不进行编译):
    • stm32f1xx_hal_conf.h中不需要的外设的宏定义注释掉
    • 不把不需要的HAL库外设驱动源码加到工程文件中
  • 设置外部晶振频率:
    • /* 外部高速晶振频率对应的宏定义 */ #if !defined (HSE_VALUE) #if defined(USE_STM3210C_EVAL) #define HSE_VALUE U /*!< Value of the External oscillator in Hz */ #else #define HSE_VALUE U /*!< 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 */ 

5、HAL库使用注意事项

  • 使用HAL库出现问题,要通过参考手册检查硬件操作是否有问题
  • 尽量不通过修改库源码实现功能,这样不方便库更新,可以拷贝一份库源码,通过修改拷贝的库源码实现想要的需求
  • 有些HAL库API函数执行效率低,可能会直接通过操作寄存器的方式代替
  • 可能HAL库也存在错误,要有怀疑精神

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119842.html

(0)
上一篇 2025-11-02 17:45
下一篇 2025-11-02 18:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信