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

一、初识HAL库

  • 1.1、CMSIS简介
  • 1.2、HAL库简介

二、STM32Cube固件包浅析

  • 2.1、如何获取STM32Cube固件包?
  • 2.2、STM32Cube固件包文件夹简介
  • 2.3、CMSIS文件夹关键文件

三、HAL库框架结构

  • 3.1、HAL库文件夹结构
  • 3.2、HAL库文件介绍
  • 3.3、HAL库API函数和变量命名规则

四、如何使用HAL库

  • 4.1、基于CMSIS应用程序文件描述
  • 4.2、HAL 库的用户配置文件
  • 4.3、stm32f1xx_hal.c 文件

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

一、初识HAL库

1.1、CMSIS简介

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

1.2、HAL库简介

【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第2张图片
这是关于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固件包
【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第3张图片
在这里插入图片描述
【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第4张图片

2.2、STM32Cube固件包文件夹简介

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

Drivers文件夹

【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第6张图片
在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文件夹

【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第7张图片
这是关于 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文件夹关键文件

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

CMSIS标准规定软件包目录

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

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

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

三、HAL库框架结构

3.1、HAL库文件夹结构

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

3.2、HAL库文件介绍

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

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

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

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

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

HAL库回调函数

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

四、如何使用HAL库

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

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

STM32开发文件结构分布

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

4.2、HAL 库的用户配置文件

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

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

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

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

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

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

4.3、stm32f1xx_hal.c 文件

【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第18张图片
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库使用注意事项

【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第19张图片
这是一些使用HAL库时的一些建议和注意事项:

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

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

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

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

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

六、总结

【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第20张图片
【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第21张图片
【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第22张图片
【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第23张图片
【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第24张图片
【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第25张图片
【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)_第26张图片

你可能感兴趣的:(STM32,stm32,嵌入式硬件,单片机,CMSIS,STM32Cube固件包,HAL库框架结构,使用HAL库和注意事项)