熟悉STM32的都知道ST官方提供了非常方便好用的库函数供用户使用,多数人都使用过STM32标准外设库,STM32Cube库(即HAL库),这个LL库是什么鬼,却从来没听说过。 好吧,我承认这个名字是我自己XJB取的。。。。。。。。
一、 初识LL 库最近论坛发的STM32L476RGNucleo开发板到手了,准备学习玩耍,当然第一步就是下载资料,于是我下载STM32L4Cube 1.1.0版本,打开逐个查看,
好像和以前一样的,没什么特别嘛,于是准备开始开发。。。 等等,好像还真发现了有点不一样:
熟悉HAL库的都知道,该库的文件几乎都是以stm32xxx_hal_xxx.h/.c命名的,为了和以前的标准库有个区分,上图中那些是什么鬼????? 前辈说,遇到问题赶紧查手册,于是我果断打开STM32L4Cube库的说明手册(UM1884):
原来这个东西叫做LowLayer APIs,作为英文渣渣表示实在不习惯洋里洋气的高大上名字,于是擅自把他叫做【STM32LL库】了(不服的你咬我啊)。 从这里看好像是说这个东东比HAL库更接近硬件,到底什么鬼,还不清楚。但是以前好像没见过这个东西啊,就算是STM32L4Cube的1.0.0版本中都没有。看看Cube发行历史:
原来LL库是在1.1.0版本才加上的,大概意思就是: 1. LL APIs是寄存器级的编程,嗯,也就是我们常说的直接操作寄存器吧。 2. LL APIs适用于xxx等一大堆外设 3. LL APIs函数全部定义为staticinline函数,放在对应的头文件中,用户使用需要包含相关头文件 4. 参考这两个文档 看看LL库文件在Cube库中的位置,有20多个文件,全部以stm32l4xx_ll_xxx.h命名: STM32Cube_FW_L4_V1.1.0DriversSTM32L4xx_HAL_DriverInc
STM32L4是面向低功耗市场的,同时不失高性能,功耗和性能往往是两个矛盾的东西,ST在硬件设计上想了各种办法来实现兼顾低功耗高性能(例如各种低功耗模式,LP外设等),而在软件层面,程序也讲求效率, LL库全是直接操作寄存器,直接操作寄存器往往效率较高,而且函数定义为内联函数,调用函数时不是堆栈调用,而是直接把函数的代码嵌入到调用的地方,利于提高代码相率,我想这也是ST在STM32L4系列中推出这个直接操作寄存器的LL库的原因之一吧。
二、 怎么使用LL库
英文渣渣就不翻译了,反正大概就是说 LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器等等一大堆,到这里,可以看到它的使用方法: 1. 独立使用,该库完全独立实现,可以完全抛开HAL库,只用LL库编程完成。 2. 混合使用,和HAL库结合使用。 本人就常在编程的时候库函数和寄存器操作混合,所以觉得混合使用应该是不错的方式。 最后一段还说到该库不需要额外的内存资源来存储程序状态,数据指针等东西,所有的操作都通过直接修改外设的寄存器来完成。 下面是手册中对各个LL文件的描述:
就是讲LL库由5部分组成:每个外设对应一个头文件组成一部分,以及系统相关的bus,cortex,utils,system四个部分。
前面提到,要使用LL库,需要包含对应头文件,各头文件之间有如下关系: 看来,我们编程的时候只需要#include某外设的头文件,就可以使用LL库了,但是同时,系统启动文件,初始化文件等一系列不能少,具体讲就是: stm32l4xx.h stm32l476xx.h system_stm32l4xx.h system_stm32l4xx.c startup_stm32l476xx.s
这几个文件,这在标准库,Cube库都不曾变过的铁律。
顺便分享一下STM32L4Cube 库 1.1.0版本和1.1.1版本的Pack 百度网盘下载地址:http://pan.baidu.com/s/1c0wjL5m
一楼二楼是具体使用方法。
已完,上传文档和工程模板: |