参考
http://t.csdnimg.cn/txzPo
一、初识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官网
2.2、STM32Cube固件包文件夹简介
Drivers文件夹
在STM32的Drivers文件夹中,有三个子文件夹,分别是BSP、CMSIS和STM32F1xx_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库是为了方便开发者快速上手和使用,但在一些特殊场景下,或者对性能要求较高的情况下,开发者可能需要深入了解硬件,直接操作寄存器或者考虑其他更底层的库。