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:封装好的代码库。有一…

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

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

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

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

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

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

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

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

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

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

【vue】JSON数据导出excel

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

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

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

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

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

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

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

STM32学习历程(day5)

EXTI外部中断 中断 中断就是在主程序运行过程中 出现了特定的中断触发条件(中断源),CPU会暂停当前的程序,去处理中断程序 处理完会返回被暂停的位置 继续运行原来的程序。 中断优先级 当有多个中断源同时申请中断时 CPU会根据…

【面试八股总结】线程基本概念,线程、进程和协程区别,线程实现

一、什么是线程? 线程是“轻量级进程”,是进程中的⼀个实体,是程序执⾏的最小单元,也是被系统独立调度和分配的基本单位。 线程是进程当中的⼀条执行流程,同⼀个进程内多个线程之间可以共享代码段、数据段、打开的文件…

王老师 linux c++ 通信架构 笔记(二)配置服务器为固定的 ip 地址、远程登录、安装 gcc g++ 与虚拟机文件夹共享

(7)本条目开始配置 linux 的固定 ip 地址,以作为服务器使用: 首先解释 linux 的网口编号: linux 命令 cd : change directory 改变目录。 ls : list 列出某目录下的文件 根目录文件名 / etc &a…

JAVA基础-----final关键字

一、前言 final关键字的含义: final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你用final修饰,你将不能改变被修饰的代码,编译器会检查代码,如果你试图将变量再次初始化的话&#xff0…

I 2U-Net:具有丰富信息交互的双路径 U-Net 用于医学图像分割| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 I 2U-Net: A dual-path U-Net with rich information interaction for medical image segmentation I 2U-Net:具有丰富信息交互的双路径 U-Net 用于医学图像分割 01 文献速递介绍 在计算机视觉领域,医学图像分割是一个主要挑战&#xff…

【IMU】 椭球拟合标定加计Bias、Scale

椭球拟合简介 MESE IMU中,x,y,z轴的度量单位并不相同,假设各轴之间相互直。 加计静止状态(也就是只受重力的状态下),各个姿态只受重力的,x,y,z轴值(假设x,y,z轴相互垂直并且度量单…

TCP的p2p网络模式

TCP的p2p网络模式 1、tcp连接的状态有以下11种 CLOSED:关闭状态LISTEN:服务端状态,等待客户端发起连接请求SYN_SENT:客户端已发送同步连接请求,等待服务端相应SYN_RECEIVED:服务器收到客户端的SYN请请求&…

EPICS数据库示例

本文目标是使用EPICS数据库示例帮助新手理解如何使用不同的示例。 1、使用seq和mbbo的简单选择器 这个简单示例展示了如何使用一个mbbo和一个seq来旋转哪个值将被设置到一个PV。 # 这个mbbo记录将选择将运行seq的哪段 record(mbbo, "CHOOSE") {field(VAL, "…

ArcGIS中国工具(ArcGISCTools)等插件使用体验

ArcGIS中国工具(ArcGISCTools)的主要功能 1. 接合图表生成 这个功能允许用户生成标准分幅图的行政区边框注记,并在打印时自动加入。这对于需要制作标准地图的用户非常实用。 2. 图框工具 图框工具可以帮助用户创建和管理地图的图框&#…

Qt creator 控件转到槽 报错 The class containing “Ui:Dialog“ could not be found in

今天调试程序,发现主界面控件转到槽,报错如下图: 问题表现为:只有主窗口控件有这个错误,其他子窗口正常。 解决: 在网上搜这个报错信息,都没有一个很好的解决办法。 最后发现是我在子窗口中要…