标准库、HAL库、LL库

news2024/12/24 2:28:50

目录

举例理解

概念理解

标准库(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; // 速度50MHz
    GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIO
    
    // 2. 控制LED
    while (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. 初始化GPIO
    LL_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. 控制LED
    while (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.coloradmin.cn/o/2135669.html

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

相关文章

Flutter iOS混淆打包

1. Xcode配置好环境和版本号 2. Terminal输入混淆打包命令 flutter build ipa --obfuscate --split-debug-info./symbols 生成包路径&#xff1a;项目名/build/ios/archive/Runner. xcarchive 3. 将上述文件复制到Xcode下 ~/Library/Developer/Xcode/Archives 4. 打开Xcode-…

React源码学习(一):如何学习React源码

本系列源码学习&#xff0c;是基于 v16.13.1&#xff0c;v17.x与v16.x区别并不太大&#xff01; 一、如何正确的学习React源码&#xff1f; 找到Github&#xff0c;转到React仓库&#xff0c;fork / clone源码&#xff1a;React 查看Readme&#xff0c;在Documentation中有Cont…

VLAN原理学习笔记

以太网是一种基于CSMA/CD的数据网络通信技术&#xff0c;其特征是共享通信介质。当主机数目较多时会导致安全隐患、广播泛滥、性能显著下降甚至造成网络不可用。 在这种情况下出现了VLAN (Virtual Local Area Network)技术解决以上问题。 1、VLAN快速配置 Vlan:Virtual Local…

【XR】AR HUD

1. AR HUD&#xff08;head up display&#xff09;原理 目标&#xff1a; 产业链上的各大Tier1及PGU企业都在积极开发这一技术&#xff0c;许多厂家已推出LCOS样机&#xff0c;比如说水晶光电、华阳集团、瀚思通、疆程已在北京车展或去年的上海车展上展出了LCOS方案的AR-HUD样…

第一届长城杯信息安全铁人三项赛决赛 取证溯源 (复现)

前言&#xff1a; 2024铁人三项决赛应急响应 您的同事李白在运维一台部署了移动应用服务端的linux服务器时发现了异常&#xff0c;好像被黑客攻 击了。小李通过简单分析&#xff0c;发现可能是由于公司的移动应用和其服务端程序都存在安全问题导致 的。小李将当天可能与攻击相关…

(安装VMtools工具)将一个文件从主系统(windows)传送到VMware虚拟机的Linux系统中

解决问题&#xff1a;将一个文件从主系统&#xff08;windows&#xff09;传输到VMware虚拟机的AlmaLinux系统中 博主在主系统和虚拟机文件传输时发现了共享文件夹这一办法&#xff0c;发现需要安装VMtools工具&#xff0c;且网上有关VMtools的教程大多为图形化界面的操作&…

盘点那些初级软件测试面试题汇总

一、请描述如何划分缺陷与错误严重性和优先级别&#xff1f; 给软件缺陷与错误划分严重性和优先级的通用原则&#xff1a; &#xff08;1&#xff09;表示软件缺陷所造成的危害和恶劣程度。 &#xff08;2&#xff09;优先级表示修复缺陷的重要程度和次序。 严重性&#xf…

基于SpringBoot+Vue的驾校信息管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

OpenAI o1:AI领域的“草莓”革命,华人科学家贡献卓越

最近&#xff0c;科技界的热门明星“草莓”频繁出现在大家的视线中。9月11号&#xff0c;The Information报道称&#xff1a;OpenAI计划在未来两周内推出一款更智能、更昂贵、更谨慎的AI模型&#xff01;网友们对此消息持怀疑态度&#xff0c;认为类似消息屡见不鲜&#xff0c;…

使用肘部法则确定K-Means中的k值

一 肘部法则 在K-means算法中&#xff0c;对于确定K&#xff08;簇的数目&#xff09;&#xff0c;我们经常使用肘部法则。 肘部法则是一种用于确定在k均值聚类算法中使用的质心数&#xff08;k&#xff09;的技术。 在这种方法中&#xff0c;为了确定k值&#xff0c;我们连续…

springboot修改组件扫描包位置

步骤很详细&#xff0c;直接上教程 问题分析 默认情况下组件扫描包范围为启动类所在包及其子包 解决方法 我们只需要在启动类上面加个注解配置扫描范围 效果演示 温馨提示 非必要不建议修改&#xff0c;按规范创建项目结构一般不会出现这个问题

此mac无法连接Apple媒体服务,因为“”出现问题。

出现问题&#xff1a; 这是因为mac登陆过别人的appId下载过软件&#xff0c;但是没有完全退出登陆 解决 打开偏好设置&#xff0c;点击头像&#xff0c;点击媒体与已购项目&#xff0c;能看到弹框内AppleID登陆的应用&#xff0c;打开对应的那个应用&#xff0c;我这里是音…

对抗性EM用于变分深度学习:在低剂量PET和低剂量CT中的半监督图像质量增强应用|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 Adversarial EM for variational deep learning: Application to semi-supervised image quality enhancement in low-dose PET and low-dose CT 对抗性EM用于变分深度学习&#xff1a;在低剂量PET和低剂量CT中的半监督图像质量增强应用 01 文献速递介绍 医学影…

OpenAI 全新 o1 模型上线 Cursor,开发者们欢呼!

最近 OpenAI 推出了新一代 o1模型&#xff0c;现在可以在 Cursor 上使用了。这些 o1模型在处理复杂和精细的推理任务上表现出色&#xff0c;令许多开发者为之兴奋。 特别值得一提的是&#xff0c;o1-mini 模型专门为高级编程设计&#xff0c;成为了开发者们的新宠。 最开始&am…

c++类和对象(3):默认成员函数(下)

1.拷贝构造函数 如果⼀个构造函数的第⼀个参数是自身类类型的引用&#xff0c;且任何额外的参数都有默认值&#xff0c;则此构造函数也叫做拷贝构造函数&#xff0c;也就是说拷贝构造是⼀个特殊的构造函数。 c规定&#xff1a;类类型的传值传参必须用拷贝构造 1.1拷贝构造函数…

SpringBoot:Web开发(基于SpringBoot使用MyBatis-Plus+JSP开发)

目录 前期准备 构建项目&#xff08;IDEA2023.1.2&#xff0c;JDK21&#xff0c;SpringBoot3.3.3&#xff09; 添加启动器 Model准备 这里我们利用MybatisX插件生成我们所需要的实体类、数据访问层以及服务层 注意选择MyBatis-Plus3以及Lombok 然后再在service接口中定义…

Leetcode 每日一题:Course Schedule II

写在前面&#xff1a; 今天我们继续来看一道经典的图论问题&#xff0c;而这个问题可以说是跟我们一众学生的生活息息相关啊&#xff01;我们每年都有很多需要完成的必修指标&#xff0c;每一个必修指标可能会有一个或多个先修要求&#xff0c;而我们需要决定是否能将这些课全…

kAFL部署、使用与原理分析

文章目录 前言1、概述1.1、工作原理1.2、工作流程1.2.1、部署kAFL1.2.2、准备工作1.2.2.1、准备主机代理内核1.2.2.2、准备待Fuzz目标1.2.2.3、配置待Fuzz目标1.2.2.4、配置kAFL组件 1.2.3、Fuzz测试1.2.3.1、获取配置信息1.2.3.2、准备工作目录1.2.3.3、复制种子文件1.2.3.4、…

大顶堆+动态规划+二分

前言&#xff1a;我们这一题需要分类讨论 对于我们左边和右边的我们需要预处理 有点类似反悔堆的做法&#xff0c;得出i之前取出 m 个元素代价最小&#xff0c;并且这个代价一定是递减的&#xff08;可以推导一下&#xff09; 题目地址 #include<bits/stdc.h> using name…

Docker 华为云镜像加速器配置

​​ 操作说明 1. 安装/升级容器引擎客户端 推荐安装1.11.2以上版本的容器引擎客户端 2. 加速器地址 访问华为云容器镜像服务&#xff1a;https://console.huaweicloud.com/swr/ 获取加速器地址 https://xxxxxxxxx.mirror.swr.myhuaweicloud.com3. 配置镜像加速器 针对…