本文目的是以串口通信来简要分析STM32使用标准库函数和HAL库函数编程的差异。

(一)开发方式

1.配置寄存器

  • 很多人学习51单片机开发的时候,基本都是直接操作寄存器进行单片机的控制,但是当他们转向STM32开发的时候,直接操作寄存器不是那么容易了,因为STM32的寄存器数量是51单片机的许多倍,开发时经常需要翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。
  • 但是寄存器是最接近硬件的部分,直接操作寄存器能够很容易的实现自己想要的功能,并且遇到问题时能够知道是哪个寄存器的配置出现了问题,这种开发方式虽然十分麻烦但却让人能够深入理解单片机的运行原理。

2.库函数

  • 由于寄存器开发难度很大,因此ST公司就专门编写了芯片的库函数(固件库),将一些常用量的宏定义和一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。
  • 标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库,几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。

3.HAL库

  • HAL(Hardware Abstraction Layer)是硬件的抽象层,它表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的对用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。下图是HAL库的整体框架。
    框架
  • HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了,比如F7系列。现在,ST主推HAL库,目前,HAL库已经支持STM32全线产品。总的来说,HAL库相对于库函数层次架构更加清晰,更加抽象。

(二)库函数与HAL库对比

1.串口通信实验

  • 库函数主要代码
    1
  • HAL库主要代码
    2

2.库函数与HAL库比较

  • 库函数配置好串口以后,当串口接收到数据再发送给上位机时需要循环发送,但是HAL库就直接调用HAL_UART_Transmit函数就能直接将串口的数据发给上位机。
  • 库函数的串口通信函数只适用于STM32F1系列,对于其他系列的就不能通用了;但是对于HAL库来说,只要外设相同,基本上能够很容易的移植。

(三)总结

通过比较STM32库函数和HAL库的开发方式,库函数和HAL库其实本质上都是将STM32的底层的寄存器进行封装并向用户提供友好的接口,这都极大的降低了用户的开发门槛。但是相对于库函数来说,HAL库更加“通用”,能够较好的移植到其他的芯片上去,但也正是这样,导致其代码比较庞大、执行效率比较低的结果。总的来说,HAL库相对于库函数更加友好,能够让用户将精力放在开发的产品上而不是怎么实现。

由于作者水平有限,文中难免有疏漏之处,希望读者批评指正。

参考文章:
1.通俗易懂解析stm32 (一) HAL库 标准库 直接配置寄存器 三种开发方式的区别
2.STM32标准库与HAL库比较
3.stm32-hal库开发入门
4.STM32 HAL库与标准库的区别

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐