使用LL库开发STM32:概述与使用
文章目录
- 目的
- LL库概述
- 文件说明
- API
- 外设初始化
- 外设操作与查询
- LL库使用
- 独立使用
- 与HAL库混合使用
- 例程参考
- 总结
目的
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.h | Cortex-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_Init | ErrorStatus |
PPP_TypeDef* PPPx LL_PPP_InitTypeDef* PPP_InitStruct |
初始化外设 |
LL_PPP_StructInit | void | LL_PPP_InitTypeDef* PPP_InitStruct |
将外设参数对象 置为预设值 |
LL_PPP_DeInit | ErrorStatus | PPP_TypeDef* PPPx | 重置外设到初始状态 |
上面的 ErrorStatus
取值为 SUCCESS (0U)
和 ERROR
; PPPx
为具体的某个外设,如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库必须按照它的设计规则来使用。
使用LL库开发STM32:概述与使用相关推荐
- 清泉HAL库开发STM32之基础概念
文章目录 前言 一.STM32标准库和HAL库分别是什么? 二.HAL库开发 cubemx新建工程 1.选择 CPU 型号 2.确认时钟源 3. 配置 IO 口 4. 配置系统时钟 5. 进一步配置 ...
- 怎么使用ST的库开发STM32
摘自:http://blog.chinaunix.net/uid-2595338-id-2139587.html 觉得这篇文章还是不错的,至少讲清了很多初学者不理解的概念,值得推荐! 我使用的芯片是 ...
- 清泉HAL库开发STM32之USART
文章目录 前言 一.USART硬件特征 1.物理层 2.协议层 二.STM32 的 USART 简介 USART 和UART 三.编程实战 串口阻塞式发数据 串口非阻塞式发数据 实践现象 总结 前言 ...
- 清泉HAL库开发STM32之EXIT
文章目录 前言 二.外部中断编程实战 HAL库编程步骤 初步调试程序 总结 前言 . STM32F1 外部中断简介 我们首先讲解 STM32F1 IO 口中断的一些基础概念.STM32F1 的每个 I ...
- 使用HAL库开发STM32:ADC基础使用
文章目录 目的 基础说明 基础使用 配置选项说明 轮询 单通道 单次 轮询 单通道 连续 轮询 多通道 扫描 中断 单通道 中断 多通道 扫描 DMA 单通道 单轮 DMA 单通道 连续 DMA 多通 ...
- 清泉HAL库开发STM32之GPIO
文章目录 前言 一.GPIO 8 种工作模式 二.八种使用方法简单归纳 三.CUBEMX配置过程 1.选择引脚类型 2. 配置引脚 3.巧用User Label 总结 前言 GPIO(英语:Gener ...
- 清泉HAL库开发STM32之TIM中断
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.STM32常见定时器资源? 1.定时器和计数器的区别 2.定时器所关注的问题 3.定时器模式下的时钟概念 4.定时 ...
- 了解库开发,我们从STM32标准库开发学起
摘要:从STM32新建工程.编译下载程序出发,让新手由浅入深,尽享STM32标准库开发的乐趣. 自从CubeMX等图像配置软件的出现,同学们往往点几下鼠标就解决了单片机的配置问题.对于追求开发速度的业 ...
- 《STM32库开发实战指南:基于STM32F103(第2版)》——2.1节仿真器简介
本节书摘来自华章社区<STM32库开发实战指南:基于STM32F103(第2版)>一书中的第2章,第2.1节仿真器简介,作者刘火良 杨森,更多章节内容可以访问云栖社区"华章社区& ...
最新文章
- GitHub代码一键转VS Code:只需+1s
- 吃西餐的吴大师略懂《赤壁》
- Science封面:三元锂电池安全性差、寿命短问题已解决,来自美国能源部华人团队最新研究...
- 吴恩达机器学习Ex1多元回归部分
- vue源码-对于「计算属性」的理解
- pdflush内核线程池及其中隐含的竞争
- 搭建本地 HTTPS 环境
- Matplotlib 中文字体设置
- Spring Boot加载指定属性文件
- 强化学习(二)--动态规划寻找最优策略
- [JNI] 开发之旅 (1)开发流程介绍
- 改手机为自动开机的车载导航仪
- 蛋白质配体复合物-分子动力学模拟Gromacs
- 使用Python模拟鼠标操作
- 如何修改web浏览器title文字及icon
- ESP32 系统篇: 优化系统启动时间
- 第3章 使用masm
- 一个不会说话的汤姆猫游戏源码
- TypeWriter: Neural Type Prediction with Search-based Validation基于搜索的神经网络预测器
- 2023二建建筑施工备考第二天Day06水泥
热门文章
- e3v3服务器性能如何,E3-1230 V3的基本参数是多少? 对比i3 8100哪个性能好?
- 云帆起航-助力“上云”筑梦服务
- 马上毕业了,拼多多和国家电网,选哪个?
- 流程图讲解_流程图+地图题小作文练习,详细讲解+精选范文!!
- 从新生宿舍到浙江大学计算机学院,2020年浙江大学新生宿舍环境条件,大一新生男生女生宿舍内部图片【多图】...
- 另一棵树的子树(你一定要会的基础面试题)
- UE4人物移动时的摄像机抖动
- 我是用的是NetBeans8.0急需一个jsp上传图片到网站并保存路径到数据库的实例。求大神解答,给点赞!
- 2.从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入n单元,将累加和送入sum单元。
- 我的世界服务器国际版显示坐标,我的世界国际版怎么一直显示坐标 | 手游网游页游攻略大全...