stm32外部中断控制流水灯速度
时间: 2025-04-26 19:05:21 浏览: 32
### 实现思路
为了通过STM32的外部中断来控制流水灯的速度,在硬件设计方面选择了四角按键作为触发源[^1]。每当按下此按钮时,会触发一次外部中断事件,进而改变流水灯运行的时间间隔。
### 初始化配置
在初始化阶段,除了常规设置外还需要特别注意对外部中断线及相关GPIO端口进行适当配置:
```c
// 配置EXTI Line检测上升沿触发模式
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启PA端口时钟
Button.GPIO_Pin = GPIO_PIN_0;
Button.GPIO_Mode = GPIO_MODE_IT_RISING; // 上升沿触发
Button.GPIO_Speed = GPIO_SPEED_FREQ_HIGH;
Button.GPIO_PuPd = GPIO_NOPULL;
// 注册回调函数并使能全局中断
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
// 设置按键对应的EXTI线路
HAL_EXTI_GetHandle(&hexti, EXTI_LINE_0);
```
### 中断服务程序编写
当发生按键按压动作时,将调用预先定义好的中断处理函数`void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)`,在此处可以调整延时变量从而影响到后续循环中的延迟时间长度,以此达到调节灯光流动速率的效果:
```c
uint8_t delay_time = 500; // 初始延时时长(ms)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_0){
static uint8_t flag=0;
/* 每次点击切换flag状态 */
flag=!flag;
/* 根据flag值修改delay_time*/
if(flag==1){
delay_time=200;// 加快速度
}else{
delay_time=800;// 减慢速度
}
}
}
```
### 主循环逻辑更新
最后,在主循环里利用之前设定好的`delay_time`参数来进行等待操作,使得每次点亮下一个LED前都有相应的暂停间隙,形成连续变化效果的同时也实现了由外部输入信号间接操控整体动画节奏的目的。
```c
while (1) {
for(int i=0;i<NUM_OF_LEDS;i++){
LED_ON(i);
HAL_Delay(delay_time);
LED_OFF(i);
}
}
```
阅读全文
相关推荐


















