低层(LL)驱动器旨在提供快速轻量级的专家导向层,它比硬件更接近硬件;编程
与HAL相反,LLAPI不适用于优化访问不是关键功能的外设设备,或者须要大量软件配置和/或复杂的高级堆栈(如USB)的外设;数据结构
LL驱动函数库既能够在不使用HAL驱动库下使用(独立模式),也能够和HAL驱动库一块儿使用(混合模式);函数
LL是底层驱动库,这些库彻底反应硬件功能,而且LL不实现任何处理,不须要任何额外的存储器资源来保存它们的状态、计数器或数据指针,而是经过改变任何相关的外设寄存器内容来执行全部的操做;工具
用于核心总线控制和外设时钟激活/停用的源文件:优化
库核心配置文件(初始化函数包含在c文件中,全部其余的API包含在h文件中):spa
CortexM相关寄存器操做API(包括Systick、低功耗模式):3d
通用API(获取设备惟一ID/电子签名、时基和延时管理系统、系统时钟配置):指针
系统相关操做(SYSCFG、DBGMCU、FLASH):code
定义assert_param宏的模板文件,在启用运行时检查时使用:对象
仅当LL驱动程序以独立模式使用(不调用HALAPI)时,才须要此文件;
应将其复制到应用程序文件夹并重命名为stm32_assert.h;
能够从LL驱动文件夹中看到其搭建库文件须要包含的内容;
因为LL库是直接驱动底层寄存器来操做,所以和CMSIS驱动紧密联系,在使用LL库时须要将相应器件的CMSIS驱动文件包含进去:
#include "stm32yyxx.h"
其和CMSIS文件的关系以下图所示:
外设初始化功能:
LL驱动程序提供三组初始化函数,它们在stm32f0xx_ll_ppp.c文件中定义:
这些LL初始化函数和相关资源的定义由编译器宏来决定:USE_FULL_LL_DRIVER或者在调用LL驱动库前在头文件添加此开关;
除此以外还有可选的额外附加功能:
运行时间检测:
和HAL驱动库同样,LL初始化函数经过检查LL库函数中的输入值来实现运行时故障检测;在独立模式下使用LL库,在运行时检查须要执行如下操做:
该检查不适用LL库的内联函数(inline function);
外设寄存器配置:
除了外设初始化函数以外,LL库还提供了一组直接用于原子寄存器(保证寄存器的读写在某个时间点发生,在该点以前执行将获取寄存器的旧值,在该点以后执行将获取寄存器的新值,后面的读取不能返回旧值)的内联函数(为了解决函数调用时参数传递形成的时间开销和形参占用的内存空间,采用预编译宏来定义简单的函数,可是宏定义的本质是字符串替换所以在定义函数很容易形成调用结果的错误,而内联函数就是为了解决和替换宏而产生的,其本质是一个具备时间和内存优化的简单函数,不能在内联函数中包含循环、条件、选择等复杂的结构);
__STATIC_INLINE return_type LL_PPP_Function (PPPx_TypeDef *PPPx, args)
根据操做内容定义功能名称:
在中断和状态寄存器中有如下Flags:Set/Get/Clear/Enable/Disable
BITNAME是指产品系列参考手册中外设寄存器的名称;
在外设时钟中有如下Flags:Enable/Disable/Reset
'x'对应于组索引而且指的是给定总线上的修改寄存器的索引,相似于多个寄存器之间的编号;
'bus'对应于总线名称(例如APB1);
对于外设而言有如下Flags:Enable/disable
存在如下配置Flags:Set/Get
对寄存器进行读写操做的Flags:Write/Read
Propriety是一个用于标识DMA传输方向或数据寄存器类型的变量;
对于相同的外设实例,它们不能一块儿使用,若是对特定的实例使用LL API,则仍然能够将HALAPI应用于其余实例,低层LL库可能会覆盖某些在HAL句柄的内容;
能够在不调用HAL库的状况下使用LL库,只须要将应用程序中包含stm32f0xx_ll_ppp.h既能够完成独立使用LL库的操做;经过参考手册推荐的编程模型调用推荐的相同循序调用给定的LLAPI;LL库应使用和HAL库相同的处理方式,始终使用系统文件、启动文件和CMSIS;
当包含BSP驱动文件的时候,与BSP功能驱动程序相关联的HAL库应包含在目录下,即使它们未被应用程序使用;
低层API和HAL库混合使用,能够实现基于寄存器的直接操做;