#STM32

#HAL库基础

一、引言

小记:2025年全国大学生电子设计竞赛接近尾声,本人呢也有幸参加了这次竞赛,为期一个月的电赛训练,令我受益颇多。还记得第一次接触到STM32F407VGT6这一芯片时,我惊叹于它过百的引脚,以及复杂的引脚复用功能,当时就觉得记住这些复杂的引脚好困难!但是随着深入的学习,我意识到,HAL库的使用,就是一个化繁为简的过程,我们不需要自己手敲那些GPIO外设库、配置定时器、配置PWM波、配置串口等等这些库的代码,而是直接通过一款软件叫做CubeMX的软件进行选项配置的,当上面的选项配置完后就可以直接生成与所选STM32芯片相关的各种库文件了,非常方便!恰逢暑假,赛事已尽,所以我打算用剩下的暑假时间自己做一个基于STM32F407VGT6芯片的HAL库基础教学,因为本人还是一名学生,水平有限,若有不严谨的地方,欢迎大家在评论区批评指正。最后呢,我会在进行基础教学的同时加入一些本人认为在电赛中可能会用到的一些库函数封装,供大家参考使用~

二、硬件准备

在开始之前呢,我来和大家说明一下本课程学习HAL库需要用到的硬件基础。

1.开发板选择

我们进行STM32F4系列HAL库的课程学习,都是基于立创天空星开发板(主控为STM32F407VGT6)展开。

此外,嘉立创官网提供了完善的开源资料,这些资源可供我们免费查阅和学习。

立创开源硬件平台

在这里,我们搜索“天空星”,即可查看天空星相关的开源资料,还有许多大佬自制的天空星扩展板供我们免费下载使用。然后点击开发板,选择“打开设计图”即可查看天空星开发板的原理图和PCB布局图。

天空星开发板如下所示,需要自己焊排针哈

2.其他硬件选择

本课程学习需要用到的硬件有:

1.ST-Link,用于下载和调试我们的程序。

2.USB转TTL(CH340),用于后续串口调试。

3.面包板,用于后续电机驱动等电路搭建。

4.TB6612电机驱动模块,用于后续电机驱动的学习和使用。

5.直流减速电机。

6.杜邦线,公对公、公对母、母对母各20根,用于后续电路连线以及下载器连线。

另外可充电锂电池也是需要用到的,建议大家提前备好,驱动电机造小车的话,电池是必不可少的。

三、CubeMX的安装与配置说明

1.CubeMX安装说明

网上对于CubeMX的安装教程有很多,也有很多压缩包版本的CubeMX软件大家可以自行下载安装,博主给各位推荐一位大佬所写的安装教程,可以参考安装。另外这位大佬教学内容里也包含了CubeMX的基础配置与使用,大家可以仔细研读。

【正点原子STM32】STM32CubeMX入门(搭建Java运行环境、STM32CubeMX安装、新建STM32CubeMX工程步骤、STM32CubeMX用户使用手册)-CSDN博客

2.CubeMX内部配置简要说明

安装与配置完成后,我们进入CubeMX的页面应该是这样的:

首先,点击选项栏的File,进行一个工程的建立。

我们点击New Project,建立一个新工程,在建立新工程的页面我们需要主动搜索自己需要配置的芯片型号,我们实验用到的芯片为STM32F407VGT6,所以在搜索框输入STM32F407VGT6即可,演示图片如下所示:

到这里,我们就正式进入STM32HAL库的配置界面啦!配置界面如下:

接下来我将为各位同学介绍一些重要且常用的配置,请大家拿好自己的小本本开始记录咯!

首先,我们单击展开CubeMX左栏的System Core,选中其中的SYS,会出现以下界面:

我们再点击Debug这一栏,选择Serial Wire启用它,这是指串行调试模式的启用,只有启用了它,我们才能够在后续对程序进行调试、下载和烧录(一般来说不启用的话,只能下载进板子一次,据说可能会对板子造成伤害哦)总之,一定要选用Serial WIre,选用后右栏芯片会有两个引脚被启用,如下图所示:

接下来是时钟配置,时钟配置是我们STM32学习过程中非常重要的一部分,尤其是时钟树的学习和使用,对于时钟树,我们后面讲定时器时会和大家讲到,目前只学习使用CubeMX对外部晶振进行常用的配置,下图是启用外部晶振模式,内附文字说明:

然后我们点击Clock Configuration,进行时钟配置:

由于我所使用的板子上晶振为8MHZ,所以这里的input frequency我需要选用为8,有些同学使用的是25MHZ的,则保持25MHZ默认即可。具体配置如下图所示,内附文字说明:

此外也可对时钟配置进行一键配置,即在input frequency选择正确的前提下直接点击页面中的HCLK(MHZ),将它输入为最大频率即可一键配置外部晶振。

时钟基础配置就讲到这里,以后每次建立一个新工程,大家可以先行配置以上两项,其它配置会在后续的课程中为大家一一讲解,还请各位拭目以待~

最后就是如何通过CubeMX生成一个文件,且打开我们的Keil5。

如果有同学还没有安装配置好Keil5,这里和大家推荐一位大佬的教程,此博客带有Keil5的安装包,并且安装配置教程非常详细,非常值得一看:

STM32入门(一):Keil_5下载和安装教程_keil uvision5-CSDN博客

在Keil5安装且配置完成后,我们打开我们的CubeMX的Project Manager,进行如下图所示的配置,图中已附有文字说明:

配置好以后,我们再选中第二排的Code Generator,进行生成文件的相关配置,配置选择如下图所示,图中已附有相关的文字说明:

这就是我们生成文件前的最后一步啦,接下来点击右上角的GENERATE CODE即可生成工程!生成工程前一定要对自己的各项配置进行检查,相关引脚有没有配置好之类的都要检查。

打开工程后,我们进行一次全局编译,确保生成的代码文件配置都没问题。

我们的CubeMX初始配置就完成啦!接下来给大家讲一个生动的实例——用立创天空星点灯。

四、STM32HAL库实操一:点灯

相信很多学习本课程的同学都是有过单片机或FPGA基础学习的,大家都知道,实验第一课就是点灯,它是我们迈向嵌入式开发者的第一步,也是我们梦开始的地方,所以就让我带着各位进行一个入门操作吧!

1.基础版:点亮电子世界的第一盏灯

首先,我们要实现的是点亮LED灯的操作。打开CubeMX,进行上文所述的基础配置,自动启用相关引脚如下:

上述的串行调试模式和RCC时钟配置完成后,我们便可以开始配置点灯所需要启用的GPIO口了。

我们的天空星开发板是自带LED灯的,其中一个是电源指示灯,上电即可点亮,另外一个则是用户使用的LED灯,需要我们进行程序控制点亮。

接下来便是配置引脚,我们打开天空星开发板的设计原理图,我们双击“按钮和LED中”中的“按钮和用户LED”即可转到用户LED的原理图界面。我们发现用户LED原理图是这样的:

我们仔细查看用户LED的原理图,发现该发光二极管的亮灭由PB2引脚输入高低电平进行控制,当PB2输出低电平时,发光二极管不导通,LED灯不亮。当PB2输出高电平时发光二极管导通,灯点亮。具体判断原理如下图所示:

了解完这些,我们可以继续对芯片引脚进行配置,配置PB2引脚为输出模式,意味着由PB2引脚进行高低电平的输出。配置好后,我们点击右上角的“GENERATE CODE”生成代码。:

ps:上下拉的概念

对于加上拉电阻,我们可以认为将引脚钳位在高电平;对于加下拉电阻,我们可以认为将引脚钳位在低电平。具体可以参考这位大佬写的笔记,很是让人受益:

整理笔记——上拉电阻、下拉电阻-CSDN博客

老规矩,生成代码后我们再全局编译一下:

编译成功后,我们找到while主循环,在循环里点个灯吧,点灯呢需要我们给控制用户灯亮灭的引脚PB2以高电平,才能使得发光二极管被点亮,此时便需要HAL库专用的一个函数

HAL_GPIO_WritePin();其中有三个参数,第一个是指GPIO组,比如PB2是GPIOB组,那么第一个参数我们填写GPIOB即可,第二个参数指的是引脚数字系列,比如PB2的引脚数字为2,所以我们的第二个参数就填写GPIO_PIN_2,第三个参数是我们设置引脚的高低电平状态,其中GPIO_PIN_SET指设置引脚输出高电平,GPIO_PIN_RESET则是设置引脚输出低电平。

我们所需要的是令PB2引脚输出高电平,从而点亮用户LED灯,因此,我们在while主循环中写下代码如下:

编译,将程序下载到我们的板子上。这里需要我们将ST-LINK与我们的开发板连接好,连接顺序为:

连接实物图如下:

接下来需要将ST-LINK接到我们的笔记本电脑上,然后等待编译成功后即可将程序下载到板子上,如果程序无法下载到板子上,则需要检查Keil5上的配置:

下载完成后,我们点击天空星开发板上的“RST”复位键,即可观察到LED灯亮。

2.升级版:实现灯的循环亮灭

既然我们可以通过GPIO_WritePin()这一函数实现灯亮和灯灭,那么屏幕前聪明的你想一想,我们能不能通过一点点的改进来实现灯的循环亮灭呢?这就不得不提到一个离不开我们生活的函数——延时函数了。HAL库已经为我们封装好延时函数的库,我们只需要简单调用延时函数并设置延时时间即可,不需要去了解它的底层逻辑,而延时函数写作:HAL_Delay(XXXX),其中XXXX指的是延时时间,以ms为单位,比如HAL_Delay(1000)即为延时1000ms即1秒。有了延时函数的加入,我们可以很轻松的去实现LED灯的循环亮灭啦!

方案1:首先给LED高电平将其配置为为亮的状态,然后我们延时1s,再给LED低电平设置其为灭的状态,然后再延时1s,这样一个周期为2s的循环亮灭的LED灯就实现了。在main.c文件中的while循环里,具体代码实现如下:

  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
		HAL_Delay(1000);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

注:此后如果有添加的代码,我都会通过输入代码的形式给大家呈现出来,大家可通过将代码复制到对应位置即可进行实验,不过还是建议大家自己手敲一边代码加强印象哈。

按下复位后具体现象可以查看一下,会发现LED灯1s亮1s灭。

方案2:还有一个函数是专门用于GPIO电平状态翻转的,它就是

HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

它的参数只有两个,分别是GPIO组和GPIO引脚数,我们只需要将PB2写入该函数,即可实现高低电平输出翻转,但是不要忘记延时函数哟,否则while主循环会无限循环,电平翻转是跟不上滴。在main.c文件中的while循环里,具体代码如下:

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

3.强化升级版:按下按键实现LED灯的规则亮灭

试想一下,如果我们想通过按键进行LED灯规则亮灭的控制,应该如何去做呢?这就需要查看我们开发板关于按键模块的原理图了:

草图介绍如下:

我们发现,当按键按下时PA0引脚读取电平为高电平,反之读取电平为低电平。查完原理图,我们就要通过CubeMX对引脚进行启用了,记住:启用新的GPIO,不需要再创建新工程,不需要再创建新工程!!!我们只需要在老工程进行修改,修改后再重新生成代码即可,以下是操作步骤,请萌新按图示步骤进行操作

编写代码之前,将之前点灯的代码注释掉。由于配置PA0为输入模式,所以我们就不应该是对它写电平,而是读电平,对读取的电平状态进行判断,读取高电平,代表按键按下,则执行某种操作,否则不执行,读电平则是需要以下函数:

HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

其中只需要两个参数,分别为GPIO组和对应GPIO引脚数。

接下来就要编辑我们的代码啦,基础代码如下,大家后续也可以根据自己的想法对代码进行升级:

  while (1)
  {
//		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
//		HAL_Delay(1000);
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
		{
			while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET);//用于按键消抖	
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);//点灯
			HAL_Delay(1000);	
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);//灭灯
			HAL_Delay(1000);	
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);//点灯
		}

按下后的现象应该是按键按下,LED先亮,再灭,再常亮。再按下按键还是会重复以上操作。那么在这里留下一个发挥题,各位同学能不能修改代码,实现按键控制灯的循环亮灭呢?(不可以一直点灯灭灯哦,如果有思路的话,可以在评论区或者私信我,有自己的想法和思路的同学有特殊奖励哈)。

五、结语

我们所学的知识都是在无数前辈不懈探索中精炼出来的,作此基础课程,是为了和大家分享自己在学习STM32HAL库的过程中学到的一些经验,希望能够帮助各位更好的理解它,也希望大家能以此为基础更好的学习单片机知识,文章中可能会有语义表达不明确之处,还望各位多多包涵,有任何疑问都可以在评论区中进行讨论,看到消息我会一一回复哒~

此外,以下STM32F4系列相关的学习课程,大家可以参考学习,不理解的地方可以一起探讨~

通过网盘分享的文件:STM32F4系列课程
链接: https://pan.baidu.com/s/1LL9qR3YvuLzj557kHKFzmA?pwd=65x9 提取码: 65x9 
--来自百度网盘超级会员v3的分享

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐