【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项

news2024/11/10 13:16:41

目录

  • 1.初识HAL库(了解)
    • 1.1CMSIS简介
    • 1.2HAL库简介
  • 2.STM32Cube固件包浅析(了解)
    • 2.1如何获取STM32Cube固件包?
    • 2.2STM32Cube固件包文件夹简介
    • 2.3CMSIS文件夹关键文件
      • 2.3.1CMSIS标准规定软件包目录
      • 2.3.2Device和Include文件夹的关键文件介绍
  • 3.HAL库框架结构(了解)
    • 3.1HAL库文件夹结构
    • 3.2HAL库文件介绍
    • 3.3HAL库API函数和变量命名规则
      • 3.3.1HAL库对寄存器位操作的相关宏定义
      • 3.3.2HAL库回调函数
  • 4.如何使用HAL库(熟悉)
    • 4.1基于CMSIS应用程序文件描述
      • 4.1.1STM32开发文件结构分布
    • 4.2HAL 库的用户配置文件
      • 4.2.1裁剪HAL库外设驱动源码(不进行编译)
      • 4.2.2设置外部高速晶振频率(根据开发板实际情况设置)
      • 4.2.3设置外部低速晶振频率(根据开发板实际情况设置)
    • 4.3stm32f1xx_hal.c 文件
  • 5.HAL库使用注意事项(了解)
  • 6.课堂总结(了解)

1.初识HAL库(了解)

1.1CMSIS简介

  CMSIS (微控制器软件接口标准):Cortex Microcontroller Software Interface Standard,是由ARM和与其合作的芯片厂商(比如ST、NXP公司等)、软件工具厂商(Keil、IAR公司等),共同制定的标准。如果没有此标准,ARM公司的产品兼容性非常差。
  下图中分为三层,第一层是用户层,主要是用户代码、在线调试;第二层是中间层(CMISIS),具体CMSIS体现到用户手册是CMSIS-Pack,每个公司提供的包可能不太一样,会根据自己的产品制作CMSIS包,其中HAL库(Peripheral HAL)属于其内容;第三层是硬件层。用户想要去开发硬件层,需要经过中间层,中间层的CMSIS包由众多厂商提供。
在这里插入图片描述

1.2HAL库简介

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

  1. 标准外设库 (Standard Peripheral Libraries),也就是“标准库”。
  2. HAL库(硬件抽象层):Hardware Abstraction Layer
  3. LL库:Low Layer,也就是“底层库”,更加接近硬件,也就是更加接近寄存器。

  下图是直接操作寄存器、标准库、HAL库(不同系列兼容性好,具体表现是不同外设初始化都是使用一个函数,只是结构体、变量不一样,但是函数接口一样,移植方便。HAL库是抽象层的库,经过很多次的封装,导致效率比较低)、LL库(弥补了HAL库执行效率低的缺点,在HAL库内部一些API函数就会调用LL库中内容,但是LL库也有其缺点,不匹配部分复杂外设,比如USB)的特点:
在这里插入图片描述

2.STM32Cube固件包浅析(了解)

  Cube固件包其实就说CMSIS-Pack,STM32Cube固件包是ST公司根据标准提供的CMSIS-Pack。

2.1如何获取STM32Cube固件包?

  之前文章中已经总结如何获取,具体查看【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤中的第1.1小节。

2.2STM32Cube固件包文件夹简介

【_htmresc】文件夹中包含了一些图片之类的,对我们来说没任何作用;
【Documentation】文件夹中为固件包说明文档;
【Drivers】文件夹比较重要是驱动源码,新建工程时需要用到
【Middlewares】中为中间文件,保存的是ST或者第三方的一些中间文件,后续会用到,新建工程可能暂时用不到;
【Projects】为ST官方开发板例程,参考作用;
【Utilities】为ST关方开发板例程提供公共组件,一般用不到,可以用作参考;
License.md文件包含了软件许可、软件版本信息;
package.xml为固件包版本信息;
Readme.md为自述文件;
Release_Notes.html为补充或更新说明的链接,可用浏览器打开。

在这里插入图片描述

2.3CMSIS文件夹关键文件

  F1系列【Drivers】文件夹中包含了三个文件夹【BSP】、【CMSIS】、HAL库驱动【STM32F1xx_HAL_Driver】。【BSP】中为板级驱动源码,也就是板级支持包,适配ST官方的开发板板级驱动(针对外设、或者板子上面的资源做的驱动),不同开发板板级驱动是不一样的,所以此文件更多是参考意义;【CMSIS】文件夹包含符合CMSIS的组件,包括:DSP库、Cortex-M内核及其设备文件、微控制器专用头文件、启动文件、专用系统文件等,创建工程时会复制其中部分文件;【STM32F1xx_HAL_Driver】为F1系列HAL库外设驱动源码,创建工程时会复制其中部分文件
在这里插入图片描述
  【Middlewares】中包含了【ST】和【Third_Party】两个文件夹。
在这里插入图片描述
  在【CMSIS】文件夹中主要关注【Device】和【include】两个文件夹,新建工程时也是用到这两个文件夹;【Device】文件夹中包含微控制器专用头文件、启动文件、专用系统文件;【include】文件夹中包含Cortx-M内核及其设备文件、编译器相关头文件。

在这里插入图片描述

2.3.1CMSIS标准规定软件包目录

   CMSIS标准规定软件包目录也就是STM32Cube固件库文件夹所包含的内容。用到的有【Driver】和【Include】文件夹。
在这里插入图片描述

2.3.2Device和Include文件夹的关键文件介绍

   【Device】文件夹中用到的文件包含以下文件,以下文件是简略后的文件。
在这里插入图片描述
   stm32f103后面的xe是根据FLASH容量进行选择,在【include】文件夹中保存3个文件:stm32f1xx.h、stm32f103xe.h、system_stm32f1xx.h。
在这里插入图片描述
   以下目录中保留文件system_stm32f1xx.c,因为编译器是ARM,所以保留【arm】文件夹中的启动文件,并根据型号和容量来选择保留哪个启动文件。
在这里插入图片描述
在这里插入图片描述
   【include】文件夹中用到以下文件:cmsis_armcc.h(针对AC5编译器)、cmsis_armclang.h(针对AC6编译器)、cmsis_compiler.h(AC5和AC6编译器共用)、cmsis_version.h(编译器版本,也是共用的)、core_cm3.h (Cortex-M3内核,重点关注此文件)、 mpu_armv7.h(mpu内存保护)。
在这里插入图片描述

3.HAL库框架结构(了解)

3.1HAL库文件夹结构

   F1系列的HAL库被保存到【STM32F1xx_HAL_Driver】文件夹中,Src(Source):外设驱动源码;Inc(Include):外设驱动源码头文件。前面提到HAL库和LL库是捆绑发布的,就体现在驱动源码包含在【Inc】和【Src】文件夹中。【Inc】和【Src】文件夹中的【Legacy】文件夹是补充源文件,并不是所有系列都需要。
在这里插入图片描述

3.2HAL库文件介绍

   文件名中有hal的就是hal库文件,有ll的就是LL库文件。stm32f1xx_hal_conf.h文件可用于裁剪HAL库中用不到的功能,减少编译后得文件大小。
在这里插入图片描述

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

   用户一般不会直接调用LL库,而是通过调用HAL库间接使用LL库,所以不必深入学习LL库。
在这里插入图片描述
  可以将以下初始化函数中的PPP替换成GPIO,反初始化函数很少用到,主要用于失能时钟、恢复默认配置等。

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

3.3.1HAL库对寄存器位操作的相关宏定义

在这里插入图片描述

3.3.2HAL库回调函数

在这里插入图片描述
  此类回调函数通常被_weak修饰(弱函数),允许用户重新定义该函数。

4.如何使用HAL库(熟悉)

4.1基于CMSIS应用程序文件描述

  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中。
在这里插入图片描述

4.1.1STM32开发文件结构分布

在这里插入图片描述

4.2HAL 库的用户配置文件

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

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

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

4.2.2设置外部高速晶振频率(根据开发板实际情况设置)

  以下代码是设置高速外部晶振,宏USE_STM3210C_EVAL判断是否使用ST官方开发板,默认为25MHz,否则为8MHz。要根据开发板实际情况进行设置。如果要省事可以简化以下代码为:#define HSE_VALUE 8000000U

#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  (HSI_VALUE)
  #define HSI_VALUE              8000000U  
#endif /* HSI_VALUE */
#if !defined  (LSI_VALUE) 
 #define LSI_VALUE               40000U  
#endif /* LSI_VALUE */

4.2.3设置外部低速晶振频率(根据开发板实际情况设置)

#if !defined  (LSE_VALUE)
 #define LSE_VALUE               32768U    
#endif /* LSE_VALUE */

在这里插入图片描述

4.3stm32f1xx_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每次读取指令,将指令放在预取缓冲区,就可以起到程序加快运行的效果。

__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); 	                    /* 使能FLASH预取缓冲 */ 

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

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); /* 配置中断优先级分组 */ 

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

/* 使用滴答定时器作为时钟基准,配置 1ms 滴答(重置后默认的时钟源为 HSI) */ 
	HAL_InitTick(TICK_INT_PRIORITY); 

  HAL_MspInit()为空函数,不用管它。

HAL_MspInit(); 	/* 初始化其它底层硬件(如果必要) */

5.HAL库使用注意事项(了解)

1,使用HAL库出现问题,还是得通过参考手册检查是否硬件操作是否有问题;
2,尽量不通过修改库源码实现功能,这样不方便库更新;
3,HAL库可能会存在错误,要有质疑精神;
4,有些HAL库API函数执行效率偏低,我们可能会直接通过操作寄存器的方式代替。

6.课堂总结(了解)

在这里插入图片描述

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

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

相关文章

背光图像增强论文调研

背光图像增强 M. Akai, Y. Ueda, T. Koga and N. Suetake, “A Single Backlit Image Enhancement Method For Improvement Of Visibility Of Dark Part,” 2021 IEEE International Conference on Image Processing (ICIP), Anchorage, AK, USA, 2021, pp. 1659-1663, doi: 10…

山西电力市场日前价格预测【2023-07-05】

日前价格预测 预测明日&#xff08;2023-07-05&#xff09;山西电力市场全天平均日前电价为168.88元/MWh。其中&#xff0c;最高日前电价为334.22元/MWh&#xff0c;预计出现在20: 30。最低日前电价为0.00元/MWh&#xff0c;预计出现在09: 45-17: 15。 以上预测仅供学习参考&a…

【Git】中文显示数字的问题的解决方案

目录 问题截图解决方案 问题截图 运行git status命令&#xff0c;会出现图片中不正常显示中文的问题 解决方案 设置终端: 右键窗口头部 -> Options...执行命令: git config --global core.quotepath false

电脑屏幕监控软件是什么?有哪些功能?

电脑屏幕监控软件是一种用于监视和记录电脑屏幕活动的工具。它可以捕捉屏幕上的所有操作&#xff0c;包括键盘输入、鼠标点击、应用程序使用等。这些软件通常被用于家庭、教育机构和企业等环境中&#xff0c;以确保电脑的安全和监督员工或孩子的活动。 为什么需要电脑屏幕监控软…

STM32实战项目—密码锁

该项目的完整工程可以在博主的资源里找到&#xff0c;仅供参考。 文章目录 一、任务要求二、实现方法2.1 输入密码判断2.2 管理员模式2.3 修改密码 三、程序设计3.1 输入密码判断3.2 进入管理员模式3.3 修改密码 四、问题总结4.1 输入内容一直提示Error4.2 密码判断一直错误 五…

Lua,不使用模块,解压文件

本来lua遍历文件夹下压缩包内容、路径可以通过加载模块&#xff1a; require(“lfs”) 和 require(“zip”) 来解决。 但是本人通过c调用lua时&#xff0c;只要lua脚本中使用require加载模块&#xff0c;就会出错。 因此为了能够让c通过lua&#xff0c;解压当前路径下压缩包&a…

【基础算法】回溯算法相关题目

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招算法的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于代码随想录进行的&#xff0c;每个算法代码参考leetcode高赞回答和…

Android RecyclerView AsyncListUtil手动刷新fillData,kotlin

Android RecyclerView AsyncListUtil手动刷新fillData&#xff0c;kotlin implementation com.github.bumptech.glide:glide:4.15.1implementation androidx.constraintlayout:constraintlayout:1.1.3 import android.os.Bundle import android.util.Log import android.view.V…

百万连接实现02:使用epoll实现的服务器

使用的操作系统&#xff1a; t$ cat /proc/version Linux version 4.19.260 (lkmaoubuntu) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)) #1 SMP Thu Sep 29 14:19:07 CST 2022 文件句柄的限制 如果不修改连接测试&#xff0c;会报错 一个tcp连接就需要…

北京大学2015计算机学科夏令营上机考试

目录 A:整数的个数 B:过滤多余的空格 C:二维数组右上左下遍历 D 合影效果 E:Simple prefix compression【做不起】 F:To Europe! To Europe!【做不起】 G:The Game【做不起】 H:Falling Leaves A:整数的个数 #include<iostream> using namespace std; int main(…

VSCode 免安装及中文设置

前言&#xff1a;VSCode作为目前最强大的文本编辑器&#xff0c;通过内部的插件市场可满足各种开发需求。使用免安装版可以自定义插件安装位置等&#xff0c;而使用安装包安装只能通过修改快捷方式自定义&#xff0c;十分不方便。因此这里分享如何安装免安装版的VSCode。 下载…

ETL是什么?怎样更快的学习ETL?

ETL是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程&#xff0c;它能够对各种分布的、异构的源数据(如关系数据)进行抽取&#xff0c;按照预先设计的规则将不完整数据、重复数据以及错误数据…

滤波后点云的个数和之前相同,只是有的点云坐标是nan

进行点云的条件滤波&#xff0c;滤波前后点云的个数不变&#xff0c;只是被滤掉的点坐标显示为nan。代码片段如下&#xff1a; pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>()); range_cond->addComparison(pcl::Fi…

李宏毅transformer讲解;B站内测“搜索AI助手”功能

&#x1f989; AI新闻 &#x1f680; B站内测“搜索AI助手”功能 摘要&#xff1a;据反馈&#xff0c;B站正在内测“搜索 AI 助手”功能。用户在搜索框内输入问句或在搜索词中添加“?”即可体验此新功能。截图显示&#xff0c;该功能会为用户的搜索提供一个生成的答案&#…

hcip作业二

实验要求&#xff1a; 要求&#xff1a;R1-R2-R3-R4-R5 RIP 100运行版本2&#xff1b;R6-R7 RIP 200 运行版本1 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&…

盘点一个Python网络爬虫抓取股票代码问题(上篇)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 去来江口守空船&#xff0c;绕船月明江水寒。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银群【厚德载物】问了一个Python网络爬虫的问题…

新手入门深度学习 | 3-2:激活函数activation

一、什么是激活函数 生物神经网络启发了人工神经网络(ANN)的发展。但是,人工神经网络并非大脑运作的近似表示。不过在我们了解为什么在人工神经网络中使用激活函数之前,先了解生物神经网络与激活函数的相关性是很有用处的。 典型神经元的物理结构包括细胞体(cell body)、…

软件的兼容性测试确保良好稳定运行的用户体验

在数字化时代&#xff0c;各种软件应用的开发和推广越来越普遍。然而&#xff0c;由于不同的操作系统、不同的设备配置和不同的软件版本&#xff0c;软件的兼容性成为了一个重要的问题&#xff0c;可以说软件的兼容性测试确保良好稳定运行的用户体验。 首先&#xff0c;软件的兼…

MySQL Optimization Learning(三)

一、通过索引进行优化 数据结构 Data Structure Visualizations 数据可视化效果展示 Binary Search Tree 插入数据可视化效果展示 AVL Tree Red/Black Tree --MYISAM存储引擎数据和引用分开存储 DROP TABLE IF EXISTS t_test; CREATE TABLE t_test (id int(11) NOT NULL,…