STM32 HAL库和LL库的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 HAL库和LL库的区别相关的知识,希望对你有一定的参考价值。

    上次开发一个项目,使用一个小容量的STM32 ARM CORTEX核心的单片机,使用STM32CUBEMX自动生成配置代码,正准备编写程序的时候,发现容量竟然有6K多。这个容量在使用大容量FLASH的单片机时不感到什么,可是使用小容量单片机的时候,就明显不够用了。

    没有办法,只好打算回去使用原来的StdLib库,前两年不就这么干的嘛,也没什么难的。可是回头找对应库的时候,发现悲剧了,没有这个序列的标准库。

    这也难不倒我们老司机!我就从HAL库里面把必须的寄存器语句摘出来,把冗余的有效检验和冲突处理去掉,不就精简下来了么,就这么干!

    打开“Drivers\STM32F0xx_HAL_Driver\Src”的目录,突然发现除了一般常用的“stm32f0xx_hal_”开头的文件,还有“stm32f0xx_ll_”开头的文件,这是什么鬼?!而且这两种文件都是一一对应的,每个模块,GPIO, RCC, CRC, DMA,... ,都有对应的文件。打开看看,跟hal的一对比,发现精简很多。

    我一下子精神了,意识到这是一个精简的库。于是上网查资料,终于查到了,这是STM32Cube LL库,看起来比较新,似乎是ST最近推出来的。

技术分享图片

    看上表也发现它的优化性(内存和MIPS)好很多,只是产品线覆盖还没有全,但我需要的系列是有的。

技术分享图片

    于是,果断用它,并做了一下小小的对比。

    我使用一款16k的单片机,配置的时候把UART, ADC, GPIO功能打开,分别用HAL库和LL库生成后,使用KEIL 5进行编译,做了对比。

    以下是芯片配置:

技术分享图片

    以下是编译后的代码对比:

HAL库Program Size: Code=5376 RO-data=232 RW-data=8 ZI-data=1232  
LL库Program Size: Code=1804 RO-data=232 RW-data=4 ZI-data=1028  

    是不是相当震撼,编译后LL库只有HAL库的33%体积。

    太完美了,于是我使用LL库完成了剩余的编程工作。LL库基本是基于寄存器的操作,有的模块需要再自己再配置一下。比如Systick在使用STM32CUBEMX之后并不运行,需要Enable一下,并把IRQ打开。

     LL库的选择,在STM32CUBEMX中,点击菜单的“Project”-->“Settings”,在下面的界面中选择“Advanced Settings”,然后在每个模块后面选择使用的库。

技术分享图片


STM32 HAL库和LL库的更多说明,见:http://www.st.com/content/ccc/resource/sales_and_marketing/presentation/product_presentation/37/55/ff/bc/a8/71/4f/c5/stm32_embedded_software_offering.pdf/files/stm32_embedded_software_offering.pdf/jcr:content/translations/en.stm32_embedded_software_offering.pdf


以上是关于STM32 HAL库和LL库的区别的主要内容,如果未能解决你的问题,请参考以下文章

STM32标准外设库 HAL库LL库

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

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

STM32Cube STM32L053闹钟唤醒LL库和HAL库

STM32固件库和Keil里面的Lib库是啥关系

STM32Cube库和standard peripheral library有啥区别