【STM32】STM32单片机总目录

1、简述

STD(Standard Peripheral Libraries)标准库:面向过程,仅仅是在寄存器上的一层封装操作
HAL(Hardware Abstraction Layer)硬件抽象层:面向对象,将每个外设封装为一个对象,还能通过使用CubeMx软件生成初始化硬件的代码,使用者只需完成业务逻辑即可。运行效率比标准库略低。
LL (Low Layer)底层库: 为了弥补HAL库效率较低的问题,推出了LL库。与HAL库相同,LL库同样支持CUBEMX生成代码,非常方便。并且,在cubemx工程中,不同外设是可以混合使用HAL和LL库的,两者完全兼容。

官方推荐使用HAL库,而且STM32F7等新版本芯片不再支持标准库。初学者通过标准库了解寄存器配置后,就可以转到HAL库,或者直接学习HAL库也可以。

2、标准库和HAL库代码对比

2.1 工程结构对比

HAL库使用STM32xx_HAL_Driver库,库文件以stm32f1xx_hal开头,标准库文件以stm32f10x_开头。从文件名字HAL库f1xx和标准库f10x也能看出HAL更抽象,适应的芯片系列更大。

STM32 HAL 库移植FreeModbus_学习


STM32 HAL 库移植FreeModbus_封装_02

2.2 主函数对比

GPIO操作比较简单,主流程相差不大,需要说明的是HAL将系统时钟单独配置,也能体会到HAL对硬件的抽象操作。HAL定义了延时函数,不用再像标准库,还需要自己实现。

STM32 HAL 库移植FreeModbus_寄存器_03

2.3 GPIO配置

标准库使用RCC_APB2PeriphClockCmd来使能GPIOB的时钟,为什么不使用RCC_APB1PeriphClockCmd呢?因为GPIOB挂在在APB2上,这就需要查手册才能知道。

而HAL使用__HAL_RCC_GPIOB_CLK_ENABLE来直接使能GPIOB的时钟,不用查手册,直接调用库函数,省事儿还不容易出错。对应的,有禁止GPIOB的时钟函数__HAL_RCC_GPIOB_CLK_DISABLE;

引脚配置和初始化大致相同。

STM32 HAL 库移植FreeModbus_单片机_04

2.4 GPIO操作

HAL操作GPIO的接口有读HAL_GPIO_ReadPin、写 HAL_GPIO_WritePin、反转HAL_GPIO_TogglePin等封装好的函数。

而标准库还需要操作寄存器来实现,

2.5 串口配置

再来比对一个串口配置的代码,左侧是HAL库,右则是标准库。
HAL配置串口时,将工作参数(例如波特率、停止位等)和硬件相关的(如时钟、引脚复用等)分开设置。
将硬件相关的分出来,如果以后需要硬件或更换芯片,只需修改这部分代码即可,这就是便于代码的移植。

注意:HAL库的使用有个规则,HAL_UART_Init 中会调用 HAL_UART_MspInit,类似的,其他外设也有HAL_xxx_Init会调用HAL_xxx_MspInit。

重新实现 HAL_xxx_MspInit 函数即可适应不同的硬件,就像C++函数重载,有点面向对象的意思了吧。

STM32 HAL 库移植FreeModbus_寄存器_05