stm32 f103中断控制流水灯
时间: 2025-05-17 17:13:22 浏览: 16
### 实现 STM32F103 中断驱动的流水灯功能
在嵌入式开发中,利用中断机制可以提高系统的实时性和效率。对于 STM32F103 来说,可以通过配置定时器中断来实现流水灯的功能。以下是详细的说明以及代码示例。
#### 定时器中断原理
STM32 的定时器模块支持多种工作模式,其中最基本的模式之一就是自动重装载计数器模式。当计数值达到设定的最大值时,会产生一个更新事件,并触发相应的中断服务函数。这种特性非常适合用于周期性的任务调度,比如控制 LED 的亮灭状态[^4]。
#### 硬件准备
假设使用的是 STM32F103C8T6 芯片,其具有多个 GPIO 引脚可供选择作为输出端口连接外部 LEDs。为了简化讨论,我们假定 PA5~PA7 这三个引脚分别接有三个独立的小功率红色发光二极管(LED),并通过限流电阻接地形成简单电路结构[^1]。
#### 软件设置步骤概述
- **初始化 RCC (Reset and Clock Control)**
启用相关外设时钟源以便后续操作能够正常运行。
- **配置 GPIO**
将指定针脚定义成数字输出类型,默认处于低电平关闭状态。
- **启动 TIMx 并绑定回调处理逻辑**
设置好预分频系数及时基单位长度之后开启对应实例;与此同时编写响应动作的具体流程——即改变当前显示图案并延迟一定时间后再切换至下一个样式直至遍历完毕重新回到初始位置为止[^2].
下面是具体的实现代码:
```c
#include "stm32f10x.h"
void delay_ms(uint32_t ms); // 延迟函数声明
int main(void){
uint8_t led_state = 0b001;
/* 初始化RCC */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
/* 配置GPIO*/
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
/* 初始化TIM2 */
TIM_TimeBaseInitTypeDef timer_init_structure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE );
timer_init_structure.TIM_Period=999;//ARR value
timer_init_structure.TIM_Prescaler=(SystemCoreClock/1000)-1 ;//PSC value for ~1ms tick
timer_init_structure.TIM_ClockDivision(TIM_CKD_DIV1);
timer_init_structure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&timer_init_structure);
NVIC_InitTypeDef nvic_struct;
nvic_struct.NVIC_IRQChannel = TIM2_IRQn;
nvic_struct.NVIC_IRQChannelPreemptionPriority = 0;
nvic_struct.NVIC_IRQChannelSubPriority = 0;
nvic_struct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_struct);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
TIM_Cmd(TIM2,ENABLE );
while(1){}
}
void TIM2_IRQHandler(){
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET ){
static uint8_t pattern[] ={0b001,0b010,0b100};
static int index=0;
GPIO_ResetBits(GPIOA,pattern[(index+2)%3]);
GPIO_SetBits(GPIOA,pattern[index++%3]);
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
```
上述代码片段展示了如何通过 TIM2 的溢出中断来不断轮询不同的 LED 显示组合从而达成动态变化的目的。每次进入 ISR(Interrupt Service Routine),都会依据预定好的顺序调整哪些 LED 应该被激活或者熄灭[^3]。
---
###
阅读全文
相关推荐


















