利用HAL库实现自动流水灯以及手动控制流水灯

利用HAL库实现自动流水灯以及手动控制流水灯

一、HAL库方式编程介绍

HAL 库(Hardware Abstraction Layer,硬件抽象层)和标准库(Standard Peripheral Library,标准外设库,又称为 SPL)都是 STM32 微控制器的固件库。它们的主要区别在于结构和抽象级别。

  1. HAL 库: HAL 库是 STMicroelectronics(ST)提供的较新的库。它提供了一套统一的 API,用于访问 STM32 系列微控制器的外设。HAL 库的目的是简化固件开发,让开发者更加关注应用层逻辑,而无需深入了解底层硬件。

HAL 库的特点:

  • 跨平台支持:支持 STM32 全系列微控制器。
  • 结构统一:为所有外设提供统一的 API 和驱动结构。
  • 易于使用:简化了许多硬件操作,使得开发者可以快速上手。
  • 与 STM32CubeMX 工具集成:STM32CubeMX 可以自动生成 HAL 库的初始代码,方便开发者配置硬件。
  1. 标准库(SPL): 标准库是 STMicroelectronics(ST)较早推出的库,提供了访问 STM32 外设的底层驱动。它在设计上更接近寄存器操作,为开发者提供了更多的控制权,但是相对复杂一些。

标准库的特点:

  • 针对特定平台:针对不同的 STM32 系列提供相应的库。
  • 底层驱动:为外设提供底层的驱动接口,更接近硬件操作。
  • 控制精细:提供了更多的硬件控制选项,但相应地要求开发者具备较高的硬件知识。
  • 学习曲线较陡:由于其底层性质,开发者需要花费更多的时间学习和理解

本次实验我们将利用HAL库实现流水灯

二、开发环境搭建

2.1 安装包链接

链接:https://pan.baidu.com/s/1uQXoGWpp9ikwbMtmwIfLKg?pwd=0231
提取码:0231

2.2 JAVA环境安装

STM32CubeMX运行需要JAVA环境支持。在上面的链接中我已给出JDK安装包,用户下载点击安装包按照安装流程安装即可。
在这里插入图片描述

2.3 STM32CubeMX安装

安装包也在上面的链接中,我们下载好后打开安装包

点击下一步

在这里插入图片描述

继续下一步

勾选同意,继续下一步

在这里插入图片描述

选择好你的安装路径,继续继续下一步

在这里插入图片描述

啥都不用管,下一步就完事

在这里插入图片描述

等待安装,安装完成后,打开软件主页

在这里插入图片描述

三、新建HAL工程

点击“help",在选项里选择”Manage embedded software packages“

在这里插入图片描述

如果弹出报错,请试试重启软件再试几次

在弹出的界面中选择最新的安装包(推荐),然后点”install“。如果不能下载请注册你的账号并登录,放心这是免费的。

在这里插入图片描述

在选择芯片处选择你所拥有的芯片,我这边是STM32F103C8T6,然后建立工程

在这里插入图片描述

在随后出来的界面中点击”SYS“,在”Debug“选项选择"Serial Wire"

在这里插入图片描述

随后在时钟配置设置里将系统时钟勾选为”PLLCLK"

在这里插入图片描述

打开"GPIO",在右边的芯片上选择你想要的引脚,所有引脚都选择推挽输出模式,也就是“Output”

在这里插入图片描述

最后我们点击“Project Manager”,设置好我们工程存放的路径,选择“MDK-ARM"方式打开。

在这里插入图片描述

再点击”Code Generator“,勾选以下选项,点击右上角,这样工程就建立好了

在这里插入图片描述

四、流水灯实现

4.1 自动流水灯

首先是自动流水灯。由于是HAL库,在之前建立工程的过程中我们已将引脚GPIO全都配置好了,所以我们只需要写出点灯代码即可。

在HAL库中,同样也有端口高低电平控制函数以及延时函数,这些已经都配置好了,我们调用即可。

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);//写入高低电平
__weak void HAL_Delay(uint32_t Delay)//延时函数

那么我们打开keil工程,在主函数的while循环中填入以下代码

        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
		HAL_Delay(1000);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
		HAL_Delay(1000);//延时1s		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
		HAL_Delay(1000);//延时1s
	    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);//
		HAL_Delay(1000);//延时1s

通过不断调用 HAL_GPIO_WritePin函数,不断改变对应引脚的电平值。

将程序编译烧入板中得到效果如下

在keil里,可以通过软件自带的Debug调试查看端口输出波形。具体调试步骤请看上一篇博客

https://blog.csdn.net/Constellation_zZ/article/details/133772104

这里只展示输出波形

在这里插入图片描述
可以看到,引脚端口变化都是连续的,且低电平持续时间都为一秒。
在这里插入图片描述

4.2 手动控制流水灯

要求用一根导线模拟开关,高电平时流水灯工作,低电平时停止工作。

本次实验打算使用中断函数实现人为控制。中断功能是STM32单片机的功能之一。当内部或外设触发中断时,系统将自动执行中断函数内的内容,并结束后继续执行程序。

我们设置一个引脚为中断模式,规定当该引脚为高电平时触发中断,STM32CubeMX中进行设置。

点开”GPIO",选择PA8引脚,选择EXTI模式。
在这里插入图片描述

然后再点开“NVIC",在EXTI[9:5]处勾上使能
在这里插入图片描述

更新代码,打开工程

在工程的左边的文件里,点击“Drivers/STM32F1XX_HAL_Driver"分组内找到”stm32f1xx_hal_gpio.c"文件,拉到最后,找到这个函数

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

这就是中断函数,我们需要在里面写控制流水灯的程序

写入以下程序

int i=0;
	if(GPIO_Pin==GPIO_PIN_8)//读取PA8电平
	{
		GPIO_PinState State=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8);//写入PA8电平
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_All,GPIO_PIN_SET);
		
	if (State==GPIO_PIN_SET) {//如果是高电平,进行流水灯
		 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
			for(i=0;i<1000000;i++)//用for循环代替延时函数
		{
			
		}
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
		for(i=0;i<1000000;i++)
		{
			
		}
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//
			for(i=0;i<1000000;i++)
		{
			
		}
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);//
			for(i=0;i<1000000;i++)
		{
			
		}
				
		
	}
	 else if(State==GPIO_PIN_RESET)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_All,GPIO_PIN_SET);
		
		
	}
		
		

主函数可以不用管,只需要等待中断就可以了

烧录结果如下
在这里插入图片描述

五、总结

总体来看,HAL库可以通过STM32CubeMX软件进行端口配置,模式选择等功能,编程时不再需要自己手动导入启动文件,头文件,配置文件等,更加适合新手入门学习STM32单片机,但是如果要搞清楚具体的函数参数以及功能,更快找到想要调用的函数,还是了解标准库更加清楚一些。总结就是HAL库好上手,标准库易于提升。

六、参考

[1]. https://blog.csdn.net/qq_25218501/article/details/131346201

[2]. https://blog.csdn.net/weixin_46129506/article/details/120780184

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值