什么是HAL库和标准库,区别在哪里?

news/2024/7/24 1:40:21 标签: 单片机, stm32, 嵌入式硬件

参考文章https://blog.csdn.net/u012846795/article/details/122227823
参考文章
https://zhuanlan.zhihu.com/p/581798453

STM32的三种开发方式

通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的里解去将这些东西表述出来,如果有猫述的不对的地方或者是不同意见的也可以大家提出。

1、直接配置寄存器

不少先学了51的朋友可能会知道,会有一小部分人或是教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了STM32就变得不太容易行得通了,因为STM32的寄存器数量是51单片机的十数倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。但还是会有很小一部分人,喜欢去直接操作寄存器,因为这样更接近原理,知其然也知其所以然。

2、标准库

上面也提到了,ST32有非常多的寄存器,而导致了开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32F1x…之类的。在这些.c.h文件中,包括一些常用量的宏定义,把一些外设也通过结构体变量封装起来,如GPO口时钟等。所以我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。也是目前最多人使用的方式,也是学习STM32接触最多的一种开发方式,
我也就不多阐述了。

3、HAL库

HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。库如其
名,很抽象,一眼看上去不太容易知道他的作用是什么。
它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库尤其的有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。
并且HAL库也很好的解决了程序移植的问题,不同型号的s32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。是而且使用ST公司研发的STMcub软件可以通过图形化的配置功能,直接生成整个使用H八L库的工程文件,可以说是方便至极,但是方便的同时也造成了它执行效率的低下,在各种论坛帖子真的是被吐槽的数不胜数。

4、区别

说的云里雾里, 就用大白话再给大家说说
首先我要说的就是:库本质上就是封装起来的大量函数
C语言的函数我们都是知道的,大概就是长这个样子:

在这里插入图片描述
一般情况下(函数没有构建在主函数之前)这个函数是需要声明的,声明语句是这样的:
在这里插入图片描述
上面的函数是一个操作数码管的函数,如果我把很多个操作数码管实现不同功能的函数编写在同一个.c文件中,暂且命名为smg.c把他们的声明语句放在.h文件中,暂且命名为smg.h,让smg.c和smg.h配合使用,那smg.c和smg.h就包含了大量的操作数码管的函数。

依此类推,我可以创建控制LED的函数文件led.c和他的头文件led.h、控制其他器件的.c和.h等等很多.c和.h文件。

然后我把他们打包在两个文件夹中,一个叫src(存放.c文件),一个叫inc(存放.h文件),那这个就相当于我自己创建了一个属于自己的库了。创建了库的话我要用数码管就把smg.c和smg.h拿出来就能调用里面的函数,很是方便

创建库的好处显而易见:不用再手动去拉一个一个引脚的电平,引脚电平应该怎么变已经在函数里写好了,调用就行。方便移植等等。

然后我们把LED、数码管等器件换成STM32内部的寄存器,就能理解什么是库函数开发了:就是用别人写好的这些函数来操作寄存器。

标准库和HAL库还有LL库的相同点是:都是库(都是编写好的很多操作寄存器的函数函数放在一个文件中)。

不同点是:函数的名称、操作的逻辑、不同函数之间的调用、函数对寄存器的调用。。。。。。

你可以这样理解他们的不同点:我要复原一个魔方,可以用A方法,也可以用B方法,最后我都能复原魔方。

那既然初期开发出了标准库,为什么后期还要开发HAL库和LL库呢?

初期开发标准库,只是单纯的为了方便工程师调函数操作寄存器来开发。后来ST为了更方便开发者控制寄存器,开发了一个软件,叫CubeMX,但是标准库的设计不满足被这个软件调用,为了让这个软件能配置工程代码,ST就开发了HAL库。

以上就是对库的一些浅薄的理解。实际的库远比描述的要复杂,文件中还需要加入大量的宏定义和声明,需要考虑超级多的东西,然后在语句的编写方面也很讲究,但是本质上库就是打包起来的函数。


http://www.niftyadmin.cn/n/27092.html

相关文章

linux-用户和用户组

文章目录用户用户组用户和组的关系用户 Linux中每个用户是通过User Id(UID)来标识的 管理员:root 0 普通用户:1-60000自动分配 系统用户:1-499(CentOS6以前),1-999(Cent…

450. 删除二叉搜索树中的节点

450. 删除二叉搜索树中的节点 难度中等1037 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说&#xf…

1.10 笔记

五表五链 security 安全表 selinux raw 跟踪表 mangle 校正表 TTL MARK TOS nat 转换表 SNAT DNAT filter 过滤表 INPUT 处理进入的数据包 OUTPUT 处理外出的数据包 FORWARD 被转发的包 PREROUTING 路由前 POSTROUTING 路由后 本机: PREROUTING INPUT 转…

CMMI之需求管理

需求管理(Requirement Management, RM)的目的在客户与开发方之间建立对需求的共同理解,维护需求与其他工作成果的一致性,并控制需求的变更。需求管理过程域是SPP模型的重要组成部分。本规范阐述了需求管理过程域的三个主要规程&am…

机器学习公式推导与代码实现-无监督学习模型

聚类分析与k均值聚类算法 督学习算法。在给定样本的情况下,聚类分析通过度量特征相似度或者距离,将样本自动划分为若干类别。 距离度量和相似度度量方式 距离度量和相似度度量是聚类分析的核心概念,大多数聚类算法建立在距离度量之上。常用的距离度量方式包括闵氏距离和马…

【图像处理OpenCV(C++版)】——4.2 对比度增强之线性变换

前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…

Makefile从入门到....

本文参考正点原子的I.MX6U 嵌入式 Linux 驱动开发指南 原子哥在线教学:www.yuanzige.com 论坛:www.openedv.com 文章目录Makefile 的引入Makefile 语法Makefile 规则格式Makefile 变量赋值符“”赋值符“:”赋值符“?”变量追加“”Makefile 模式规则Makefile 自动化变量Makef…

【蓝桥杯】时间显示(省赛)Java

【问题描述】 小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从1970年1月1日O0:00:00到当前时刻经过的毫秒数。 现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日&a…