STM32LL库系列教程(一)—— LL库概览及资料

 **开发平台**  :  
 正点原子  探索者STM32F407ZET6
 cube mx:V 5.1.0
 keil uVision5

项目地址:
github : https://github.com/liliang1918/STM32LL
码云 :https://gitee.com/liang1918/stm32_ll_library

注意:
本教程默认读者已经对stm32和cubemx软件有一定了解;
为节省篇幅,详细配置cubemx的步骤仅在此篇中说明,以后仅会简略介绍配置相关内容。
STM32LL库系列教程(一)———— LL库概览及资料
总体介绍LL库的优势及资料获取

系列教程目录

STM32LL库系列教程(一)—— LL库概览及资料
STM32LL库系列教程(二)——点亮LED灯
STM32LL库系列教程(三)——串口中断
STM32LL库系列教程(四)——外部中断
STM32LL库系列教程(五)——定时器中断
(这个系列暑假期间正在完善,所以有的链接打不开是因为文章还是草稿状态,见谅!)

1. LL库应用场景

用过STM32的朋友,对于标准库 STD库Standard Peripheral Libraries)和HAL库Hardware Abstraction Layer)应该都不会陌生。事实上,ST在推行HAL库的时候,逐渐停止了对于标准库的更新(新出的芯片以及不再提供标准库了),但他们也意识到了HAL库效率较低的问题,因此同时也推出了LLLow-layer

所以,当我们针对一些低性能(M0)或者低功耗(L系列)的芯片编程时。相较于HAL库的低效率,寄存器操作的复杂,标准库的逐渐淘汰。LL库就成为了替代HAL库一个比较好的选择了。

2. LL库官方介绍

为了准确介绍LL库的大致内容,笔者从HAL&LL F1的官方手册(Description of STM32F1 HAL and Low-layer drivers)中截取部分内容并附上翻译

在这里插入图片描述

低层驱动程序概述低层(LL)驱动程序旨在提供快速的轻量级面向专家的层,该层比HAL更接近硬件。与HAL相反,对于优化访问权限不是关键功能的外围设备,或需要大量软件配置和/或复杂上层堆栈(例如FSMC,USB或SDMMC)的外围设备,则不提供LL API。
LL驱动程序功能: ·

  • 一组函数,用于根据数据结构中指定的参数初始化外围主要功能
  • 一组函数,用于用每个字段的重置值填充初始化数据结构
  • 执行外围设备反初始化的功能(外围设备寄存器恢复为默认值)
  • 一组内联函数,用于直接和原子寄存器访问
  • 由于LL驱动程序可以在独立模式下(无HAL驱动程序)或在混合模式下(有HAL驱动程序)使用,因此与HAL完全独立
  • 全面介绍了支持的外围功能。

低层驱动程序根据STM32外设的可用功能提供硬件服务。这些服务恰好反映了硬件功能,并提供了一次操作,必须遵循微控制器产品线参考手册中描述的编程模型进行调用。结果,LL服务不执行任何处理,并且不需要任何其他内存资源来保存其状态,计数器或数据指针:所有操作都是通过更改关联的外设寄存器的内容来执行的。

LL库的手册翻译,我会再出一篇博客。以上为简单介绍
3. LL库资料

LL库的手册基本是放在HAL库手册中的,作为HAL库的一个补充。笔者已经找到了STM32各系列型号对应的HAL&LL库的官方手册。链接如下:

链接:https://pan.baidu.com/s/1PuUF4x780O-ZDjvqK_Z5gg 
提取码:ldqd

在这里插入图片描述

4. LL库的性能优势

在这里插入图片描述

上图转载自
STM32使用HAL库、标准库、LL库和寄存器操作的性能对比_u014519486的博客-CSDN博客_hal库 寄存器
https://blog.csdn.net/u014519486/article/details/102800532

可见,相较于HAL库而言,LL库的效率是有极大提升的。这一点,在使用LL库编译代码时,就可以明显感觉到速度的提升

5. LL库的使用方法

与HAL库相同,LL库同样支持CUBEMX生成代码,非常方便。并且,在cubemx工程中,不同外设是可以混合使用HAL和LL库的,两者完全兼容,所以适配上是不存在问题的。
在这里插入图片描述

### 使用LL实现STM32 ADC与DMA协同工作的方法 为了使ADC能够高效地采集数据并利用DMA传输这些数据,在初始化阶段需完成多个重要配置。通过调用`LL_ADC_Init()`函数可以设置ADC的基本参数,如分辨率为12位以及采样时间为周期数[^1]。 对于选择特定的ADC通道而言,应使用`LL_ADC_CHANNEL_0`至`LL_ADC_CHANNEL_TEMPSENSOR`这样的宏定义来指定目标通道,并借助`LL_ADC_SetChannelSamplingTime()`调整该通道下的具体采样时间长度。 启动ADC之后,为了让其能持续不断地获取样本而不是仅执行单次转换操作,则要启用连续模式——这可以通过`LL_ADC_REG_StartConversionContinuous()`达成目的;与此同时,还需激活DMA请求功能以便于后续的数据搬运过程,即调用`LL_DMA_EnableIT_TC(DMAx, Channel)`开启相应的中断服务程序用于处理每次传输结束事件。 当切准备就绪后,下面是个简单的代码框架展示如何结合LL中的APIs让ADC同DMA起运作: ```c // 配置DMA流/通道以匹配ADC需求 void DMA_Configuration(void){ /* ... */ } int main(void){ // 初始化系统时钟、GPIO等外设... // 设置ADC参数(分辨率、触发源) LL_ADC_InitTypeDef ADC_InitStruct; LL_ADC_StructInit(&ADC_InitStruct); LL_ADC_Init(ADCx, &ADC_InitStruct); // 设定所选通道及其对应的采样时间 LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADCx), LL_ADC_PATH_INTERNAL_TEMPSENSOR); LL_ADC_SetChannelSamplingTime(ADCx, LL_ADC_CHANNEL_TEMPSENSOR, LL_ADC_SAMPLINGTIME_48CYCLES_5); // 开启连续转换模式和DMA请求 LL_ADC_REG_StartConversionContinuous(ADCx); LL_ADC_ClearFlag_EOS(ADCx); LL_ADC_EnableDMA(ADCx); // 调用自定义函数配置DMA DMA_Configuration(); while (1){ // 主循环体内的其他逻辑... } } ``` 旦上述流程被正确实施,每当ADC完成了预定数量的测量动作以后就会自动触发DMA控制器负责把得到的结果搬移到预先设定好的存储区域里去,从而减轻CPU负担的同时提高了效率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值