STM32系列单片机的标准外设库、HAL库和LL库的区别和介绍

2023-05-16

本文转载自CSDN博客:ZCShouEXP,点击此处跳转至原博客。

STM32 Embedded Software

  工作以来一直使用意法半导体(ST)的STM32系列MCU,ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL库和LL库三种。前两者都是常用的库,后面的LL库是ST最近才发布的,与HAL源码包一起提供,目前支持的芯片种类也偏少。三种库之间的区别如图1所示:

STM32三种库比较

图1 STM32三种库之间的区别

  其中,STD库和HAL库两者相互独立,互不兼容。STM32三种库的比较如图2所示:

STM32三种库的比较

图2 STM32三种库的比较

  目前几种库对不同芯片的支持情况如图3所示:

STM32三种库对不同芯片的支持情况

图3 STM32三种库对不同芯片的支持情况

  上图中,LL库目前有部分芯片不支持,官方计划2017年逐步完善。

STM32Snippets

  STM32Snippets是代码示例的集合,直接基于STM32外设寄存器,可在文档和软件包中使用。由于处在最底层,因此需要开发者直接操作外设寄存器,对开发者要求比较高,通常针对于对汇编程序比较了解的资深嵌入式工程师!

注意:

  1. 目前只对STM32F0和STM32L0系列芯片中提供STM32Snippets。
  2. 使用STM32Snippets的代码在不同ST芯片之间没有可移植性。


# 标准外设库(Standard Peripheral Libraries)

  标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库。几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。
  相对于HAL库,标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了C函数。开发者需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。

注意:不支持从STM32L0、STM32L4和STM32F7芯片开始之后的STM32系列芯片。

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

    • 包含位,位域和寄存器在内的完整的寄存器地址映射。

    • 涵盖所有外围功能(具有公共API的驱动器)的例程和数据结构的集合。

    • 一组包含所有可用外设的示例,其中包含最常用的开发工具的模板项目。

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

    STM32Cube

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

      其中就包含了HAL库和最近新增的LL库,如图4:

    STM32Cube支持的库

    图4 STM32Cube支持的库

      从上图不难看出,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)也都具有友好的用户许可条款。
      可以说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库结合使用。

      LL库文件的命名方式和HAL库基本相同。个人感觉,LL库就是原来的标准外设库移植到Cube下的新的实现。因为使用LL库编程和使用标准外设库的方式基本一样。


    注意: HAL库详细说明见 STM32之HAL库详解及手动移植,点击此处跳转到对应博客。
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

    STM32系列单片机的标准外设库、HAL库和LL库的区别和介绍 的相关文章

    • SpringMVC配置文件(spring-mvc.xml)

      springMVC主要有以下四个配置 xff1a 1 配置组件扫描 xff0c 必配 xff0c 组件扫描会扫描包下的所有的Controller类 lt 配置组件扫描 gt lt context component scan base pa
    • C++环境配置(MinGW的下载及安装)

      首先说明 xff1a MinGW就是gcc的安装工具 1 下载 MinGW的下载地址 xff1a www mingw org xff0c 点击右上角的Download Installer即可下载 2 安装mingw get setup ex
    • 如何使用imp导入dmp文件

      一 创建临时表空间 xff1a create temporary tablespace yd temp tempfile 39 D oracledata file temp dbf 39 路径根据实际情况填写 size 50m autoex
    • I2C设备主机与从机地址设置

      1 I2C主机与从机定义 I2C设备一般使用MCU作为主机 xff0c 主机与从机通过总线连接起来 xff0c 分别是SCL时钟总线和SDA数据总线 xff0c 主机发送给从机SCL时钟信号 xff0c SDA发送数据 xff0c 如下图所
    • EFM32jg之FreeRTOS(5)-任务调度、创建、切换

      64 EFM32JG移植FreeRTOS 1 任务调度器 1 xff09 创建空闲任务 xff0c 优先级为0 xff0c 表示最低优先级 xff0c 在无其他高优先级任务的情况下 xff0c 执行空闲任务 xff0c 若打开configU
    • 令人厌恶的错误MSB3721,以及win10,VS2019,YOLO V4 环境搭建

      总结一下yolo环境的搭建 xff0c 以及MSB3721的一种解决方案 xff0c 如果有相似的背景 xff0c 不妨一试 另外在搭建环境的过程中 xff0c 感觉最浪费时间的就是下载所需的安装包 xff0c 因为是外网 xff0c 速度
    • python&多路归并

      问题 xff1a 在项目中 xff0c 需从待分析的数据中选出最大的前几名 xff0c 但由于数据量太大 xff0c 直接排序会内存报错 xff0c 因此尝试用多路归并的思路来解决问题 接口 xff1a 一个目录下有x个已排序好的csv 最
    • PX4飞控学习(四)

      系统启动 启动文件 xff1a nuttx arch arm stm32 stm32 start c stm32 clockconfig span class hljs regexp span 时钟 stm32 fpuconfig span
    • VSCode 搭建 C++ 开发环境

      文章目录 前言一 获取参考资料二 下载安装 VSCode三 安装编译器四 添加环境变量五 使用VSCode 开发 C 43 43 程序总结 前言 鲁迅曾说过 xff0c 不以敲代码为目的的学编程都是耍流氓 xff01 我最近在撸 C 43
    • Ubuntu安装VMware

      Ubuntu安装VMware xff08 1 xff09 需求 由于windows 的日渐卡顿还有变态的更新 xff0c 我的需求就是稳定单调优化好所以我通过Ubuntu 安装VMware xff0c 然后开启虚拟机继续学习 xff08 2
    • python实现TCP通信

      本例是在Ubuntu虚拟机中本机互传实现的TCP通信 一 TCP服务器端 xff08 server端 xff09 1 创建套接字 xff0c 绑定套接字到本地IP与端口 s 61 socket socket socket AF INET s
    • agrc argv解释

      以前经常看见过 xff1a int main int argc char argv 这样形式的main但是一直没有这样用直到研究点云时发现有个例子是 xff1a gt exe pcd 这样的doc下的命令才想起有这样的两个参数 xff0c
    • 个人面试细节、技巧总结(没有面试题哦!)

      面试除了自身技能过硬外 xff0c 良好的沟通 xff0c 平和的心态 xff0c 细节的拿捏也都是额外的加分项 最后 xff0c 以些许运气加以点缀 xff0c offer 便八九不离十了 参加工作两年有余 xff0c 只大专文凭 xff
    • 【记录】ORB-SLAM3编译以及在realsense D435i运行

      环境 xff1a 最开始用的是源码是ORB SLAM3 的1 0版本 xff0c 但是编译的时候出错太多了 xff0c 超出了能力范围 xff0c 更换了0 4 beta版本 xff0c 但是这个版本在运行的时候会直接segmentatio
    • ArtiPub

      ArtiPub ArtiPub Article Publisher的简称 xff0c 意为 34 文章发布者 34 是一款开源的一文多发平台 xff0c 可以帮助文章作者将编写好的文章自动发布到掘金 SegmentFault CSDN 知乎
    • mac安装配置zsh

      mac安装配置zsh 比mac自带的shell好用太多 一 安装homebrew 参考 xff1a https brew sh index zh cn bin bash c span class token string 34 span c
    • 手把手教你给win10 2004版本的ubuntu1804子系统安装docker

      ubuntu1804子系统安装docker ce 分两种情况 xff1a 1 win10版本小于2004版本2 win10版本大于2004版本 一 说明 win10版本小于2004的话 xff0c 可以使用WSL1 0 xff0c WSL1
    • windows安装scoop

      参考 xff1a https scoop sh 参考 xff1a https github com lukesampson scoop wiki Quick Start 懂不懂 xff0c 先装上 xff0c 这样你就完成了该工具学习的第一
    • PX4飞控学习(五)

      PX4的应用 程序入口为 程序名 main int argc char argv 这里实现应用参数 主循环函数在 task main int argc char argv thread main int argc char argv 等函数
    • 转载kubernetes 1.9 与 CentOS 7.3 内核兼容问题

      20201022转载kubernetes 1 9 与 CentOS 7 3 内核兼容问题 原文 xff1a http www linuxfly org kubernetes 19 conflict with centos7 生产环境发现不定

    随机推荐