【stm32外部中断模式控制流水灯】

本文详细描述了如何通过STMCube配置STM32F1xx的GPIO引脚和EXTI中断,以及在KEil中编写和烧录代码,实现外部中断控制A4流水灯的亮灭功能。

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

一丶通过STMCube配置项目

1、引脚配置如图

A4输出控制灯的亮灭,设置为GPIO_Output
A1持续输出高电平,设置同上
A7持续输出低电平,设置同上
C13设置同上
B5模拟开关,设置为GPIO_EXTI5
在这里插入图片描述

2、配置EXIT

在这里插入图片描述

3、配置SYS

在这里插入图片描述

4、配置RCC

在这里插入图片描述

4、配置GPIO

把A1配置为高电平、A7配置为低电平
把B5中断配置为上升沿和下降沿都触发
在这里插入图片描述
在这里插入图片描述

5、项目配置

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

6、创建项目

在这里插入图片描述

二、通过KEil配置代码

1打开生成的项目,找到stm32f1xx_it.c

在这里插入图片描述

2、找到EXTI9_5_IRQHandler这个函数,选中HAL_GPIO_EXTI_IRQHandler这个语句按F12跳到该函数

在这里插入图片描述

3、往下找到HAL_GPIO_EXTI_Callback这个函数

该函数是给用户自己重写的,可以在这里根据不同的中断来执行不同的处理。在这里我们需要根据B5的不同中断来实现A4的亮灭。
在这里插入图片描述
把HAL_GPIO_EXTI_Callback函数用下面函数代替

 void Delay()
 {
   long i=0;
   for(;i<1000000;i++);
 }
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)
        {
			HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_RESET);//把A4变为低电位
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  
	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_RESET);
   
        }
		else
		{
		 while (1)
{
 
    

    
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);  
	    Delay(); // 延时1s
		     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); 
	    Delay(); // 延时1s
		    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);

        
	HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_SET);
    Delay(); // 延时1s
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	if(pinState==GPIO_PIN_RESET)
		break;
}
}
	}}

注意要在main.c文件里定义

#define LED_A4_Pin GPIO_PIN_4
#define LED_A4_GPIO_Port GPIOA
#define SWITCH_Pin GPIO_PIN_5
#define SWITCH_GPIO_Port GPIOB
#define SWITCH_EXTI_IRQn EXTI9_5_IRQn

并要在stm32f1xx_hel.gpio.c里包含main.c文件

4、编译生成hex文件

在这里插入图片描述

5、烧录

在这里插入图片描述

三、结果

在这里插入图片描述

四、总结

通过配置外部中断引脚、初始化外部中断、编写中断处理函数和启用外部中断,可以实现使用外部中断模式控制流水灯的功能。

### 实现 STM32 外部中断控制 LED 流水灯 #### 配置硬件资源 为了实现外部中断触发LED流水灯效果,在STM32CubeMX中配置GPIO端口用于连接LED和按键。通常情况下,会选用PA0作为外部中断输入引脚,并设置为EXTI Line 0模式;而多个GPIO可以用来驱动不同颜色或位置的LED。 对于具体的外设初始化部分,可以通过STM32CubeMX自动生成代码来简化这一过程[^1]。 #### 编写软件程序 下面是一个简单的例子展示如何利用外部中断(假设使用的是PA0)去启动/暂停一个循环点亮一系列LED的过程: ```c #include "main.h" #define LED_PORT GPIOA #define BUTTON_PIN GPIO_PIN_0 #define LED_PINS (GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7) volatile uint8_t led_state = 0; volatile int direction = 1; void SystemClock_Config(void); static void MX_GPIO_Init(void); // 中断服务函数声明 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { if(led_state != 0){ // 清除当前状态下的所有LED HAL_GPIO_WritePin(LED_PORT, LED_PINS, GPIO_PIN_RESET); // 设置下一个要亮起的LED HAL_GPIO_WritePin(LED_PORT, (uint32_t)(1 << (4 + led_state)), GPIO_PIN_SET); // 更新下一次应该操作哪个LED以及方向 led_state += direction; if ((direction > 0 && led_state >= 3) || (direction < 0 && led_state <= 0)) { direction *= -1; // 反转流动方向 } HAL_Delay(500); // 延迟一段时间让肉眼可见变化 }else{ HAL_Delay(100); } } } /** * @brief EXTI line detection callbacks. */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == BUTTON_PIN){ // 切换LED流动的状态 led_state = !led_state ? 1 : 0; } } ``` 上述代码实现了当按下按钮时切换LED流水灯的工作状态——即从静止到开始流动或者反之亦然。这里`HAL_GPIO_EXTI_Callback()`函数是在检测到有下降沿事件发生于指定管脚上之后被调用的回调函数,它负责改变全局变量`led_state`从而影响主循环中的行为[^2]。 #### 运行结果说明 一旦完成编译并下载至目标板卡后,每当用户按压与PA0相连的开关时,将会观察到如下现象之一: - 如果之前没有任何LED处于点亮状态,则现在会有第一个LED被激活; - 若已经有某个LED正在发光,则整个序列将继续按照设定的时间间隔依次前进直到最后一个再返回起点形成往复运动; - 当再次按下同一按钮时,所有的LED都将熄灭并且停止任何进一步的动作直至下次触发中断为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值