标准库(Standard Peripheral Library)是STMicroelectronics提供的最基本的库。它提供了对STM32微控制器的底层寄存器和外设的直接访问。标准库的设计目标是提供高度灵活性和低层次的硬件控制,以满足对性能和资源的严格要求。使用标准库,开发人员可以直接操作寄存器来配置和控制微控制器的功能,但需要手动编写大量的底层代码。标准库适用于对性能要求较高的应用和对代码大小和效率有严格要求的项目。
优点:
(1)具有可移植性:标准库函数适用于所有的C语言编译器,可以在不同的开发环境中使用。
(2)具有较好的兼容性:标准库函数在不同的平台上具有较好的兼容性,可以方便地移植和调试。
(3)易于学习和使用:标准库函数的调用方式和C语言的函数调用方式相似,容易学习和使用。
缺点:
(1)执行效率较低:标准库函数的执行效率较低,适用于一些不要求高性能的应用场景。
(2)功能较为简单:标准库函数提供的功能较为简单,不能满足一些高级别的需求。
(3)不支持硬件抽象层:标准库函数不能直接操作硬件,需要通过底层驱动实现硬件抽象层。
标准库与HAL库以及LL库对比如下图:
三种库各有各的优缺点。但是HAL 和 LL是目前官方主推,并重点维护和更新的库。所以我们会着重介绍HAL库和LL库。
HAL是 Hardware Abstraction Layer 的缩写,中文名:硬件抽象层。
HAL 库是 ST 为 STM32 推出的抽象层嵌入式软件,可以更好地确保STM32 产品的最大可移植性。该库提供了一整套一致的中间件组件,如 RTOS,USB,TCP/IP 和 图形 等。HAL 库是基于一个非限制性的 BSD 许可协议(Berkeley Software Distribution)而发布的开源代码。 ST 制作的中间件堆栈(USB 主机和设备库,STemWin)带有允许轻松重用的许可模式, 只要是在 ST 公司的 MCU 芯片上使用,库中的中间件(USB 主机/设备库,STemWin)协议栈即被允许随便修改,并可以反复使用。 总而言之,HAL库使得用户将代码跨芯片使用,不同的MCU芯片(F1/F2...)都可以使用。
优点:
(1)易于学习和使用:HAL库函数的调用方式类似于调用标准库函数,易于学习和使用。
(2)支持硬件抽象层:HAL库函数提供了硬件抽象层,可以直接操作硬件,而不需要底层驱动。
(3)提供了高级别的API函数:HAL库函数提供了一系列高级别的API函数,包括中断处理、DMA传输等功能,方便用户快速开发。
(4)具有可移植性:HAL库函数的可移植性较好,可以在不同的开发环境中使用。
缺点:
(1)执行效率较低:HAL库函数的执行效率较低,适用于对性能要求不高的应用场景。
(2)功能较为简单:HAL库函数的功能较为简单,不能满足一些高级别的需求。
(3)占用空间较大:HAL库函数占用的空间较大,适用于资源充足的应用场景。
LL库(Low-Level Library)是STMicroelectronics在HAL库的基础上提供的更低级别的库。
LL库提供了对底层寄存器和外设的更直接的访问,并提供了一组低级别的API函数。LL库保留了更多的硬件细节,为开发人员提供了更高级别的灵活性和控制。
使用LL库,开发人员可以直接编写更底层的代码,实现对微控制器和外设的精细控制。
优点:
(1)执行效率高:LL库函数与硬件的交互更加直接,执行效率更高,适用于对性能要求较高的应用场景。
(2)更接近硬件:LL库函数更接近硬件,提供了更高的灵活性和可定制性,适用于一些需要对硬件直接控制的应用场景,如设备驱动程序等。
(3)支持硬件抽象层:LL库函数提供了硬件抽象层,可以直接操作硬件,而不需要底层驱动。
缺点:
(1)使用复杂:LL库函数的使用比较复杂,需要对硬件的控制方式有一定的了解,不适合初学者。
(2)不具备移植性:LL库函数的可移植性较差,不同型号的STM32芯片可能会有不同的LL库函数版本,需要根据芯片型号进行选择。
(3)不支持高级别的功能:LL库函数不支持高级别的功能,如中断处理、DMA传输等,需要通过其他方式实现。
HAL库和LL库对stm32的支持情况如下图:
LL库和HAL库各有优缺点,开发者需要根据具体的应用场景选择使用哪种库。下面是LL库和HAL库的对比:
应用场景:LL库适用于对性能要求高的应用场景,如嵌入式系统、实时控制系统等;HAL库适用于快速开发和原型设计,如学习开发STM32、快速开发小型项目等。
编程难度:LL库需要开发者直接操作寄存器,编程难度较大;HAL库提供了更高层次的抽象,编程难度较低。
代码大小:LL库的代码较少,占用内存较少;HAL库的代码较多,占用内存较大。
速度:LL库的速度较快,适用于对性能要求高的应用;HAL库的速度较慢,适用于对性能要求不高的应用。
总的来说,LL库和HAL库各有优缺点,开发者需要根据具体的应用场景选择使用哪一种库。