使用LL库开发STM32:概述与使用

目的

ST官方推出的用于开发STM32系列单片机的方式除了HAL库以外还有LL库(Low Layer drivers)可以使用。

HAL库对于不同芯片的兼容性好、对新手入门也很友好,但它对内存的占用比较大、执行效率也不高。HAL库对外设都设计了一套使用规则,理想环境中你按照它的规则用挺方便,但是如果要实现一些特殊的用法(比如串口使用DMA循环接收),或是应用的环境比较恶劣的话HAL库就不是那么好用了,这个时候LL库就比较好用了。

LL差不多就是直接对寄存器的操作,你可以完全凭自己的想法来设计程序逻辑,在某些情况下会非常好用。下面文章中以STM32F4为基础进行介绍,其它系列的LL库在设计思路上也是差不多的。

LL库概述

STM32F4的HAL库综述在文档《UM1725 - User Manual: Description of STM32F4 HAL and LL drivers》的第三篇章《Overview of Low Layer drivers》(文档版本DocID025834 Rev 5 ),官方文档本身写得非常详细,这里做下简单梳理。

文件说明

在这里插入图片描述
上面是个使用LL库的最基础的项目,可以看到LL库的文件都是以 stm32xxxx_ll_ppp.h/.c 方式命名的,其中有部分是公共文件,剩下的都是各个外设的文件。主要文件描述如下:

文件描述
stm32xxxx_ll_ppp.h/.c外设驱动,ppp指代某外设,比如gpio、uart等
stm32xxxx_ll_bus.h总线和时钟管理
stm32xxxx_ll_cortex.hCortex-M内核相关操作,包含Systick和功耗设置等
stm32xxxx_ll_utils.h/.c包含一些基本API,比如读取芯片ID、时间与延时管理、系统时间配置
stm32xxxx_ll_system.h系统相关操作

LL库文件引用包含关系如下:
在这里插入图片描述
用户使用的时候只要引用用到的头文件然后定义一个名为 USE_FULL_LL_DRIVER 的全局宏定义就可以了;如果是STM32CubeIDE或是STM32CubeMX生成的工程的话所有用到的库文件都会在 main.h 中包含,宏定义也为自动定义在编译参数中,用户只要使用 #include "main.h" 就行了。

API

外设初始化

LL库传统意义上的函数大多都是些外设初始化相关的函数,差不多都是下面三种:

函数返回值输入参数描述
LL_PPP_InitErrorStatusPPP_TypeDef* PPPx
LL_PPP_InitTypeDef* PPP_InitStruct
初始化外设
LL_PPP_StructInitvoidLL_PPP_InitTypeDef* PPP_InitStruct将外设参数对象
置为预设值
LL_PPP_DeInitErrorStatusPPP_TypeDef* PPPx重置外设到初始状态

上面的 ErrorStatus 取值为 SUCCESS (0U)ERRORPPPx 为具体的某个外设,如GPIOA、UART1等; PPP_InitStruct 为外设参数结构体对象。如果使用STM32CubeIDE或STM32CubeMX生成项目的话这几个内容都会自动配置调用的,大部分时候都不需要关心。

外设操作与查询

LL库中对外设进行操作与查询等功能主要是由内联函数和宏定义函数来实现。常见的功能如下:

  • 单项参数 设置 / 查询 ;
  • 中断 使能 / 失能 / 查询 / 清除 ;
  • 外设功能 使能 / 使能 ;

可以看到上面的这些都是成组出现的,如果对外设本身了解的话结合库文件就可以方便的使用了:
在这里插入图片描述
配合上STM32CubeIDE的代码提示功能(alt + /)用起来就更加方便了:
在这里插入图片描述

LL库使用

独立使用

LL库可以独立使用,使用方法在上文已经介绍过了:

用户使用的时候只要引用用到的头文件然后定义一个名为 USE_FULL_LL_DRIVER 的全局宏定义就可以了;如果是STM32CubeIDE或是STM32CubeMX生成的工程的话所有用到的库文件都会在 main.h 中包含,宏定义也为自动定义在编译参数中,用户只要使用 #include "main.h" 就行了。

与HAL库混合使用

LL库可以和HAL库混合使用,但使用时有一定限制。

HAL库对于各个外设都设计了一套使用规则,有些外设HAL库在操作过程中还保存了一些运行状态数据。只使用HAL库时,HAL库会在每步操作中动态的更新这些状态数据,HAL库可以正常按照设计逻辑运行。如果在使用HAL库的同时使用了LL库,当使用LL库时HAL库需要的这些运行状态数据不会被更新,有可能导致HAL库无法按照其设计逻辑正常运行,从而导致程序出错。

所以通常来说对于同一组外设不推荐混合使用HAL库和LL库。比如UART可以指定全部使用HAL库或LL库,也可以指定UART1使用HAL库、UART2使用LL库。后一种方式相对来说不推荐(是否可以使用需要根据HAL库代码实现来判断)。

对于HAL库并不保持运行状态数据的外设可以放心混合使用HAL库和LL库,比如GPIO和flash这些。

例程参考

很多时候光看文档或是库文件直接用上LL库还是有点困难的,这时候可以参考官方例程,结合起来用就比较方便了。电脑上安装了STM32Cube数据包的话就可以直接搜索到相关的例程。独立使用LL库的例程可以搜索关键词 Examples_LL ,混合使用可以使用关键词 Examples_MIX
在这里插入图片描述

总结

对于初学者来说HAL库是比较容易上手使用的,大部分时候使用HAL库也没啥问题。但对于老手来说我觉得LL库是非常值得试试的,如果对于MCU常见外设功能、原理、寄存器这些都比较熟悉的话LL库上手也是非常快的。另一方面我个人觉得使用LL库编程时更加自由些,可以完全按照自己的思路来设计程序,不像使用HAL库必须按照它的设计规则来使用。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值