HAL 库

article/2025/9/14 10:31:53

HAL库

1、初识HAL库

1.1 CMSIS 简介

CMSIS(微控制器软件接口标准):Crotex Microcontroller Software Interface Standard,是由ARM和与其合作的芯片厂商、软件工具厂商,共同制定的标准

  • ARM官方提供的CMSIS规范架构

在这里插入图片描述

1.2 HAL库 简介

ST为了方便用户开发STM32芯片开发提供了三种库:

  • 标准外设库:Standard Peripheral Libraries
    • ST最早的库,现在还在用
    • 目前只兼容 F0/F1/F3/F2/F4/L1 系列
    • 目前已停止维护
  • HAL库(硬件抽象层):Hardware Abstraction Layer
    • ST目前主推的库
    • 全系列兼容
    • 兼容性好、移植方便,但效率不太高
  • LL库:Low Layer
    • 与HAL库困捆绑发布
    • 全系列兼容
    • 轻量级、效率高
    • 不匹配部分复杂外设,比如 USB

2、STM32Cube 固件包浅析

STM32Cube固件包即:ST公司基于自己的产品,根据上文ARM官方的CMSIS规范架构标准,提供的CMSIS-Pack

2.1 STM32Cube固件包文件夹简介

  • _htmresc:图片文件
  • Documentation:STM32Cube说明文档
  • Drivers:驱动源码

在这里插入图片描述

  • Middlewares:中间文件

在这里插入图片描述

  • Projects:ST官方开发板案例
  • Utilities:公共组件
  • 其他文件
    • License.md:软件版权信息
    • package.xml:固件包版本信息
    • Readme.md:自述
    • Release_Notes.html:补充或更新说明

2.2 CMSIS文件夹关键文件

  • CMSIS文件夹下文件目录

在这里插入图片描述

  • 关键文件
    • Device:微控制器专用头文件、启动文件、专用系统文件
    • Include:Cortex-M内核及其设备文件、编译器相关头文件

3、HAL库框架结构

3.1 HAL库文件夹结构

STM32F1系列为例:

在这里插入图片描述

  • Inc:HAL库和LL库驱动源码头文件
  • Src:HAL库和LL库驱动源码
  • .chm后缀文件:用户手册

3.2 HAL库文件介绍

STM32Cube_F1_v1.8.0为例:

文件描述
stm32f1xx_hal.c stm32f1xx_hal.hHAL库的初始化、系统滴答,HAL库延时函数等相关函数
stm32f1xx_hal_conf.hHAL库的用户配置文件,用于裁剪HAL库、配置晶振参数等
stm32f1xx_hal_def.h包含HAL库通用的美剧类型数据和宏定义
stm32f1xx_hal_cortex.c stm32f1xx_hal_cortex.h内核通用函数定义和声明,如NVIC、MPU、系统软复位、Systick等,其实主要是对core_cm2.h文件的相关函数再次封装
stm32f1xx_hal_ppp.c stm32f1xx_hal_ppp.h某任意外设驱动源码,PPP表示任意外设
stm32f1xx_hal_ppp_ex.c stm32f1xx_hal_ppp_ex.h主要是存放外设的扩展(特殊)功能的驱动源码,PPP表示任意外设
stm32f1xx_ll_ppp.c stm32f1xx_ll_ppp.hLL库驱动源码,在部分stm32f1xx_hal_ppp.c或stm32f1xx_hal_ppp_ex.c中会被调用

3.3 HAL库API函数和变量命名规则

a. 命名规则

文件名称stm32f1xx_hal_ppp.(c/h)stm32f1xx_hal_ppp_ex.(c/h)
函数名HAL_PPP_FunctionHAL_PPPEx_Function
外设句柄PPP_HandleTypeDef
外设工作参数初始化结构体PPP_InitTypeDefPPP_InitTypeDef
配置参数结构体PPP_YyyyConfTypeDefPPP_YyyyConfTypeDef

即让某个外设(PPP)完成某个功能(Function),常见的有以下几种:

  • 初始化/反初始化函数:HAL_PPP_Init()HAL_PPP_DeInit()

  • 外设读写函数:HAL_PPP_Read()HAL_PPP_Write()HAL_PPP_Transmit()HAL_PPP_Receive()

  • 控制函数:HAL_PPP_Set ()HAL_PPP_Get ()

  • 状态和错误:HAL_PPP_GetState ()HAL_PPP_GetError ()

b. HAL库的回调函数

这部分允许用户重定义,并在其中实现用户自定义的功能,使用HAL库最常用的API之一:

回调函数举例
HAL_PPP_MspInit()/_MspDeInit()HAL_USART_MspInit()由 HAL_PPP_Init()这个API调用,主要在这个函数中实现外设对应的GPIO、时钟、DMA,和中断开启的配置和操作
HAL_PPP_ProcessCpltCallbackHAL_USART_TxCpltCallback 由外设中断或DMA中断调用,调用时API内部已经实现中断标记的清除的操作,用户只需要专注于自己的软件功能实现即可
HAL_PPP_ErroCallbackHAL_USART_ErrorCallback外设或DMA中断中发生的错误,用于作错误处理

4、如何使用HAL库

STM32F1系列为例,HAL库的用户配置文件

  • 获取stm32f1xx_hal_conf.h的方法:

    • 可以从在官方的例程(Projects文件夹)中直接复制
    • 可以从在HAL库驱动源码头文件(Inc文件夹)中复制stm32f1xx_hal_conf_template.h并重命名
  • 裁剪HAL库外设驱动源码(不进行编译):

    • stm32f1xx_hal_conf.h中不需要的外设的宏定义注释掉
    • 不把不需要的HAL库外设驱动源码加到工程文件中
  • 设置外部晶振频率:

    • /* 外部高速晶振频率对应的宏定义 */
      #if !defined (HSE_VALUE)
      #if defined(USE_STM3210C_EVAL)
      #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */
      #else
      #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */
      #endif
      #endif /* HSE_VALUE */
      
    • /* 外部低速晶振频率对应的宏定义 */
      #if !defined (LSE_VALUE)
      #define LSE_VALUE ((uint32_t)32768) /* 外部低速振荡器的值,单位 HZ */
      #endif /* LSE_VALUE */
      

5、HAL库使用注意事项

  • 使用HAL库出现问题,要通过参考手册检查硬件操作是否有问题
  • 尽量不通过修改库源码实现功能,这样不方便库更新,可以拷贝一份库源码,通过修改拷贝的库源码实现想要的需求
  • 有些HAL库API函数执行效率低,可能会直接通过操作寄存器的方式代替
  • 可能HAL库也存在错误,要有怀疑精神

http://chatgpt.dhexx.cn/article/SF7pCbbN.shtml

相关文章

HIDL(HAL interface definition langguage)

HIDL的相关介绍 HIDL的全称是HAL interface definition language&#xff08;硬件抽象层接口定义语言&#xff09;&#xff0c;在此之前 Android 有AIDL&#xff0c;架构在Android binder 之上&#xff0c;用来定义Android 基于Binder通信的Client 与Service之间的接口。HIDL…

内部类

一、非静态内部类。 1、修饰符 非静态内部类有四个作用域&#xff0c;所以有四个修饰符。 private : 只能在外部类的内部使用。 protected : 可被与外部类处于同一个包中的其他类和外部类的子类所访问。 省略 : 只能被与外部类处于同一个包中的其他类访问。 public : 可…

python的类作用_python中类的作用是什么

简单来说&#xff0c;类是一种高级抽象&#xff0c;就是一种高级的数据类型&#xff0c;是对象的蓝图&#xff0c;就是用来定义你要用的对象的属性和行为的。 以下是面向对象简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性…

C# 内部类的作用

作用一&#xff1a;限制对类的可访问性 有时候会遇到这样的需求&#xff0c;希望一个类仅能被另一个类&#xff08;以及其派生类&#xff09;访问。 代码 class BaseClass {public class PublicNestedClass { }protected class ProtectedNestedClass { }private class Priva…

内部类详解

1.成员内部类 1.样例 class OutClass {class InnerClass {public String SayHi() {return "你好";}} }2.特点 内部类能够无条件的访问外部类的成员变量&#xff0c;外部类要访问内部类成员变量需要使用new。内部类和外部类有相同名称的变量或者是方法&#xff0c;…

Java 静态内部类作用

需要了解2个概念&#xff1a;内部类和静态修饰符static 1&#xff09;首先&#xff0c;用内部类是因为内部类与所在外部类有一定的关系&#xff0c;往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类。 2&#xff09;静态都是用来修饰类的内部成员的。…

java内部类的四大作用

一、内部类的作用 我们为什么需要内部类&#xff1f;或者说内部类为啥要存在&#xff1f;其主要原因有如下几点&#xff1a; 内部类方法可以访问该类定义所在作用域中的数据&#xff0c;包括被 private 修饰的私有数据内部类可以对同一包中的其他类隐藏起来内部类可以解决java …

Flink--- 批处理 / 流处理

目录 Flink的主要特点 Flink 和 Spark Streaming 搭建maven工程 FlinkTutorial 添加Scala框架 和 Scala文件夹 Flink-批处理wordcount Flink---流处理wordcount Flink 是一个框架和分布式的处理引擎&#xff0c;用于对无界和有界数据流进行状态计算。 传统数据处理架构 事…

流数据处理利器

流处理 (Stream processing) 是一种计算机编程范式&#xff0c;其允许给定一个数据序列 (流处理数据源)&#xff0c;一系列数据操作 (函数) 被应用到流中的每个元素。同时流处理工具可以显著提高程序员的开发效率&#xff0c;允许他们编写有效、干净和简洁的代码。 流数据处理在…

流处理(Stream)和批处理(Batch)

1 流处理和批处理的概念 在程序计算当中&#xff0c;同一节点或者不同节点之间的数据的传递是实时传递还是延迟传递&#xff0c;这就引出了两个概念。其实在非大数据领域这两个概念所起的作用也是很有限&#xff0c;但是在大数据领域&#xff0c;处理上亿级别的时候&#xff0…

管道模式 流处理

&#xff08;一&#xff09;介绍 管道这个名字源于自来水厂的原水处理过程。原水要经过管道&#xff0c;一层层地过滤、沉淀、去杂质、消毒&#xff0c;到管道另一端形成纯净水。我们不应该把所有原水的过滤都放在一个管道中去提纯&#xff0c;而应该把处理过程进行划分&#…

Flink流处理API大合集:掌握所有flink流处理技术,看这一篇就够了

大家好&#xff0c;我是百思不得小赵。 创作时间&#xff1a;2022 年 5 月 18 日 博客主页&#xff1a; &#x1f50d;点此进入博客主页 —— 新时代的农民工 &#x1f64a; —— 换一种思维逻辑去看待这个世界 &#x1f440; 今天是加入CSDN的第1172天。觉得有帮助麻烦&#x…

Python流处理

转自 &#xff1a;https://www.toutiao.com/a6589000256896107015/?tt_frommobile_qq&utm_campaignclient_share&timestamp1534156143&appnews_article&utm_sourcemobile_qq&iid40708017633&utm_mediumtoutiao_ios&group_id6589000256896107015 F…

Stream流式处理

Stream流的三类方法 获取Stream&#xff1a;流创建一条流水线,并把数据放到流水线上准备。 中间方法&#xff1a;流水线上的操作一次操作完毕之后,还可以继续进行其他操作。 终结方法&#xff1a;一个Stream流只能有一个终结方法是流水线上的最后一个操作。 生成Stream流的…

流数据处理与分析

环境 名称 版本 系统 Ubuntu 18.04.4 LTS 内存 7.5GiB 处理器 Intel Core i7-8565U CPU 1.80GHz *8 图形 Intel UHD Graphics&#xff08;Whiskey Lake 3*8 GT2&#xff09; GNOME 3.28.2 操作系统类型 64位 磁盘 251.0 GB Storm 2.1.0 Zookeeper…

流处理系统

文章目录 引言如何发送事件流流处理不可靠的时钟容错总结 引言 清楚数据的类型有助于我们设计一个性能更高&#xff0c;更有针对性的数据系统&#xff0c;比如在线系统&#xff0c;离线系统&#xff08;批处理&#xff09;。近实时系统(流处理)等等。比如说批处理系统&#xf…

流处理简介

一. 流式处理简介 在我接触到java8流式处理的时候&#xff0c;我的第一感觉是流式处理让集合操作变得简洁了许多&#xff0c;通常我们需要多行代码才能完成的操作&#xff0c;借助于流式处理可以在一行中实现。比如我们希望对一个包含整数的集合中筛选出所有的偶数&#xff0c;…

【节点流和处理流】

节点流和处理流 基本介绍 节点流可以从特定数据源读取数据&#xff0c;如FileReader、FileWriter处理流&#xff1a;是对一个已存在的流的连接和封装&#xff0c;通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一…

流数据处理

流数据处理strom 在2011年Storm开源之前&#xff0c;由于Hadoop的火红&#xff0c;整个业界都在喋喋不休地谈论大数据。Hadoop的高吞吐&#xff0c;海量数据处理的能力使得人们可以方便地处理海量数据。但是&#xff0c;Hadoop的缺点也和它的优点同样鲜明——延迟大&#xff0…

一. 流式处理简介

https://www.cnblogs.com/shenlanzhizun/p/6027042.html Java技术学习 https://www.itkc8.com 一. 流式处理简介 在我接触到java8流式处理的时候&#xff0c;我的第一感觉是流式处理让集合操作变得简洁了许多&#xff0c;通常我们需要多行代码才能完成的操作&#xff0c;借助…