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

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

[复制链接]
zero99 提问时间:2017-7-3 10:32 /
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库也是偶然间发现的,还没有使用过,后面先试试在完善!


查看来源

收藏 5 评论33 发布时间:2017-7-3 10:32

举报

33个回答
HinsShum 回答时间: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库吗?
sunlite 回答时间:2017-9-6 23:40:07
皇冠小熊猫 发表于 2017-7-26 15:27
因为HAL效率的问题,研究起了LL库,然后发现LL库中关于GPIO初始化的函数 LL_GPIO_Init 和时钟配置的函数RCC ...

同样被 坑了一下,RCC_PLL_GetFreqDomain_SYS() , 总之算出来的频率有问题,要不是跟踪进去还真不会想到是LL 库的问题。。。
王浩然 回答时间:2017-7-3 10:43:40
谢谢分享,占个沙发先
黑夜之狼 回答时间:2017-7-3 11:00:17
管它啥库,适合用就好
moyanming2013 回答时间:2017-7-3 11:20:58
总结的不错
Paderboy 回答时间:2017-7-3 11:45:49
ST大法好。。
黑皮男 回答时间:2017-7-3 12:36:25
通杀
alisa123 回答时间:2017-7-3 12:59:49
总结的很好,谢谢楼主分享!
zero99 回答时间:2017-7-3 13:39:19

谢谢捧场
还是看不穿 回答时间:2017-7-3 16:56:52
厉害!!谢谢分享
jcx0324 回答时间:2017-7-4 08:56:49
HAL用的很不舒服,效率实在是低,目前都是与寄存器操作结合使用
Bowen 回答时间:2017-7-4 11:16:35
HAL强大,但是效率太慢
埃斯提爱慕 回答时间:2017-7-4 18:53:31
提示: 作者被禁止或删除 内容自动屏蔽
slotg 回答时间:2017-7-14 10:51:36
都很好, 不过我的首选还是 HAL 库
左岸右岸 回答时间:2017-7-14 16:18:20
用stm32cubemx来配置时钟和初始化很快很方便
好心情123 回答时间:2017-7-14 16:23:52
LL库还是很不错的,现在用F0都用这个库
123下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版