【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)

一、初识HAL库

二、STM32Cube固件包浅析

三、HAL库框架结构

四、如何使用HAL库

五、HAL库使用注意事项
六、总结

一、初识HAL库

1.1、CMSIS简介

在这里插入图片描述

1.2、HAL库简介

在这里插入图片描述
这是关于ST(STMicroelectronics)提供的三种不同的库的简要介绍:

  1. 标准外设库 (Standard Peripheral Libraries):

    • 兼容系列: F0/F1/F3/F2/F4/L1
    • 特点: 该库早期由ST提供,用于支持多个STM32系列。然而,目前已经停止维护,因此不再推荐新项目使用。
  2. HAL库 (硬件抽象层,Hardware Abstraction Layer):

    • 兼容系列: HAL库是ST目前主推的库,适用于整个STM32系列。
    • 特点: HAL库提供了更高层次的抽象,使用户更容易移植代码。它设计用于提供对硬件的标准化抽象,从而提高了代码的兼容性和易移植性。然而,由于其高层次的抽象,可能会导致一些性能损失。
  3. LL库 (Low Layer):

    • 兼容系列: 全系列兼容,与HAL库捆绑发布。
    • 特点: LL库是HAL库的补充,提供了更底层的硬件访问接口。它的设计目标是在提供高度可移植性的同时,尽可能保持较高的效率。由于较低层次的硬件访问,LL库通常用于处理对性能和效率要求较高的任务,或者在HAL库中无法满足的特定硬件配置。

在选择库时,开发人员需要权衡易用性、兼容性、移植性和性能等方面的因素,以选择最适合其项目需求的库。

二、STM32Cube固件包浅析

2.1、如何获取STM32Cube固件包?

获取相关STM32Cube 官方固件包(F1/F4/F7/H7)的方法:
STM32Cube官网

路径:战舰 V4资料:资料→8,STM32 参考资料→1,STM32CubeXX固件包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2、STM32Cube固件包文件夹简介

在这里插入图片描述

Drivers文件夹

在这里插入图片描述
在STM32的Drivers文件夹中,有三个子文件夹,分别是BSPCMSISSTM32F1xx_HAL_Driver。以下是它们的简要说明:

  1. BSP (Board Support Package):

    • 作用: 用于适配ST官方的开发板。
    • 详细: BSP文件夹包含了与特定开发板相关的驱动代码和配置文件,旨在提供对该开发板硬件的支持。这包括了针对LED、按键、显示屏等外设的配置和初始化代码。
  2. CMSIS (Cortex Microcontroller Software Interface Standard):

    • 作用: 符合CMSIS标准的组件。
    • 详细: CMSIS文件夹中包含了符合CMSIS标准的组件,其中包括DSP库、Cortex-M内核及其设备文件、微控制器专用头文件、启动文件以及专用系统文件等。这些文件是为了提供与Cortex-M内核相关的标准化支持,以便在不同的开发环境中实现代码的可移植性。
  3. STM32F1xx_HAL_Driver:

    • 作用: HAL库外设驱动源码。
    • 详细: 这个文件夹包含了STM32F1系列的HAL(Hardware Abstraction Layer)库源代码和头文件。HAL库是一个高度抽象的库,提供了与硬件外设的标准接口,使用户能够以更高级别的抽象编写代码,增加了可移植性和易用性。

Middlewares文件夹

在这里插入图片描述
这是关于 Middlewares 文件夹下的子文件夹的简要介绍:

ST:

  1. STemWin:

    • 作用: STemWin工具包,是ST提供的用于图形用户界面(GUI)开发的工具包。它包括一组图形库和相关的工具,帮助开发人员创建嵌入式系统上的图形界面。
  2. STM32_USB_Device_Library:

    • 作用: USB从机设备支持包。这是用于开发支持USB从机设备功能的库,允许STM32设备作为USB设备进行通信。
  3. STM32_USB_Host_Library:

    • 作用: USB主机设备支持包。这是用于开发支持USB主机设备功能的库,允许STM32设备与其他USB设备进行通信。

Third_Party:

  1. FatFs:

    • 作用: FAT文件系统支持包。FatFs是一个用于在嵌入式系统上实现FAT文件系统的开源库。
  2. FreeRTOS:

    • 作用: FreeRTOS实时系统支持包。FreeRTOS是一个用于嵌入式系统的开源实时操作系统内核,提供了任务调度、消息传递等功能。
  3. LwIP:

    • 作用: LwIP网络通信协议支持包。LwIP(轻型IP)是一个用于嵌入式系统的开源TCP/IP协议栈,用于支持网络通信。

2.3、CMSIS文件夹关键文件

在这里插入图片描述

CMSIS标准规定软件包目录

在这里插入图片描述

Device和Include文件夹的关键文件介绍

在这里插入图片描述

三、HAL库框架结构

3.1、HAL库文件夹结构

在这里插入图片描述

3.2、HAL库文件介绍

在这里插入图片描述

3.3、HAL库API函数和变量命名规则

在这里插入图片描述

HAL库对寄存器位操作的相关宏定义

在这里插入图片描述

HAL库回调函数

在这里插入图片描述

四、如何使用HAL库

4.1、基于CMSIS应用程序文件描述

在这里插入图片描述

STM32开发文件结构分布

在这里插入图片描述

4.2、HAL 库的用户配置文件

在配置HAL库的用户配置文件时,一些关键的步骤和设置包括:

  1. 裁剪HAL库外设驱动源码:

    • 根据实际需求选择需要的外设驱动,可以在用户配置文件中通过宏定义的方式进行选择。不需要的外设驱动可以被裁剪,以减小代码体积。
  2. 设置外部高速晶振频率:

    • 根据你的开发板使用的外部高速晶振的实际频率,更新HAL库的配置文件中的相关参数。这通常包括 HSE_VALUE 宏定义,确保它与实际硬件一致。
  3. 设置外部低速晶振频率:

    • 如果你的系统中使用了外部低速晶振,同样需要在用户配置文件中设置相关的参数,通常是 LSE_VALUE 宏定义。

以上步骤的具体实现可能因HAL库的版本而异。建议查阅HAL库的文档或相关参考资料,以获取详细的步骤和宏定义。一般来说,这些配置会在类似 stm32xxxx_hal_conf.h 这样的文件中进行。

4.3、stm32f1xx_hal.c 文件

在这里插入图片描述
stm32f1xx_hal.c文件中的HAL_Init函数,用于初始化HAL库。下面是对这个函数的主要步骤的解释:

HAL_StatusTypeDef HAL_Init(void) 
{ 
    __HAL_FLASH_PREFETCH_BUFFER_ENABLE();       /* 使能FLASH预取缓冲 */ 

    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); /* 配置中断优先级分组 */ 

    /* 使用滴答定时器作为时钟基准,配置 1ms 滴答(重置后默认的时钟源为 HSI) */ 
    HAL_InitTick(TICK_INT_PRIORITY); 

    HAL_MspInit();  /* 初始化其它底层硬件(如果必要) */ 

    return HAL_OK;  /* 返回函数状态 */ 
}

解释:

  1. __HAL_FLASH_PREFETCH_BUFFER_ENABLE(): 该宏用于使能Flash预取缓冲,提高Flash读取效率。

  2. HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2): 配置中断优先级分组。在这里,选择了分组2,这是HAL库中默认的中断优先级分组。

  3. HAL_InitTick(TICK_INT_PRIORITY): 使用滴答定时器作为时钟基准,并配置1ms滴答。TICK_INT_PRIORITY 是滴答定时器中断的优先级。

  4. HAL_MspInit(): 该函数用于初始化其他底层硬件,可能是一些与外设相关的底层初始化。需要用户自行实现该函数,以适应具体的硬件环境。

  5. 返回 HAL_OK,表示函数执行成功。

这个函数通常在程序的入口处被调用,用于初始化HAL库及相关的系统设置。

五、HAL库使用注意事项

在这里插入图片描述
这是一些使用HAL库时的一些建议和注意事项:

  1. 硬件问题排查: 如果在使用HAL库时遇到问题,首先应该检查硬件操作是否正确。参考芯片的数据手册和参考手册,确保硬件连接和配置正确。

  2. 不修改库源码: 尽量避免直接修改HAL库的源代码。这样可以确保在库更新时能够顺利进行升级,而不需要手动合并或修改新的库源码。

  3. 质疑精神: 有时候HAL库可能存在一些问题或不足之处,要有质疑的精神。查阅ST的官方文档、社区、以及其他开发者的经验,以了解潜在的问题和解决方案。

  4. 效率考虑: 一些HAL库提供的API函数可能效率较低,特别是对一些特殊需求的外设控制。在需要更高效率的场景下,可以考虑直接操作寄存器的方式,以减少函数调用的开销。

总体来说,HAL库是为了方便开发者快速上手和使用,但在一些特殊场景下,或者对性能要求较高的情况下,开发者可能需要深入了解硬件,直接操作寄存器或者考虑其他更底层的库。

六、总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 35
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32G070是意法半导体公司推出的一款32位微控制器系列,适用于低功耗应用场景。而HAL库STM32系列微控制器开发中常用的硬件抽象层,可以提供方便易用的API接口,简化了对微控制器外设的驱动和控制。 STM32G070 HAL库为开发者提供了丰富的功能组件,括GPIO(通用输入输出)、UART(串行通信)、SPI(串行外设接口)、I2C(串行外设接口)、定时器等。开发者可以通过简单的函数调用来完成对这些外设的配置和操作。 HAL库使用起来非常方便。首先,开发者需要初始化相应的外设,例如使用HAL_GPIO_Init函数初始化GPIO引脚。然后,可以使用HAL_XXX_XXX函数进行读写操作,例如使用HAL_UART_Transmit函数发送数据。此外,HAL库还提供了一些中断处理函数,如HAL_UART_RxCpltCallback可以在接收到UART数据时自动调用,方便开发者编写中断服务程序。 使用STM32G070 HAL库的好处是,它提供了一系列简单易懂的API函数,降低了使用者的开发门槛。通过使用HAL库,开发者可以更高效地利用STM32G070的功能,提高开发效率。同时,HAL库是基于CMSIS(Cortex Microcontroller Software Interface Standard,Cortex微控制器软件接口标准)开发的,保证了代码的可移植性,可以方便地迁移至其他系列的STM32微控制器。 总之,STM32G070 HAL库是适用于STM32G070系列微控制器的硬件抽象层,为开发者提供了简便易用的API接口,方便配置和操作微控制器的外设。使用HAL库可以提高开发效率,降低开发门槛,并保证代码的可移植性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖喱年糕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值