STM32F0_HAL库驱动描述——LL驱动程序概述
LL驱动概述
低层(LL)驱动器旨在提供快速轻量级的专家导向层,它比硬件更接近硬件;
与HAL相反,LLAPI不适用于优化访问不是关键功能的外设设备,或者需要大量软件配置和/或复杂的高级堆栈(如USB)的外设;
LL驱动函数库既可以在不使用HAL驱动库下使用(独立模式),也可以和HAL驱动库一起使用(混合模式);
LL是底层驱动库,这些库完全反应硬件功能,并且LL不实现任何处理,不需要任何额外的存储器资源来保存它们的状态、计数器或数据指针,而是通过改变任何相关的外设寄存器内容来执行所有的操作;
LL库文件结构:
用于核心总线控制和外设时钟激活/停用的源文件:
- stm32f0xx_ll_bus.h
库核心配置文件(初始化函数包含在c文件中,所有其他的API包含在h文件中):
- stm32f0xx_ll_ppp.h/.c
CortexM相关寄存器操作API(包括Systick、低功耗模式):
- stm32xx_ll_cortex.h
通用API(获取设备唯一ID/电子签名、时基和延时管理系统、系统时钟配置):
- stm32xx_ll_xx_ll_utils.h/.c
系统相关操作(SYSCFG、DBGMCU、FLASH):
- stm32xx_ll_xx_ll_system.h
定义assert_param宏的模板文件,在启用运行时检查时使用:
- stm32_assert_template.h
仅当LL驱动程序以独立模式使用(不调用HALAPI)时,才需要此文件;
应将其复制到应用程序文件夹并重命名为stm32_assert.h;
可以从LL驱动文件夹中看到其搭建库文件需要包含的内容;

由于LL库是直接驱动底层寄存器来操作,因此和CMSIS驱动紧密联系,在使用LL库时需要将相应器件的CMSIS驱动文件包含进去:
#include "stm32yyxx.h"
其和CMSIS文件的关系如下图所示:

LL API和命名规则:
外设初始化功能:
LL驱动程序提供三组初始化函数,它们在stm32f0xx_ll_ppp.c文件中定义:
- LL_PPP_Init用于根据数据结构中指定的参数初始化外设主要功能;
- LL_PPP_StructInit使用复位值来重设数据结构;
- LL_PPP_DeInit解除外设初始化功能(外设寄存器恢复为默认值);
这些LL初始化函数和相关资源的定义由编译器宏来决定:USE_FULL_LL_DRIVER或者在调用LL驱动库前在头文件添加此开关;

除此之外还有可选的额外附加功能:
- LL_PPP{_CATEGORY}_Init外设初始化功能;
- LL_PPP{_CATEGORY}_StructInit重设外设功能;
- LL_PPP_CommonInit初始化同一外设的不同实例之间共享的公共功能;
- LL_PPP_CommonStructInit重设同一外设的不同实例之间共享的公共功能;
- LL_PPP_ClockInit初始化(同步)外设时钟模式;
- LL_PPP_ClockStructInit重设外设时钟寄存器值;


运行时间检测:
和HAL驱动库一样,LL初始化函数通过检查LL库函数中的输入值来实现运行时故障检测;在独立模式下使用LL库,在运行时检查需要执行以下操作:
- 将stm32_assert_template.h复制到应用程序文件夹并将其重命名为stm32_assert.h;此文件定义启用运行时检查时使用的assert_param宏;
- 在应用程序主头文件中包含stm32_assert.h文件;
- 在工具链编译器预处理器中或在stm32_assert.h驱动程序之前处理的任何通用头文件中添加USE_FULL_ASSERT编译开关;
该检查不适用LL库的内联函数(inline function);
外设寄存器配置:
除了外设初始化函数之外,LL库还提供了一组直接用于原子寄存器(保证寄存器的读写在某个时间点发生,在该点之前执行将获取寄存器的旧值,在该点之后执行将获取寄存器的新值,后面的读取不能返回旧值)的内联函数(为了解决函数调用时参数传递造成的时间开销和形参占用的内存空间,采用预编译宏来定义简单的函数,但是宏定义的本质是字符串替换因此在定义函数很容易造成调用结果的错误,而内联函数就是为了解决和替换宏而产生的,其本质是一个具有时间和内存优化的简单函数,不能在内联函数中包含循环、条件、选择等复杂的结构);
__STATIC_INLINE return_type LL_PPP_Function (PPPx_TypeDef *PPPx, args)
根据操作内容定义功能名称:
- 特定中断、DMA请求和状态标志管理:
在中断和状态寄存器中有以下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传输方向或数据寄存器类型的变量;
HAL与LL的混合模式:
对于相同的外设实例,它们不能一起使用,如果对特定的实例使用LL API,则仍然可以将HALAPI应用于其他实例,低层LL库可能会覆盖某些在HAL句柄的内容;
独立模式下使用LL驱动库:
可以在不调用HAL库的情况下使用LL库,只需要将应用程序中包含stm32f0xx_ll_ppp.h既可以完成独立使用LL库的操作;通过参考手册推荐的编程模型调用推荐的相同循序调用给定的LLAPI;LL库应使用和HAL库相同的处理方式,始终使用系统文件、启动文件和CMSIS;
当包含BSP驱动文件的时候,与BSP功能驱动程序相关联的HAL库应包含在目录下,即便它们未被应用程序使用;
混合模式下使用LL和HAL库:
低层API和HAL库混合使用,可以实现基于寄存器的直接操作;
- 应避免同时使用LL和HAL初始化同一个外设,如果是这种情况需要更新HAL PPP句柄结构PPP_HandleTypeDef下的一个或多个私有字段;
- 对于不改变句柄字段(包括初始化结构)的操作和进程,HAL驱动程序API和LL服务可以一起用于同一个外设实例;
- LL驱动库可以使用不基于任何句柄对象(RCC、common HAL、flash、GPIO)的HAL驱动API;
- 当没有使用HAL Init/DeInit并且被LL的宏取代时,InitMsp()将不被调用,这个需要在用户程序中自己实现;
- 如果未使用进程API而是通过LL API来执行相应的功能,则不会调用回调函数,并且应由用户自己来执行处理和错误管理;
- 当LL API用于进程操作时,无法调用HAL API的IRQ处理程序,而是要由用户自己来实现IRQ程序,每个LL程序中都要实现读取和清除相关中断标志所需的宏;
STM32F0_HAL库驱动描述——LL驱动程序概述的更多相关文章
- STM32F0_HAL库驱动描述——HAL驱动程序概述
HAL库文件结构: HAL驱动文件: 外设驱动API文件和头文件:包含了常见主要的通用API,其中ppp表示外设名称,如adc.usart.gpio.irda等: stm32f0xx_hal_ppp. ...
- STM32F0_HAL库驱动描述——基于F1的USART串口IT中断实现解析
从原子F103 HAL库基础串口例程来看HAL程序结构: 从main函数开始,首先是HAL库两个函数的初始化: HAL_Init(): Stm32_Clock_Init(RCC_PLL_MUL9); ...
- 【转】android 电容屏(三):驱动调试之驱动程序分析篇
关键词:android 电容屏 tp 工作队列 中断 坐点计算 电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310( ...
- 摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程
摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程 根据虚拟驱动vivi的使用过程彻底分析摄像头驱动// 1~2都是在v4l2_open里调用1. open2. ioctl(4, ...
- thinkphp 标签库驱动
任何一个模板引擎的功能都不可能是为你量身定制的,具有一个良好的可扩展机制也是模板引擎的另外一个考量,Smarty采用的是插件方法来实现扩展,Think\Template由于采用了标签库技术,比Smar ...
- usb设备驱动描述,王明学learn
usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...
- 驱动07.USB驱动程序
1 了解USB识别的过程 eg:在Windows系统下的一个现象:把手机的USB设备接到PC 1. 右下角弹出"发现android phone" 2. 跳出一个对话框,提示你安装驱 ...
- android 电容屏(三):驱动调试之驱动程序分析篇
平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...
- 【驱动】linux驱动程序开发及环境搭建
1.mystery引入 1)设备驱动程序对外提供如下的功能: 1)设备初始化:对硬件设备进行初始化操作 2)数据交换:数据交换包括由内核层向硬件层传送数据.从硬件层读取数据 ...
随机推荐
- Win8Metro(C#)数字图像处理--2.15图像霓虹效果
原文:Win8Metro(C#)数字图像处理--2.15图像霓虹效果 [函数名称] 图像霓虹效果函数NeonProcess(WriteableBitmap src) 上述公式进行开方即可. [函 ...
- SpringMvc 资料
web.xml解释 http://www.cnblogs.com/superjt/p/3309255.html url-pattern解释 http://www.cnblogs.com/zhangpe ...
- 【Windows10 IoT开发系列】Powershell命令行实用程序
原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Admin ...
- asp.net 验证正则表达式 精心整理
asp.net 验证正则表达式 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$& ...
- QT 线程池 + TCP 小试(三)实现最终功能
*免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 有了TCP.线程池,我们就可以把他们连接起来.使用最简单的 QMa ...
- git如何merge github forked repository里的代码更新
git如何merge github forked repository里的代码更新? 问题是这样的,github里有个项目ruby-gmail,我需要从fork自同一个项目的另一个repository ...
- Vbox中Linux虚拟机网络配置(比较实用)
好久没写过东西了,主要大部分都是来自对生活的感悟,很少有实实在在的关于学得有成就感的技术可以“炫耀”,所以也就懒得在这个上面登了. 实验室很早就有位师兄曾在吃饭的路上问过我们这群小弟,你们知道Vbox ...
- Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...
- 第一个SpringBoot测试实例
1.SpringBoot项目构建:http://start-spring.io 自动化构建SpringBoot项目,保存在本地并解压 2.安装gradle并配置gradle环境 3.配置阿里云ma ...
- CS代码代写, 程序代写, java代写, python代写, c/c++代写,csdaixie,daixie,作业代写,代写
互联网一线工程师程序代写 微信联系 当天完成特色: 互联网一线工程师 24-48小时完成.用心代写/辅导/帮助客户CS作业. 客户反馈与评价 服务质量:保证honor code,代码原创.参考课程sl ...