HAL库、标准外设库(STD)、LL库
从学习51单片机转而进一步学习STM32的可能大都习惯了寄存器开发方式,STM32同样可以用操作寄存器的方式开发,但是STM32的数百个寄存器记起来十分困难,因此我们更多的使用固件库的形式开发。固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供一整套接口(API)供开发者调用。
ST(意法半导体)为了方便用户开发程序,提供了丰富的官方固件库 。到目前为止,有标准外设库(STD库)、HAL库、LL库 三种。前两者都是常用的库,后面的LL库是ST最近才添加,随HAL源码包一起提供。STD库和HAL库两者相互独立,互不兼容。
目前几种库对不同芯片的支持情况:
CMSIS标准
ARM是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而TI、ST这样的芯片公司,根据ARM公司提供的芯片内核标准设计自己的芯片。所以,任何一个做 Cortex-M 芯片,他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO以及其他模块的区别。同一家公司设计的多种 Cortex-M 内核芯片的片上外设也会有很大的区别。
既然大家都使用的是 Cortex -M 内核,本质上大家都是一样的,这样ARM公司为了能让不同的芯片公司生产的 Cortex-M 芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准 CMSIS标准( Cortex Microcontroller Software Interface Standard),翻译过来是“ARM Cortex™ 微控制器软件接口标准“。ST官方库就是根据这套标准设计的。
CMSIS分为3个基本功能层:
- 核内外设访问层:ARM公司提供的访问,定义处理器内部寄存器地址以及功能函数。
- 中间件访问层:定义访问中间件的通用API。由ARM提供,芯片厂商根据需要更新。
- 外设访问层:定义硬件寄存器的地址以及外设的访问函数。
标准外设库(Standard Peripheral Libraries)
标准外设库(STD库)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库。几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。
相对于HAL库,标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了C函数。开发者需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。
注意:不支持从STM32 L0,L4和F7开始的之后的STM32系列芯片
STM32F4 标准外设库文件关系图:
HAL 库
HAL(Hardware Abstraction Layer)库:中文名:硬件抽象层。HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。该库提供了一整套一致的中间件组件,如RTOS,USB,TCP / IP和图形等。
相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,ST新出的芯片已经没有STD库了。目前,HAL库已经支持STM32全线产品。
LL库
LL库(Low Layer):LL库是ST最近新增的库,与HAL捆绑发布,文档也是和HAL文档在一起的,LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。其支持所有外设。LL 库文件的命名方式和 HAL 库基本相同。
如果想要更加详细的上述几个库,推荐下某位大佬的博客,讲的十分明了。STM32 之一 HAL库、标准外设库、LL库(STM32 Embedded Software)
对比
总体来看,代码效率与移植性成反比的规律是明显的。但与Cube HAL相比, Cube LL的效率优势还是很明显的,几乎和直接写寄存器的效率相差无几。而且目前STM32cubeMX已经开始支持直接生成使用Cube LL的工程,对于追求效率的开发应用人员来说,非常值得推荐给大家使用。