STM32CubeMX 基于HAL库和中断的LED流水灯

一、搭建STM32开发环境(HAL库环境)

1、安装STM32CubeMX

1.1、下载STM32CubeMX:

官网下载地址:

https://www.st.com/en/development-tools/stm32cubemx.html

(1)进入官网下载STM32CubeMX软件:
在这里插入图片描述
(2)根据自己的电脑操作系统进行选择合适的软件包以及选择软件包的版本号:
在这里插入图片描述
(3)点击ACCEPT:
在这里插入图片描述

(4)下载完成:
在这里插入图片描述

1.2、安装STM32CubeMX:

(1)双击刚刚下载的STM32CubeMX包,打开如下界面,接着点击next:
在这里插入图片描述
(2)接着点击accep和next:
在这里插入图片描述
(3)接着勾选和next:
在这里插入图片描述
(4)点击第一步选择安装路径,接着点击next:
在这里插入图片描述
(5)点击next:
在这里插入图片描述
(6)安装完成后,选择Next:
在这里插入图片描述

2、配置STM32CubeMX:安装HAL库

(1)点击打开刚刚安装好的STM32CubeMX软件
在这里插入图片描述
(2)点击help,再点击Updater Settings:
在这里插入图片描述
(3)按照图示步骤进行:
在这里插入图片描述
(4)按照图示进行1与2步骤:
在这里插入图片描述
(5)按照图示三步骤进行安装自己想要安装的HAL库版本号:
在这里插入图片描述
(6)弹出登录错误,要求登录下载,点击OK
在这里插入图片描述
(7)在弹出的界面选择登录或者注册,我已注册过,所以跳过
(8)重新下载一遍刚刚选择的hal库版本
在这里插入图片描述

二、利用HAL库新建keil5工程

1、创建keil5工程

(1)打开STM32CubeMX,在主界面点击:ACCESS TO MCU SELECTOR:
在这里插入图片描述
(2)选择的单片机型号以及点击开始工程项目:
在这里插入图片描述
(3)点击system core,进入SYS,在debug下选择serial wire:
在这里插入图片描述
(4)配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,将hse那里设为Crystal/Ceramic Resonator:
在这里插入图片描述
(5)打开时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上。我们要用是GPIO接口,而这些接口都在APB2里:
在这里插入图片描述
(6)进入GPIO选择引脚 并且配置其工作模式:点击相应的引脚设置输出寄存器了,就是GPIO_output那一项
在这里插入图片描述选择三个GPIO:PA0,PA1,PA2,均设置为了GPIO_output:
在这里插入图片描述
(7)点击Project Manager,接着点击Code Grenerator,勾选上第三步的那一个选项:
在这里插入图片描述
(8) 点击Project Manager,接着点击Project,开始给项目取名字;选择存放位置;选择MDK-ARM,最后点击图示第五步生成项目:
在这里插入图片描述
(9)点击Open Project打开项目(keil工程):
在这里插入图片描述
(10)打开main.c文件,滑倒主函数那一部分,图中所圈住的main函数:
在这里插入图片描述
(11)在主函数while(1)循环中写入下列代码:

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA0亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//PA1亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
HAL_Delay(1000);//延时1s		
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2亮灯
HAL_Delay(1000);//延时1s

2、keil5查看仿真波形图

在这里插入图片描述
我这里选择的引脚仿真波形对应的颜色为:

PA0——红色;

PA1——绿色;

PA2——蓝色;
在这里插入图片描述

3、结果演示

在这里插入图片描述

4、proteus仿真

(1)电路图
在这里插入图片描述
(2)双击stm32,传入hex文件
在这里插入图片描述
(3)按以下框出部分一次点击,进行仿真
在这里插入图片描述
(4)仿真结果
在这里插入图片描述

三、采用中断模式编程控制LED流水灯工作

1、什么是中断,中断有什么作用

中断是指CPU在执行当前程序时系统出现了某种状况,使得CPU必须停止当前程序,而去执行另一段程序来处理的出现的紧急事务,处理结束后CPU再返回到原先暂停的程序继续执行,这个过程就称为中断。
使得计算机系统具备应对对处理突发事件的能力,使其能及时响应紧急事件。
提高处理器效率,如果没有中断系统,CPU就只能按照原来的程序编写的先后顺序,对各个外设进行查询和处理,即轮询工作方式,轮询方法貌似公平,但实际工作效率却很低。
这里仅做简单介绍,具体的可自行查找。

2、项目创建

在第一个LED流水灯的基础上,我们还需要进行以下配置
1、除以上三个引脚,我们还需要在选一个引脚,作为中断的触发这里选用PB5
具体操作如下图
在这里插入图片描述
在这里插入图片描述

(2)时钟配置

在这里插入图片描述

(3)NVIC配置
在这里插入图片描述
在这里插入图片描述

2、通过Keil配置代码

(1)在main函数上写入

uint32_t sign=0;//自定义中断标识符号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
  if(GPIO_Pin == SWITCH_Pin){
      //获取B5的电位
     GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
 
      //高电位
      if(pinState==GPIO_PIN_SET)//PB5高电位流水灯亮
      {
		  sign=1;
	  }
      //低电位
      else if(pinState==GPIO_PIN_RESET)//PB5低电位流水灯灭
	  {
		  sign=0;//PB5低电位标识
	  }
      } 
   }

在这里插入图片描述
(2)在while循环中

switch(sign)
		{
			case 0:
			{
					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_Delay(500);
				if(sign==1)
				{	
				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);
				   break;
				}
				
			  	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_Delay(500);
				if(sign==1)
				{	
				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);
				   break;
				}
				
				  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_Delay(500);
			}
			
		
			case 1:
		
			{
				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);
				break;
			}

		}

在这里插入图片描述

3、运行结果

在这里插入图片描述

4、proteus仿真

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

四、gitee(码云)的注册和代码储存

1.Gitee的注册
首先进入网站:点击注册键
在这里插入图片描述
2. Gitee环境配置
参考https://blog.youkuaiyun.com/a6667778884554/article/details/144156163
此篇csdn完成
传输好后
在这里插入图片描述

五、实验心得

在基于HAL库和中断的LED流水灯开发中,HAL库简化了流程,特别是HAL_GPIO_Init函数简化了GPIO配置。通过定时器中断控制流水灯,我深入理解了中断机制。STM32CubeMX的调试功能提升了调试效率,同时项目让我体会到硬件与软件结合的重要性,为后续学习实时操作系统打下基础。

在Gitee的使用上,版本控制功能对个人项目回溯和团队项目协作都大有裨益,同时提供了代码备份与安全。Gitee操作简便,分支管理功能使项目开发条理清晰。

总之,这次经历让我在嵌入式开发和代码管理方面显著进步,培养了问题解决与团队合作能力,我将继续努力迎接挑战。

文章参考
https://blog.youkuaiyun.com/m0_63323712/article/details/133955273?spm=1001.2014.3001.5502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值