标准库、HAL库、LL库

目录

举例理解

概念理解

标准库(Standard Peripheral Library,SPL)

2. HAL库(Hardware Abstraction Layer)

3. LL库(Low-Layer Library)

总结区别

如何选择

实际应用中的结合使用

代码理解

1. 标准库(SPL)的使用方式

2. HAL库的使用方式

3. LL库的使用方式

总结


在单片机(微控制器)开发中,标准库、HAL库和LL库是常用的三种软件库,它们用于简化硬件外设的编程和控制。

举例理解

  • 标准库(SPL):就像开自动挡车,你只需掌握基础操作,很多细节是自动处理的,适合入门和简单应用。
  • HAL库:就像开带有智能驾驶辅助功能的车,大部分事情车会帮你搞定,适合那些想省力并快速到达目标的人。
  • LL库:就像开手动挡车,你能完全掌控,但需要更多技术和时间,适合那些想最大化性能并精确控制的人。

概念理解

标准库(Standard Peripheral Library,SPL)

定义:

标准库是由芯片厂商提供的用于操作微控制器外设的中间层库。以STMicroelectronics的STM32系列为例,标准外设库提供了一组函数,用于简化外设(如GPIO、USART、SPI等)的配置和操作。

特点:

  • 抽象层次适中:提供了相对高级别的API,简化了外设配置。
  • 易于使用:对于初学者或快速开发项目较为友好。
  • 兼容性:通常与特定系列的微控制器紧密结合,不具备跨系列的通用性。

缺点:

  • 灵活性有限:由于是中间层抽象,某些复杂或特殊的外设操作可能不够灵活。
  • 性能开销:相比直接寄存器操作,可能存在一定的性能损失。

2. HAL库(Hardware Abstraction Layer)

定义:

HAL库也是由芯片厂商提供,旨在提供更高层次的硬件抽象,使得代码更具可移植性。以STM32的HAL库为例,它封装了更多的硬件细节,提供了一致的接口来操作不同的外设。

特点:

  • 高抽象层次:隐藏了更多的硬件细节,使得开发者无需深入了解底层寄存器。
  • 良好的可移植性:在不同型号或系列的微控制器之间具有较好的代码兼容性。
  • 丰富的功能支持:通常包含更多的外设支持和高级功能。

缺点:

  • 性能开销较大:由于抽象层次更高,可能引入更多的函数调用和资源占用,影响实时性要求高的应用。
  • 灵活性不足:对于需要精细控制硬件的场景,可能无法满足需求。

3. LL库(Low-Layer Library)

定义:

LL库(低层库)提供了对硬件外设的更底层的访问接口,允许开发者直接操作寄存器,但仍保留了一定的封装以简化常见操作。以STM32的LL库为例,它旨在提供接近寄存器级别的控制,同时保持一定的易用性。

特点:

  • 低抽象层次:提供接近寄存器级别的API,允许更精细的硬件控制。
  • 高性能:由于更少的抽象和函数调用,适合对性能和实时性有较高要求的应用。
  • 灵活性强:开发者可以根据需求灵活配置和操作外设。

缺点:

  • 学习曲线较陡:需要开发者具备更深入的硬件知识,理解寄存器操作。
  • 开发效率较低:相比高层库,编写代码可能更繁琐。

总结区别

如何选择

  • 快速开发或初学者:选择标准库HAL库,因为它们提供了更高层次的抽象,简化了外设操作。
  • 对性能和资源有严格要求:选择LL库,以获得更高的执行效率和更精细的控制。
  • 需要跨系列或跨平台的代码:选择HAL库,其良好的可移植性有助于代码在不同微控制器之间复用。

实际应用中的结合使用

        在实际项目中,开发者常常会根据具体需求结合使用不同的库。例如,主要功能模块使用HAL库以提高开发效率,而对性能要求较高的部分则采用LL库进行优化。

代码理解

        为了更好地理解标准库HAL库LL库的区别,阮某通过一个简单的例子来进行解释:控制一个LED灯的亮灭。假设我们要用一个微控制器(比如STM32)来控制GPIO引脚,让LED灯亮灭,看看这三种库是如何处理的。

1. 标准库(SPL)的使用方式

在标准库中,开发者需要配置GPIO(通用输入输出)端口,控制其输出高低电平来实现LED的亮灭。代码相对简洁,但仍需要了解一定的硬件细节。

#include "stm32f10x.h" // 标准外设库头文件int main(void) {// 1. 初始化GPIO
    GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 使用PC13引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 配置为推挽输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHzGPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIO// 2. 控制LEDwhile (1) {GPIO_SetBits(GPIOC, GPIO_Pin_13); // 设置引脚为高电平,LED熄灭for (int i = 0; i < 1000000; i++); // 延时GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 设置引脚为低电平,LED点亮for (int i = 0; i < 1000000; i++); // 延时}
}

特点:

  • 操作相对简单,开发者只需掌握GPIO配置和控制即可。
  • 代码结构清晰,配置和操作步骤相对独立。

2. HAL库的使用方式

HAL库提供了更高层次的抽象,隐藏了更多硬件细节,开发者可以更轻松地控制外设。HAL库的代码可移植性更高,适合跨平台使用。

#include "stm32f1xx_hal.h" // HAL库头文件int main(void) {
    HAL_Init(); // 初始化HAL库    // 1. 初始化GPIO
    __HAL_RCC_GPIOC_CLK_ENABLE(); // 使能GPIOC时钟    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);    // 2. 控制LED
    while (1) {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED熄灭
        HAL_Delay(500); // 延时500ms
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED点亮
        HAL_Delay(500); // 延时500ms
    }
}

特点:

  • 更加简单,几乎不需要直接操作外设寄存器。
  • HAL库自带延时函数和GPIO操作函数,代码简洁且易于理解。
  • 适合快速开发,且具备较好的跨平台可移植性。

3. LL库的使用方式

LL库提供更底层的操作,接近于直接操作寄存器。开发者需要对硬件有更深入的了解,代码复杂度更高,但性能更好。

#include "stm32f1xx_ll_gpio.h" // LL库头文件
#include "stm32f1xx_ll_bus.h"int main(void) {// 1. 初始化GPIOLL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC); // 使能GPIOC时钟    LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = LL_GPIO_PIN_13;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
    GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;LL_GPIO_Init(GPIOC, &GPIO_InitStruct);// 2. 控制LEDwhile (1) {LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_13); // LED熄灭for (int i = 0; i < 1000000; i++); // 延时LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_13); // LED点亮for (int i = 0; i < 1000000; i++); // 延时}
}

特点:

  • 代码贴近寄存器操作,开发者需要更细致地控制硬件细节。
  • 没有高级的封装函数,性能更高,但代码复杂度也随之增加。
  • 适合对性能要求高、实时性强的场景。

总结

  • 标准库(SPL):你需要对硬件有一定的理解,但大部分外设配置和控制已经简化,适合快速上手。
  • HAL库:最适合初学者或追求代码简洁的项目,封装了大部分硬件细节,开发效率最高,但性能上稍有损失。
  • LL库:需要开发者具备更强的硬件知识,虽然代码复杂,但性能和灵活性最优,适合对性能要求高的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535366.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

根据第七次人口普查数据探索中国平均预期寿命

一&#xff1a;数据介绍 数据来源&#xff1a;预期寿命数据集 - Heywhale.com 该数据提供了中国各地区在第七次人口普查&#xff08;2020年&#xff09;中的平均预期寿命&#xff0c;包括男性和女性的预期寿命。该表具有93行和3列。以下是关于这个数据表的具体信息&#xff1…

设计师私藏的 PDF 转 JPG 利器

你平常会通过扫描来发送文件吗&#xff1f;为了保证图片的清晰度一般都会采用PDF格式来转发&#xff0c;但是要插入到一些文件里的时候PDF格式不是那么好用。这时候就很需要PDF转jpg工具了。今天我就分享几款我用过的PDF转jpg的工具&#xff0c;有兴趣就接着往下看吧。 1.福昕…

蓝牙模块助力游戏设备开启沉浸式娱乐新体验

在当今科技飞速发展的时代&#xff0c;游戏设备正经历着一场前所未有的智能化变革。作为连接虚拟世界与现实体验的重要桥梁&#xff0c;蓝牙模块已经成为游戏设备不可或缺的核心组件之一。它的广泛应用&#xff0c;不仅为玩家提供了更加便捷、流畅的游戏体验&#xff0c;更推动…

python制作石头剪刀布

方法一&#xff1a; import random def rock_paper_scissors(): user_score 100 computer_score 100 while user_score > 0 and user_score < 200: user_choice int(input("请输入1&#xff08;剪刀&#xff09;、2&#xff08;石头&#x…

算子级血缘在金融数据环境的实践应用

在企业的数据管理领域&#xff0c;算子级血缘极大优化了脚本内部字段口径的理解与追踪。面对几十、几百乃至几千行代码的复杂脚本&#xff0c;并且有着各种函数调用、数据转换等复杂的加工逻辑&#xff0c;如果通过传统的 ETL 工作模式&#xff0c;开发人员就不得不采用“盲人摸…

PDF——压缩大小的方法

方法一&#xff1a;QQ浏览器->格式转换->PDF转纯图PDF

从“看”到“管”:EasyCVR安防监控平台如何推动城市管理模式的转型升级

在21世纪的今天&#xff0c;随着城市化进程的加速推进&#xff0c;城市规模不断扩大&#xff0c;人口密集度显著增加&#xff0c;城市管理面临着前所未有的挑战。从公共安全、交通管理到环境保护、应急响应&#xff0c;每一个领域都对城市的治理能力和效率提出了更高要求。在这…

【STM32】DMA数据转运(存储器到外设)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 外设DMA请求使能 DMA1 DMA2 常用的外设DMA使能库函数 配置串口发送的DMA请求 驱动代码 MyDMA.h MyDMA.c main.c 前言 【STM32】DMA数据转运&#xff08;存储器到存储器&a…

c++----模板(进阶)

也是好久没有更新了今天来将我们前面写过的模板更加升华一下。更加深一下。我们还记得我们前面讲过的模板&#xff0c;只是简单的运用模板而且还是参数类型模板。当然大家如果敏锐一点的话&#xff0c;应该就能看出这句话的问题看吧。我这里说的是参数类型模板&#xff0c;那么…

模仿抖音用户ID加密ID的算法MB4E,提高自己平台ID安全性

先看抖音的格式 对ID加密的格式 MB4EENgLILJPeQKhJht-rjcc6y0ECMk_RGTceg6JBAA 需求是 同一个ID 比如 413884936367560 每次获取得到的加密ID都是不同的&#xff0c;最终解密的ID都是413884936367560 注意这是一个加密后可解密原文的方式&#xff0c;不是单向加密 那么如下进行…

Java在零工市场中的应用:构建灵活高效的劳动力平台

随着数字经济的迅猛发展&#xff0c;零工经济作为一种新兴的劳动力市场模式&#xff0c;正在全球范围内迅速崛起。零工市场通过互联网平台将服务提供者与需求者进行快速匹配&#xff0c;使得个人可以临时、自由地提供服务&#xff0c;企业则能够按需雇佣劳动力&#xff0c;实现…

清理微信一些文件

C盘的微信文件实在是太难搞了&#xff0c;怎么弄怎么麻烦 一般文件保存在手机端或者自己的文件夹更多&#xff0c;要清理呀 不然卡秃噜皮了怎么办是啊不 路径如图

【JAVA入门】Day45 - 压缩流 / 解压缩流

【JAVA入门】Day45 - 压缩流 / 解压缩流 文章目录 【JAVA入门】Day45 - 压缩流 / 解压缩流一、解压缩流二、压缩流 在文件传输过程中&#xff0c;文件体积比较大&#xff0c;传输较慢&#xff0c;因此我们发明了一种方法&#xff0c;把文件里的数据压缩到一种压缩文件中&#x…

Linux与Ubuntu:内核与发行版的关系

在计算机科学的领域内&#xff0c;Linux和Ubuntu这两个术语频繁出现&#xff0c;但它们之间的确切联系往往不为大众所熟知。本文旨在深入探讨Linux内核与Ubuntu操作系统发行版之间的技术关系&#xff0c;并阐明它们各自的独特性质。 Linux内核&#xff1a;操作系统的基石 Lin…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用

查看原文>>> 双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践技术应用 目录 专题一、DNDC模型介绍 专题二&#xff1a;DNDC初步操作 专题三、遥感和GIS基础 专题四、DNDC气象数据 专题五、DNDC土地数据 专题六…

项目警告Added non-passive event listener to a scroll-blocking ‘touchstart‘ event.

使用touchstart和touchmove时项目报如下警告&#xff1a; 这个警告信息是由浏览器提供的&#xff0c;主要是为了提醒开发者关注性能问题。在移动设备上&#xff0c;touchstart事件可能会导致滚动操作的响应问题。当你在touchstart事件上添加了一个非被动的监听器&#xff08;即…

统计/nginx/access.log中每个ip的访问次数,按高到低排列

/nginx/access.log具体内容长这样&#xff1a; 第一个元素就是ip。 awk {print $1} /nginx/access.log | sort | uniq -c | sort -r首先&#xff0c;awk {print $1} /nginx/access.log 从 /nginx/access.log文件的每行中提取出第一个字段。然后&#xff0c;sort 对提取出的第…

多线程篇(其它容器- CopyOnWriteArrayList)(持续更新迭代)

一、CopyOnWriteArrayList&#xff08;一&#xff09; 1. 简介 并发包中的并发List只有CopyOnWriteArrayList。 CopyOnWriteArrayList是一个线程安全的ArrayList&#xff0c;对其进行的修改操作都是在底层的一个复制的数 组&#xff08;快照&#xff09;上进行的&#xff0…

MySQL迁移达梦报错,DMException: 第1 行附近出现错误: 无效的表或视图名[ACT_GE_PROPERTY]

达梦数据库选好模式和登录用户&#xff0c;迁移时的目标模式名要和达梦的当前登录的用户名相同&#xff0c;否则查询的时候需要“form 模式名.表名”&#xff0c;只from表名就会报表不存在的错误。

Orchestrator 与 Mysql 8.0 的兼容性

一、看图识别问题 二、Mysql 8.0 从 MySQL 8.0.22 开始,使用SHOW REPLICA STATUS代替SHOW SLAVE STATUS,该语句从该版本开始已弃用。 所以&#xff1a;Mysql 8.0.22前可以用Orchestartor