STM32初识HAL库(下载和使用)

初识HAL库(了解)

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

  • 标准外设库 (Standard Peripheral Libraries)
  • HAL库(硬件抽象层):Hardware Abstraction Layer
  • LL库:Low Layer

请添加图片描述

一、获取STM32Cube固件包

方式一:ST官网( 意法半导体-STMicroelectronics )搜索STM32Cube

请添加图片描述

选择你需要的stm32cube的文件包(根据你的硬件型号进行选择,我的型号是stm32F108c)
请添加图片描述

新页面往下滑。选择要下载的版本

请添加图片描述

或者使用git进行代码拉取(这里拉取的是v1.8.0的版本)

git clone http://github.com/STMicroelectronics/STM32CubeF1.git -b v1.8.0 --depth 1

方式二:开发板A盘资料:A 盘→8,STM32 参考资料→1,STM32CubeXX固件包

二、STM32文件结构分布

要想学会stm32hal库首先要了解总体的文件架构,总体架构分为三部分 MCU硬件层CMSIS接口层用户程序层

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

以下就是各个文件描述

三、STM32Cube固件库文件简介

请添加图片描述
其中STM32Cube固件库文件中最重要的是Drivers和Middlewares文件夹中的文件和了解project文件夹

Drivers文件夹介绍:

请添加图片描述
在这里插入图片描述

BSP文件夹

存放开发板板级支持包驱动代码,如各种外设驱动
在这里插入图片描述

CMSIS文件夹

在这里插入图片描述
在这里插入图片描述

STM32F1xx_HAL_Driver文件夹

在这里插入图片描述
文件介绍
在这里插入图片描述

HAL库API函数和变量命名规则
文件名stm32f1xx_hal_ppp .(c/h)stm32f1xx_hal_ppp .(c/h)
函数名HAL_PPP_FunctionHAL_PPP_Function
外设句柄PPP_HandleTypeDef
外设工作参数初始化结构体PPP_InitTypeDefPPP_InitTypeDef
配置参数结构体PPP_ YyyyConfTypeDefPPP_ YyyyConfTypeDef

初始化/反初始化函数: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 ()

HAL库对寄存器位操作的相关宏定义
宏定义结构用途
__HAL_PPP_ENABLE_IT(HANDLE, INTERRUPT)使能外设中断
__HAL_PPP_DISABLE_IT(HANDLE,INTERRUPT)禁用外设中断
__HAL_PPP_GET_IT (HANDLE, __ INTERRUPT __)获取外设某一中断源
__HAL_PPP_CLEAR_IT (HANDLE, __ INTERRUPT __)清除外设中断
__HAL_PPP_GET_FLAG (HANDLE, FLAG)获取外设的状态标记
__HAL_PPP_CLEAR_FLAG (HANDLE, FLAG)清除外设的状态标记
__HAL_PPP_ENABLE(HANDLE)使能某一外设
__HAL_PPP_DISABLE(HANDLE)禁用某一外设
__HAL_PPP_XXXX (HANDLE, PARAM)针对外设的特殊操作
_HAL_PPP_GET IT_SOURCE (HANDLE, __INTERRUPT __)检查外设的中断源
HAL库回调函数
回调函数举例
HAL_PPP_MspInit() / _MspDeInit()举例: HAL_USART_MspInit()会被HAL_PPP_Init() 函数调用,该函数主要用于存放外设使用到的GPIO、CLOCK、NVIC、DMA等初始化代码
HAL_PPP_ProcessCpltCallback举例: HAL_USART_TxCpltCallback由外设中断或DMA中断调用,HAL库中断公共处理函数已经实现对中断标记位读取、判断和清除操作,用户只需要专注于中断逻辑功能的实现即可
HAL_PPP_ErrorCallback举例: HAL_USART_ErrorCallback外设或DMA中断中发生的错误,用于发生错误处理

此类函数通常被_weak修饰(弱函数),允许用户重新定义该函数

Middlewares文件夹介绍

该文件夹下面有 ST 和 Third_Party 2 个子文件夹。
ST 文件夹下面存放的是 STM32 相关的一些文件,包括 STemWin 和 USB 库等。
Third_Party 文件夹是第三方中间件,这些中间件都是非常成熟的开源解决方案。
在这里插入图片描述

Projects 文件夹

该文件夹存放的是一些可以直接编译的实例工程。每个文件夹对应一个 ST 官方的 Demo板。比如要查看 STM32L476 相关工程,直接打开子文件夹 STM32L476G-EVAL即可。里面有很多实例,都可以用来参考。

这里注意,每个工程下面都有一个MDK-ARM 子文件夹,该子文件夹内部会有名称为 Project.uvprojx 的工程文件,我们只需要点击它就可以在MDK中打开工程。 例如打 开Projects\STM32L476G-EVAL\Templates\MDK-ARM 文件夹,内容如下图:
在这里插入图片描述

四、使用

CMSIS核心层文件就是将【CMSIS】文件夹中的【Device】和【Include】文件夹中裁剪后剩的11个文件,这11个文件对于新建MDK工程是必须包含的;设备驱动层就是HAL库及LL库的源码,也就是【STM32F1xx_HAL_Driver】文件夹中的源码;用户程序文件,正点原子例程都将main.h、stm32f1xx_hal_msp.c删除掉了,放到了例如初始化UART就将UART的在stm32f1xx_hal_msp.c中的回调函数放到usart.c中,stm32f1xx_it.c和stm32f1xx_it.h里面本身就定义了一些中断,所以选择保留,如果写串口中断,推荐写到usart.c中。。

HAL 库的用户配置文件

如果是F1系列那么就修改stm32f1xx_hal_conf.h。获取此文件可以从STM32官方例程中获取,也可以从HAL库驱动源码中获取,只是名称不同,复制时只需要将template删除即可。
  在这里插入图片描述

裁剪HAL库外设驱动源码(不进行编译)

STM32HAL库裁剪就是将stm32f1xx_hal_conf.h中用不到的宏定义注释掉,因为在HAL库驱动源码中都是用的ifdef判断宏是否被定义。以GPIO为例如下所示:
  在这里插入图片描述
通过对工程中用到什么外设就加什么驱动文件,也是起到裁剪作用。如下所示,是部分HAL库驱动文件:
在这里插入图片描述

stm32f1xx_hal.c 文件
  使用HAL库最关心的就说HAL库初始化函数HAL_Init(),不同系列可能有些小区别,但是核心代码如下:

HAL_StatusTypeDef  HAL_Init(void) 
{ __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); 	                    /* 使能FLASH预取缓冲 */ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); /* 配置中断优先级分组 */ /* 使用滴答定时器作为时钟基准,配置 1ms 滴答(重置后默认的时钟源为 HSI) */ HAL_InitTick(TICK_INT_PRIORITY); HAL_MspInit(); 	/* 初始化其它底层硬件(如果必要) */ return HAL_OK; 	/* 返回函数状态 */ 
}
  • 第一段程序作用是使能FLASH预取缓冲,STM32是32位的,每次读取的指令也是32位的,FLASH存在预取缓冲区,预取缓冲区由2个64位组成,CPU每次读取指令,将指令放在预取缓冲区,就可以起到程序加快运行的效果。

  • 第二段程序是设置中断优先级分组,默认情况下设置位为4,正点原子默认设置成2。

  • 第三段是使能系统滴答定时器,并且配置为1ms。正点原子实际配置滴答定时器在delay.c中的delay_Init()函数中。

  • HAL_MspInit()为空函数

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

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

相关文章

jQuery 笔记

一、什么是jQuery 框架:半成品软件 Jquery就是封装好的js 本质上还是js jQuery是一个快速、简洁的JavaScript**框架**,是继Prototype之后又一个优秀的**JavaScript代码库**(*或JavaScript框架*)。 JQuery:封装好的代码库。有一…

探索MySQL中DAYOFWEEK与WEEKDAY的差异与应用

在MySQL数据库中,处理日期和时间是常见的任务之一。为了准确地获取日期的星期几或工作日索引,MySQL提供了两个核心函数:DAYOFWEEK和WEEKDAY。尽管它们看似类似,但它们的功能和用法存在显著差异,适用于不同的场景和需求…

c#中将数据库中的文件导出为csv、xml文件的demo

1. 导出为CSV文件 /// <summary>/// 将mysql数据保存为csv文件/// </summary>/// <param name"connectionString">数据库连接字符串</param>/// <param name"query">sql语句</param>/// <param name"filePath…

【Proteus】按键的实现『⒉种』

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

Qt 进程间通信(一)——QSharedMemory共享内存

QSharedMemory共享内存 序言环境理论—逻辑理解实战—代码读取示例写入示例 序言 讲讲Qt的共享内存吧&#xff0c;巩固下 环境 msvc2022 Qt5.15 参考文档&#xff1a;https://doc.qt.io/qt-5/qsharedmemory.html 理论—逻辑理解 看下面前&#xff0c;你需要将共享内存看成…

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中&#xff0c;Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件&#xff0c;Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。 安装 Brasero 在大多数 Ubuntu 版本中&#xff0c…

JS数据类型检测的方式有哪些 (常用)

typeof 其中数组、对象、null都会被判断为object&#xff0c;其他判断都正确typeof返回的类型都是字符串形式 instanceof instanceof &#xff1a;用于检测一个实例是否属于某个类&#xff0c;通过验证当前类的原型 prototype 是否出现在实例的原型链 __proto__ 上。它不能检测…

如何在Excel中对一个或多个条件求和?

在Excel中&#xff0c;基于一个或多个条件的求和值是我们大多数人的常见任务&#xff0c;SUMIF函数可以帮助我们根据一个条件快速求和&#xff0c;而SUMIFS函数可以帮助我们对多个条件求和。 本文&#xff0c;我将描述如何在Excel中对一个或多个条件求和&#xff1f; 在Excel中…

论文阅读:Large Language Models for Education: A Survey

论文由Hanyi Xu、Wensheng Gan、Zhenlian Qi、Jiayang Wu和Philip S. Yu撰写的 Large Language Models for Education: A Survey&#xff0c;是关于大型语言模型&#xff08;LLMs&#xff09;在教育领域应用的综合调查研究。 1. 引言 论文讨论了人工智能&#xff08;AI&#…

Python开发—— 异常处理:详细指南

以下是对Python中try语句及其相关用法的更详细解释&#xff0c;包括更多的示例和应用场景&#xff1a; 1. 异常处理的基本概念 异常是程序在运行过程中遇到的错误条件。处理异常可以防止程序在遇到错误时崩溃。Python 提供了 try、except、else 和 finally 语句来处理异常。 …

DataExcelServer局域网文件共享服务器增加两个函数

1、PFSUM合并指定路径下单元格ID的值 PFSUM("/103采购/8月采购名细","amount") 第一个参数为路径&#xff0c;第二个参数为单元格的ID 2、PFQuery 查询路径下 单元格ID值的列表 PFQuery("/103采购/8月采购名细","amount") 查询/103采…

【vue】JSON数据导出excel

前言 导出方式有很多种&#xff0c;但是若只需要数据导出成.xlsx文件并下载的话&#xff0c;只用xlsx一个插件就行 目标 1 实现数据导出excel 2 如何设置表格列宽 3 如何在文件中创建工作表 准备工作 1 安装 npm i xlsx -S 2 引入 npm i xlsx -S 二、导出excel 创建文件 con…

Windows总结

windows安装 Windows分类 旗舰版 不完整专业版 不完整服务器版 完整安装步骤 拔网线安装Windows系统 备份下载安装镜像制作启动U盘 推荐用大白菜加入BIOS系统设置为U盘启动优先重装Windows系统 U盘安装光盘安装 优点&#xff1a;一对一安装简单缺点&#xff1a;大量安装非常浪费…

LeetCode 算法:腐烂的橘子 c++

原题链接&#x1f517;&#xff1a;腐烂的橘子 难度&#xff1a;中等⭐️⭐️ 题目 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#…

选择适合的220V转5V电源芯片,220V转5V非隔离降压电源ic

#### 问题&#xff1a; 在设计一个需要将220V交流电转换为5V直流电的电路时&#xff0c;我应该选择哪种型号的电源芯片&#xff1f;我需要输出电流在200mA以内&#xff0c;有没有推荐的型号&#xff1f; #### 答案&#xff1a; 在220V交流电转换为5V直流电的应用中&#xff0c…

解析 pdfminer layout.py LAParams类及其应用实例

解析 pdfminer layout.py LAParams类及其应用实例 引言类的定义1. line_overlap2. char_margin3. word_margin4. line_margin5. boxes_flow6. detect_vertical7. all_texts 类的初始化参数验证类的表示总结 引言 在这篇文章中&#xff0c;我们将解析一个叫做 LAParams 的类。这…

Lumen 9/10 版本中使用 Laravel Lang

安装 composer require --dev laravel-lang/common:^4.1注册/加载 方式一&#xff08;推荐&#xff09; bootstrap/app.php 中取消注释 $app->register(App\Providers\AppServiceProvider::class); app/Providers/AppServiceProvider.php 的 register 方法中添加&#x…

[C++][ProtoBuf][Proto3语法][一]详细讲解

目录 1.字段规则2.消息类型的定义与使用1.定义2.使用 3.enum类型1.语法2.定义时注意3.代码 1.字段规则 消息的字段可以⽤下⾯⼏种规则来修饰&#xff1a; singular&#xff1a;消息中可以包含该字段零次或⼀次(不超过⼀次) proto3语法中&#xff0c;字段默认使⽤该规则 repeat…

从入门到精通:网络基础详解

前言 在现代社会&#xff0c;网络技术已经成为我们日常生活和工作中不可或缺的一部分。从简单的网页浏览到复杂的分布式系统&#xff0c;网络技术都扮演着至关重要的角色。通过这篇文章&#xff0c;读者将从入门到精通&#xff0c;全面掌握网络编程的理论和实践。 重点摘要 …

【Spring Boot】Spring AOP中的环绕通知

目录 一、什么是AOP?二、AOP 的环绕通知2.1 切点以及切点表达式2.2 连接点2.3 通知&#xff08;Advice&#xff09;2.4 切面(Aspect)2.5 不同通知类型的区别2.5.1 正常情况下2.5.2异常情况下 2.6 统一管理切点PointCut 一、什么是AOP? Aspect Oriented Programming&#xff…