• 2020.2.4: 更新内容

STM32 Embedded Software

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

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

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

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

STM32 Snippets

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

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

/*** @brief Analog to Digital Converter*/typedef struct
{__IO uint32_t ISR;          /*!< ADC Interrupt and Status register,                          Address offset:0x00 */__IO uint32_t IER;          /*!< ADC Interrupt Enable register,                              Address offset:0x04 */__IO uint32_t CR;           /*!< ADC Control register,                                       Address offset:0x08 */__IO uint32_t CFGR1;        /*!< ADC Configuration register 1,                               Address offset:0x0C */__IO uint32_t CFGR2;        /*!< ADC Configuration register 2,                               Address offset:0x10 */__IO uint32_t SMPR;         /*!< ADC Sampling time register,                                 Address offset:0x14 */uint32_t   RESERVED1;       /*!< Reserved,                                                                  0x18 */uint32_t   RESERVED2;       /*!< Reserved,                                                                  0x1C */__IO uint32_t TR;           /*!< ADC watchdog threshold register,                            Address offset:0x20 */uint32_t   RESERVED3;       /*!< Reserved,                                                                  0x24 */__IO uint32_t CHSELR;       /*!< ADC channel selection register,                             Address offset:0x28 */uint32_t   RESERVED4[5];    /*!< Reserved,                                                                  0x2C */__IO uint32_t DR;          /*!< ADC data register,                                          Address offset:0x40 */
}ADC_TypeDef;typedef struct
{__IO uint32_t CCR;
}ADC_Common_TypeDef;

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

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

标准外设库(Standard Peripheral Libraries)

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

  相对于 HAL 库,标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了 C 函数。开发者需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。
  相对于 STM32 Snippets,标准外设库对各外设的进行了一次封装,而不是仅仅局限在对寄存器的封装。实现了各外设的基本操作接口。
  在文档方面,我只发现了针对 F2 系列和 F3 系列的详细说明文档,如下图所示:

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

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

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

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

STM32Cube

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

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

  从上图不难看出,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库编程的整体架构。关于HAL库的详细介绍,可以参考后文 STM32 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 库编程和使用标准外设库的方式基本一样,但是确会得到比标准外设库更高的效率。

更详细的介绍,请参见博文《STM32 之十一 LL 库详解 及 移植使用说明》

参考

  1. STM32 Embedded Software Overview.pdf
  2. STM32库函数性能对比.pdf
  3. STM32F0xx Snippets firmware package.pdf

STM32 之一 HAL库、标准外设库、LL库(STM32 Embedded Software)相关推荐

  1. STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)

    STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常 ...

  2. hal库选择滴答时钟函数_STM32入门 : HAL库、标准外设库、LL库

      国内使用STM32 单片机的人很多,ST 为开发者提供了非常方便的开发库:有标准外设库(SPL 库).HAL 库.LL 库 三种.前者是ST的老库,后两者是ST现在主推的开发库,其中 LL 库是 ...

  3. 【STM32】标准外设库,系统架构,时钟系统

    文章目录 标准外设库 系统架构 时钟系统 标准外设库 官方库目录列表如下:STM32 标准外设库 工程结构:STM32 不完全手册中新建出来的工程模板 系统架构 STM32 系统架构的知识可以在< ...

  4. STM32标准外设库

    6月份最后一篇技术文章了,记录比较简单的STM32标准外设库. 1. 标准外设库概述 STM32标准外设库是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征,该函数库还包括 ...

  5. vscode+arm-gcc编译STM32标准外设库工程教程(小白亲历填坑版)

    # 1.当前教程所需工具和掌握程度 (1.vscode使用了几周,只是作为程序代码编辑器使用,只装了C/C++代码编辑插件,和一个ReUI主题插件,感觉完成vscode+arm-gcc组合编译工作,得 ...

  6. keil stm32标准库放在哪里_使用Keil MDK以及标准外设库创建STM32工程

    应部分网友要求,最新加入固件库以及开发环境使用入门视频教程,同时提供例程模板,个人录制,欢迎指正.下载地址:http://dl.dbank.com/c0w0ehqynd 2013.3补充在线视频教程 ...

  7. keil stm32标准库放在哪里_STM32(1)——使用Keil MDK以及标准外设库创建STM32工程...

    转载来自:http://emouse.cnblogs.com 1.1 开发工具与开发环境 1. 软件版本 本节所使用Keil MDK 为目前的最新版V4.21.其他版本差别不大,读者可以根据自己使用的 ...

  8. STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用

    STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用 本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6. 文章目录 STM32固件库(标准外设库)入门学习 第 ...

  9. STM32固件库(标准外设库)入门学习 第六章TIM定时器(一)

    STM32固件库(标准外设库)入门学习 第六章TIM定时器(一) 文章目录 STM32固件库(标准外设库)入门学习 第六章TIM定时器(一) 前言 一.定时器类型 1 基本定时器 2 通用定时器 3 ...

最新文章

  1. 2017年安全漏洞审查报告:安全补丁在不断增加,用户却不安装
  2. python 的回调函数
  3. vue内引入jsPlumb流程控制器(一)
  4. 《剑指offer》第十三题(机器人的运动范围)
  5. Docker 三架马车
  6. cscript 执行代码_WSCRIPT与CScript区别
  7. VC6.0加载lib文件的三种方法
  8. Joining Byte Blocks(哈希+带花树)
  9. vs2015-devexpress 安装
  10. 2012第二届GIS制图大赛——公开课技术问题答疑(珍贵资源哦!)
  11. 亚马逊商品详情API接口(item_get-获得AMAZON商品详情接口),亚马逊API接口
  12. DOS命令的英文全称
  13. 使用jenkins流水线完成自动部署服务到K8s
  14. 阿里EasyExcel对Excel复杂模版填充实现并设置单元格格式
  15. OpenHarmony如何控制屏幕亮度
  16. 行测:判断推理(逻辑判断)
  17. 关于U盘中的文件全部变成快捷方式的解决办法
  18. ImageTools-图片格式转换工具类
  19. 2018年度计划清单
  20. 浪涌电流Inrush Current产生原因以及解决方案

热门文章

  1. Wannafly模拟赛3-B 贝伦卡斯泰露(DFS)
  2. Memory System - Cache、DRAM、Disk学习笔记
  3. 如何将爱奇艺视频qsv格式转换为FLV格式
  4. 用Java实现矩阵乘法
  5. 5个最牛的C++恶搞
  6. Postman知识汇总
  7. 关于光缆,你想知道的都在这里
  8. Flask-Login使用详解
  9. 单点登录(四):HTTPS相关知识
  10. DAY6:利用 PHP 编写登陆页面