STM32按键外部中断控制LED流水灯-HAL库

该博客介绍了如何在基于HAL库的32位微控制器流水灯项目中添加按键中断功能。通过在硬件上增加一个四角按键和开关,然后在CubeMX中配置GPIO中断,使用上升沿触发。在代码调试部分,博主展示了如何编写中断处理函数,实现按键按下的消抖和状态切换,进而控制流水灯的流向(从左到右或从右到左)。此外,还提供了全局变量和主循环中的switch-case结构来实现灯效控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

续上一篇《基于HAL库的32流水灯》http://t.csdn.cn/30QT4

一、硬件选用上,我们增加一个四角按键

二、原理图设计,上也增加一个开关

LED0-LED2 --------> PA0-PA2引脚

KEY1 ---------> PA3引脚

 

 三、CubeMX的设置

 在上一篇《基于HAL库的32流水灯》http://t.csdn.cn/30QT4  的基础上,在GPIO设置里增加一个按键的设置

1、我们选择上升沿触发外部中断、没有上下拉

2、在NVIC中开启EXTI3外部中断,并设置中断的响应优先级。并生成工程文件

四、代码调试

生成Keil5工程文件后,先编译一下

打开stm32f1xx_it.h,找到void EXTI3_IRQHandler(void);这就是外部中断Line3的中断处理函数

我们右键Go To Denifition Of void EXTI3_IRQHandler,可以在stm32f1xx_it.c中看到如下代码

然后再右键HAL_GPIO_EXTI_IRQHandler;和前面一样GO To一下,就会到stm32f1xx_hal_gpio.c

然后我们需要调用的就是这个一行代码,在这个函数声明前有一个__weak声明

这个声明表示这个函数一旦被重新声明,那这里的函数就自动失效,其他函数调用的时候就会找到你新定义的同名函数

然后我们就在main.c中来调用这行代码

/* USER CODE BEGIN 4 */
// 中断触发后,进入此函数,此函数称为回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  // 回调函数
{
	if(GPIO_Pin == KEY1_Pin)//确定是否是KEY1键按下
	{
	   for(long i =1; i<72000;i++)//消抖
		{}
			n=!n;//逻辑非 0或者1
	}
}
/* USER CODE END 4 */

main.c

我们需要在开头给它定义一个全局变量

/* USER CODE BEGIN PM */
uint8_t n; //定义全局变量
/* USER CODE END PM */

在while循环中写入这串代码,最终我们就可以实现按键中断控制流水灯了~

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);  // 灯1亮
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // 灯2灭
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);  // 灯3灭
//		HAL_Delay(250); // 延时
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);  // 灯2灭
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);  // 灯3灭
//		HAL_Delay(250); // 延时
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // 灯2灭
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);  // 灯3灭
//		HAL_Delay(250); // 延时

	switch(n)
	{
    case 0:
	       {
                //从左到右亮
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,1);//写高电平,点亮第1个LED
				HAL_Delay(1000);//延时1000毫秒
			    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,0);
						
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,1);
				HAL_Delay(1000);//延时1000毫秒
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,0);
						
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,1);
				HAL_Delay(1000);//延时1000毫秒
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,0);
			 break;
			}
		case 1:   
			 {
                 //从右到左亮
			 	 HAL_GPIO_WritePin(GPIOA,LED2_Pin,1);//写高电平,点亮第1个LED
			     HAL_Delay(1000);//延时1000毫秒
				 HAL_GPIO_WritePin(GPIOA,LED2_Pin,0);
						
			     HAL_GPIO_WritePin(GPIOA,LED1_Pin,1);
				 HAL_Delay(1000);//延时1000毫秒
				 HAL_GPIO_WritePin(GPIOA,LED1_Pin,0);
						
				 HAL_GPIO_WritePin(GPIOA,LED0_Pin,1);
				 HAL_Delay(1000);//延时1000毫秒
				 HAL_GPIO_WritePin(GPIOA,LED0_Pin,0);
			  break;
		      }
		default:
			{
				break;
			}
  }
}
  /* USER CODE END 3 */

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值