stm32外部中断模式控制LED流水灯工作

了解并掌握STM32中断原理,HAL库函数开发方法,用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作,接低电平时,LED流水灯停止工作。



一、问题重现

提出的问题:用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。通过HAL库方式采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作!

解决方案:利用PA4、PB15和PC14作为流水灯的三个GPIO口(本文设置的GPIO口输出低电平的时候LED灯亮),利用PA9来作为外部中断控制流水灯的工作,在PA9处接一个开关,按下导通,松手断开

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

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

参考我的上篇博客:

stm32cubeMX使用HAL库点亮LED流水灯

三、利用HAL库新建一个keil5工程

(1)打开STM32CubeMX,在主界面点击:ACCESS TO MCU SELECTOR:
在这里插入图片描述

(2)选择的单片机型号以及点击开始工程项目:
在这里插入图片描述

(3)点击system core,进入SYS,在debug下选择serial wire:
在这里插入图片描述

(4)配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,将hse那里设为Crystal/Ceramic Resonator:

在这里插入图片描述

(5)进入GPIO选择引脚 并且配置其工作模式:

我这里一共选择了三个GPIO:PA4,PB14,PC15设置为了GPIO_output;以及一个PA9设置为外部中断源:
在这里插入图片描述

(6)在GPIO这个界面里面点击PA9,对PA9的进行中断配置:
在这里插入图片描述

(7)NVIC中断优先级配置,点击NVIC,进入其中,按照图示步骤进行操作:在这里插入图片描述
(8)进入CLK Configuration (时钟配置)中,进行时钟配置:
在这里插入图片描述

(9)进入Project Manager(工程管理),进行工程设置点击生成工程与代码:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、完善keil5工程

(1)首先,点击刚刚生成的keil5工程文件,双击main.c文件,然后再main.c中找到图示框住的函数:
在这里插入图片描述
接着右击此函数,进入其定义的地方处:
在这里插入图片描述
(2)将图中框住的部分改为SET即可:此步骤是将这三个GPIO口设置为高电平,均不初始时不亮!
在这里插入图片描述

(3)回到main.c文件中,在main函数上方进行编写一个中断函数HAL_GPIO_EXTI_Callback()以及自定义一个中断的标识符号flag:

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

(4)接着写一个测试函数test()

void test()
{
	if(flag==1)
	  {
		  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);//PB14熄灯
		  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
		  HAL_Delay(100);//延时0.1s
	    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);//PB14亮灯
		  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
		  HAL_Delay(100);//延时0.1s		
	    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);//PB14熄灯
		  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
		  HAL_Delay(100);//延时0.1s
	  }
	  else if(flag==0)
	  {
          HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA0熄灯
          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);//PA1熄灯
					HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PA2熄灯
	  }
}

五、电路连接与烧录运行

1、电路连接:
ST_Link与单片机的连接,如下图所示:
在这里插入图片描述

2、烧录与运行:

流水灯(按键控制)


六、总结

这个任务是利用STM32F103的GPIO外部中断功能来实现按键控制LED流水灯的效果:

1、硬件连接:

将开关一端接地,另一端接GPIOA某一管脚(比如PA0)
将LED接在STM32的其他GPIO管脚上(比如PB0-PB7)
2、软件配置:

配置GPIOA某一管脚为输入模式,开启下降沿触发中断

配置LED对应的GPIO为输出模式

配置NVIC,使能GPIOA中断线

编写GPIO外部中断服务函数

在函数内读取开关管脚电平

如果为高电平,开始流水显示LED效果

如果为低电平,关闭LED显示

3、主函数循环中:

初始化GPIO、LED和中断配置

开启全局中断

循环等待

4、按下开关后,会产生下降沿中断

进入中断服务函数

判断开关状态,控制LED显示

5、松开开关后,再次产生下降沿中断,关闭LED显示

通过GPIO外部中断,可以实现开关按下时控制LED流水显示,松开时关闭的功能。中断响应速度快,满足实时性要求。

参考

STM32基于HAL库的中断控制LED流水灯

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菲菲QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值