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

查看: 18902|回复: 33

[其他] STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)

  [复制链接]

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2017-7-3 10:32:44 | 显示全部楼层 |阅读模式
STM32 Embedded Software

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

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

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

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



STM32Snippets

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

注意:
1. 目前只在STM32F0和L0系列中有提供
2. 代码在不同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库。如下图:
14.png

  从上图不难看出,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库的详细介绍,可以参考后文 STM32 HAL库详解 及 手动移植



LL库

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

独立使用,该库完全独立实现,可以完全抛开HAL库,只用LL库编程完成。
混合使用,和HAL库结合使用。
  LL库文件的命名方式和HAL库基本相同。LL库也是偶然间发现的,还没有使用过,后面先试试在完善!


查看来源

<
回复

使用道具 举报

1

主题

7

回帖

2

蝴蝶豆

初级会员

最后登录
2018-3-14
发表于 2017-7-26 15:27:17 | 显示全部楼层
因为HAL效率的问题,研究起了LL库,然后发现LL库中关于GPIO初始化的函数 LL_GPIO_Init 和时钟配置的函数RCC_PLL_GetFreqDomain_SYS函数都有问题,LL_GPIO_Init函数没办法初始化GPIO_PIN_8 ~ GPIO_PIN_15(内部算法有问题), RCC_PLL_GetFreqDomain_SYS函数在使用16M的外部晶振时获取的系统时钟频率是错的,会导致时钟配置错误和串口波特率计算错误等问题。。。
有这么多BUG的LL库不知道为什么ST都没有检查出来,难道真的没有人用过LL库吗?
回复 支持 1 反对 0

使用道具 举报

4

主题

25

回帖

0

蝴蝶豆

初级会员

最后登录
2020-8-21
发表于 2017-7-3 10:43:40 | 显示全部楼层
谢谢分享,占个沙发先
回复 支持 反对

使用道具 举报

10

主题

1371

回帖

26

蝴蝶豆

论坛元老

最后登录
2020-12-1
发表于 2017-7-3 11:00:17 | 显示全部楼层
管它啥库,适合用就好
回复 支持 反对

使用道具 举报

47

主题

1636

回帖

7

蝴蝶豆

论坛元老

最后登录
2020-10-28
发表于 2017-7-3 11:20:58 | 显示全部楼层
总结的不错
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2017-7-3 11:45:49 | 显示全部楼层
ST大法好。。
回复 支持 反对

使用道具 举报

64

主题

1074

回帖

140

蝴蝶豆

论坛元老

最后登录
2020-12-3
发表于 2017-7-3 12:36:25 | 显示全部楼层
通杀
回复 支持 反对

使用道具 举报

31

主题

393

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-28
发表于 2017-7-3 12:59:49 | 显示全部楼层
总结的很好,谢谢楼主分享!
回复 支持 反对

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
 楼主| 发表于 2017-7-3 13:39:19 | 显示全部楼层

谢谢捧场
回复 支持 反对

使用道具 举报

3

主题

37

回帖

0

蝴蝶豆

高级会员

最后登录
2018-1-20
发表于 2017-7-3 16:56:52 | 显示全部楼层
厉害!!谢谢分享
回复 支持 反对

使用道具 举报

14

主题

712

回帖

29

蝴蝶豆

金牌会员

最后登录
2020-4-19
发表于 2017-7-4 08:56:49 | 显示全部楼层
HAL用的很不舒服,效率实在是低,目前都是与寄存器操作结合使用
回复 支持 反对

使用道具 举报

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