STM32 之 HAL库、标准外设库、LL库

发布者:JoyfulExplorer最新更新时间:2022-12-05 来源: zhihu关键字:STM32  HAL库  标准外设库  LL库 手机看文章 扫描二维码
随时随地手机看文章

STM32 Embedded Software

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



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



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



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


STM32Snippets

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


注意:


目前只在STM32F0和L0系列中有提供

代码在不同ST芯片间没有可移植性

标准外设库(Standard Peripheral Libraries)

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

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


注意:不支持从STM32 L0,L4和F7开始的之后的STM32系列芯片


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)也都具有友好的用户许可条款。

可以说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库编程和使用标准


关键字:STM32  HAL库  标准外设库  LL库 引用地址:STM32 之 HAL库、标准外设库、LL库

上一篇:STM32低功耗控制心得体会
下一篇:STM32F103+RT-Thread从零开始(二)——RTT系统中点亮LED

推荐阅读最新更新时间:2024-11-10 11:51

STM32启动代码分析问题
能否讲解一下startup_stm32f10x_cl.s启动代码含义,谢谢! 我现在看反汇编如下 0x08000000 0678 LSLS r0,r7,#25 (查看Memory窗口0x08000000 : 78 06 00 20 ---STM32小端缘故) 0x08000002 2000 MOVS r0,#0x00 0x08000004 1105 ASRS r5,r0,#408 0x08000006 0800 LSRS r0,r0,#00A 。。。。。。。。。。。。。。。。。。。。。。 上面应该对应 __Vectors DCD __initial_sp ; To
[单片机]
Stm32、STC的命名原则
去STC的官网看了看感觉真心很山寨,连数据手册都这么山寨风 真心不容易。 不过好用就行,感觉功能还挺强大的。支持国产。 STM32系列命名规则 STM32 F 103 C 6 T 7 xxx 1 2 3 4 5 6 7 8 第1部分:产品系列名, 固定为STM32 第2部分:产品类型; F表示这是Flash产品,目前没有其它选项 第3部分:产品子系列; 103表示增强型产品, 101表示基本型产品 105表示集成一个全速USB 2.0 Host/Device/OTG接口和两个具有先进过滤功能的CAN2.0B控制器, 107表示在STM32F105系列基础增加一个10/100以
[单片机]
<font color='red'>Stm32</font>、STC的命名原则
STM32移植FATFS,读取SD卡上FAT12/16/32文件系统
给stm32移植fatfs文件系统,今天终于取得阶段性胜利。只需要提供这样几个函数即可 DSTATUS disk_initialize (BYTE); DSTATUS disk_status (BYTE); DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); // 如果实现只读的文件系统就不需要了。 DRESULT disk_ioctl (BYTE, BYTE, void*); 移植成功后,可以用如下方式读取SD卡了,实在太方便了,和PC机上编程差不了多少。 unsigned in
[单片机]
独立看门狗实狗实验—IWDG
概述: 为什么要看门狗? 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。 独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。 功能介绍: 在键值寄存器(IWDG_KR)中写入0xCCCC,开始
[单片机]
独立看门狗实狗实验—IWDG
STM32之TIM3_PWM程序
简介:STM32之TIM3_PWM程序详解:调整CCR2_Val的值来改变占空比,逐步的控制LED1的亮度, 占空比大过一定值时,亮度的变化就不明显了,所以CCR2_VAL最大设定到17000。 原理图: 程序分析: int main(void) { unsigned char a=0; TIM_OCInitTypeDef TIM3_OCInitStructure; RCC_Configuration(); time_ini(); SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms一次 while(1){ Delay(1);//延时1ms TIM3
[单片机]
<font color='red'>STM32</font>之TIM3_PWM程序
stm32后生成编译文件大小探索之二
之前总结过编译文件大小的一些研究: https://blog.csdn.net/ZenNaiHeQiao/article/details/83343504 总结起来是这样的: (1) 单片机:生产的编译信息中,包含了 code : 代码信息 RO-data: 只读信息–》程序中的指令 和常量 RW-data: 被初始化的变量 ZI-data: 无需初始化的变量 我做了这么一个实验, ①增加一个很大的数组,不初始化或者初始化为0; 它会被分配到ZI-data信息中。 ②增加一个很大的数组,切对其进行初始化, 它会被分配到RW-data信息中 烧录文件的大小=code + RO-data + RW-data 增加ZI-da
[单片机]
<font color='red'>stm32</font>后生成编译文件大小探索之二
基于STM32的智能加油系统设计方案
毕设介绍 针对当前汽车加油需求的日益增多,基于STM32开发技术和传感器技术开发一款智能加油系统。 题目要求 智能加油系统应具备油量控制、根据油费计价、加油环境检测的功能。该系统能模拟汽车加油的全过程,并具备远程控制功能。 题目分析 本次毕业设计是智能加油系统的设计与实现,设计所包含的模块主要有oled显示电路、电磁阀驱动电路、可燃气体传感器模块、ds18b20数字温度传感器、蜂鸣器报警模块、WIFI模块、按键电路模块及电源模块。 通过模块之间的配合实现智能加油系统,一旦有温度异常或可燃气体浓度超标将会通过wifi模块对管理人员发出警告。 stm32f103c8t6实时采集ds18b20温度传感器获取温度,如果温度
[单片机]
基于<font color='red'>STM32</font>的智能加油系统设计方案
stm32若干技巧
技巧1:关于串口接收 对于串口数据帧到检测,对于串口接收有判定帧头、尾 FIFO缓存等方式,推荐采用超时判断来确定一帧数据接收完成,尤其对于处理GPS,3G模块数据效,比判断帧头、尾效果好的多。参考网友模式 //检测超时函数 供定时器中断调用-1ms一次 // t为超时时间 __inline void Chk_TimeOut(u8 t) { if(!uartRMsg.rcOK && (uartRMsg.rcIndex =8) && (++uartRMsg.rcS =t) ) //超时之后,开始重新解码 uartRMsg.rcOK = true; } //接收函数, 供USART中断调用 __inline void Recie
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved