你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 之一 HAL库、标准外设库、LL库(STM32 Embedded Software)

[复制链接]
STMCU 发布时间:2020-9-23 09:48
STM32 Embedded Software

  工作以来一直使用 ST 的 STM32 系列芯片,ST 为开发者提供了非常方便的开发库。到目前为止,有标准外设库(SPL 库)、HAL 库、LL 库 三种。前两者都是常用的库,后面的 LL 库是 ST 最近才添加,随 HAL 源码包一起提供,目前支持的芯片也偏少。各库如下所示:


1_meitu_1.jpg


  其中,SPL 库 和 HAL 库两者相互独立,互不兼容。几种库的比较如下:


2_meitu_2.jpg


  目前几种库对不同芯片的支持情况如下:
3_meitu_3.jpg


  ST 中文官网上有一篇《关于ST库函数的代码性能对比》的文章,其中对比了各种库的性能如下:


4_meitu_4.jpg



STM32 Snippets

  它是代码示例的集合,直接基于 STM32 外设寄存器,可在文档和软件包中使用。由于处在最底层,因此需要开发者直接操作外设寄存器,对开发者要求比较高,通常针对于对汇编程序比较了解的资深嵌入式工程师!
  这个库使用比较少,目前只在 STM32F0 和 STM32L0 系列中有提供。两个库都有各自的说明文档。主要就是下图所示的这些:


5_meitu_5.jpg


严格来说,它不能称为库,仅仅就是将 MCU 中的寄存器进行了结构化的封装,库文件主要就是一些 .h 文件。如下是对 ADC 的封装


  1. /**
  2.   * @brief Analog to Digital Converter
  3.   */

  4. typedef struct
  5. {
  6.   __IO uint32_t ISR;          /*!< ADC Interrupt and Status register,                          Address offset:0x00 */
  7.   __IO uint32_t IER;          /*!< ADC Interrupt Enable register,                              Address offset:0x04 */
  8.   __IO uint32_t CR;           /*!< ADC Control register,                                       Address offset:0x08 */
  9.   __IO uint32_t CFGR1;        /*!< ADC Configuration register 1,                               Address offset:0x0C */
  10.   __IO uint32_t CFGR2;        /*!< ADC Configuration register 2,                               Address offset:0x10 */
  11.   __IO uint32_t SMPR;         /*!< ADC Sampling time register,                                 Address offset:0x14 */
  12.   uint32_t   RESERVED1;       /*!< Reserved,                                                                  0x18 */
  13.   uint32_t   RESERVED2;       /*!< Reserved,                                                                  0x1C */
  14.   __IO uint32_t TR;           /*!< ADC watchdog threshold register,                            Address offset:0x20 */
  15.   uint32_t   RESERVED3;       /*!< Reserved,                                                                  0x24 */
  16.   __IO uint32_t CHSELR;       /*!< ADC channel selection register,                             Address offset:0x28 */
  17.   uint32_t   RESERVED4[5];    /*!< Reserved,                                                                  0x2C */
  18.    __IO uint32_t DR;          /*!< ADC data register,                                          Address offset:0x40 */
  19. }ADC_TypeDef;

  20. typedef struct
  21. {
  22.   __IO uint32_t CCR;
  23. }ADC_Common_TypeDef;
复制代码



在实际使用时,我们就可以结构化的访问 MCU 的寄存器,如下是配置 ADC 的函数实现:


  1. /**
  2.   * @brief  This function configure the ADC to convert the internal reference voltage (VRefInt)
  3.   *         The conversion frequency is 14MHz
  4.   * @param  None
  5.   * @retval None
  6.   */
  7. __INLINE void ConfigureADC(void)
  8. {
  9.     /* (1) Select the clock mode (refer ADC_PRESCALER definition :
  10.          HSI14 by writing 00 in CKMODE (reset value)
  11.          DIV2 or DIV 4 */
  12.     /* (2) Select the auto off mode */
  13.     /* (3) Select CHSEL17 for VRefInt */
  14.     /* (4) Select a sampling mode of 111 i.e. 239.5 ADC clk to be greater than 17.1us */
  15.     /* (5) Wake-up the VREFINT (only for VBAT, Temp sensor and VRefInt) */
  16.     ADC1->CFGR2 |= ADC_PRESCALER;                                   /* (1) */
  17.     ADC1->CFGR1 |= ADC_CFGR1_AUTOFF;                                /* (2) */
  18.     ADC1->CHSELR = ADC_CHSELR_CHSEL17;                              /* (3) */
  19.     ADC1->SMPR |= ADC_SMPR_SMP_0 | ADC_SMPR_SMP_1 | ADC_SMPR_SMP_2; /* (4) */
  20.     ADC->CCR |= ADC_CCR_VREFEN;                                     /* (5) */
  21. }
复制代码

标准外设库(Standard Peripheral Libraries)

  标准外设库(Standard Peripherals Library)是对 STM32 芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的 ST 库。几乎全部使用 C 语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。

6_meitu_6.jpg


  相对于 HAL 库,标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了 C 函数。开发者需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。


  相对于 STM32 Snippets,标准外设库对各外设的进行了一次封装,而不是仅仅局限在对寄存器的封装。实现了各外设的基本操作接口。


  在文档方面,我只发现了针对 F2 系列和 F3 系列的详细说明文档,如下图所示:


10_meitu_10.jpg


标准外设库的文件基本架构并不复杂。下图显示了 STM32F10xx 标准外设库文件的基本架构


7_meitu_7.jpg


其他系列的库文件结构和上图基本都是一致的!


  ST 为各系列提供的标准外设库稍微有些区别。例如,STM32F1x 的库和 STM32F3x 的库在文件结构上就有些不同,此外,在内部的实现上也稍微有些区别,这个在具体使用(移植)时,需要注意一下!但是,不同系列之间的差别并不是很大,而且在设计上是相同的。STM32 的标准外设库涵盖以下 3 个抽象级别:


  • 包含位,位域和寄存器在内的完整的寄存器地址映射
  • 涵盖所有外围功能(具有公共API的驱动器)的例程和数据结构的集合。
  • 一组包含所有可用外设的示例,其中包含最常用的开发工具的模板项目。

  关于更详细的信息,可以参考 ST 的官方文档,文档中对于标准外设库函数命名、文件结构等都有详细的说明。


STM32Cube

  ST 为新的标准库注册了一个新商标:STMCube™。并且,ST专门为其开发了配套的桌面软件 STMCubeMX,开发者可以直接使用该软件进行可视化配置,大大节省开发时间。

8_meitu_8.jpg


  这其中就包含了 HAL 库和最近新增的 LL 库。如下图:


9_meitu_9.jpg


  从上图不难看出,LL 库和 HAL 库两者相互独立,只不过 LL 库更底层。而且,部分 HAL 库会调用LL库(例如:USB驱动)。同样,LL 库也会调用 HAL 库

  用户可以使用 STMCubeMX 直接生成对应芯片的整个项目(目前主流开发工具的项目基本全支持),STMCubeMX 负责给整理各种需要的源码文件。


注意:
  1. 个人感觉STMCubeMX生成的项目并不够简洁,源码的组织结构也并不是很好。
  2. STMCubeMX在生产项目时,可以选择使用HAL库或者LL库。但是部分组件的HAL库会调用LL库


HAL 库

  HAL是 Hardware Abstraction Layer 的缩写,中文名:硬件抽象层。HAL 库是 ST 为 STM32 最新推出的抽象层嵌入式软件,可以更好的确保跨 STM32 产品的最大可移植性。该库提供了一整套一致的中间件组件,如 RTOS,USB,TCP/IP 和 图形 等。
  HAL 库是基于一个非限制性的 BSD 许可协议(Berkeley Software Distribution)而发布的开源代码。 ST 制作的中间件堆栈(USB 主机和设备库,STemWin)带有允许轻松重用的许可模式, 只要是在 ST 公司的 MCU 芯片上使用,库中的中间件(USB 主机/设备库,STemWin)协议栈即被允许随便修改,并可以反复使用。至于基于其它著名的开源解决方案商的中间件(FreeRTOS,FatFs,LwIP和PolarSSL)也都具有友好的用户许可条款。
  作为目前 ST 主推的外设库,HAL库相关的文档还是非常详细的。




  可以说HAL 库就是用来取代之前的标准外设库的。相比标准外设库,STM32Cube HAL 库表现出更高的抽象整合水平,HAL API 集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了,比如 F7 系列。目前,HAL库已经支持STM32全线产品。


  使用HAL库编程,最好尽量符合HAL库编程的整体架构。


LL 库

  LL库(Low Layer)是 ST 最近新增的库,与 HAL 库捆绑发布,文档也是和 HAL 库文档在一起的,比如:在STM32F3x 的 HAL 库说明文档中,ST 新增了LL库这一章节,但是在 F2x 的HAL文档中就没有。
  LL 库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。其支持所有外设。使用方法:

  • 独立使用,该库完全独立实现,可以完全抛开 HAL 库,只用LL库编程完成。在使用STM32CubeMX生成项目时,直接选LL库即可。如果使用了复杂的外设,例如 USB,则会调用 HAL 库
  • 混合使用,和 HAL 库结合使用。

目前,CubeMX 在生成项目时,可以选择采用 LL 库。

  LL 库文件的命名方式和 HAL 库基本相同。个人感觉,LL 库就是原来的标准外设库移植到 Cube下的新的实现,但是其实现方法更加高效、简洁。使用 LL 库编程和使用标准外设库的方式基本一样,但是确会得到比标准外设库更高的效率。



收藏 评论2 发布时间:2020-9-23 09:48

举报

2个回答
ts2000 回答时间:2020-9-23 13:53:39
谢谢分享!!
giftclimb 回答时间:2020-9-23 17:06:51
感谢

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版