用stm32f103实现定时中断,c语言写,上电之后红灯和绿灯频闪,按一个键后红灯常亮绿灯频闪,5s后恢复红绿灯频闪状态,按另一个键绿灯常亮红灯频闪,5s后恢复红绿灯频闪状态
时间: 2024-12-20 14:23:46 浏览: 6
2020-11-20LED闪烁_STM32F103RCT6简易频闪灯_
在STM32F103中实现定时中断功能,首先你需要设置好GPIO配置、定时器初始化和中断服务函数。以下是简化的步骤:
1. **GPIO初始化**:
- 配置两个LED(通常用PA8和PB6代表红绿灯)作为输出,上电默认设置为输入模式等待按键信号。
- 配置定时器(如TIM1或TIM2),使用IT(Interrupt Timer)功能。
```c
void GPIO_Init(void) {
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_6; // 红绿灯对应的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode Outs; // 输出模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化红灯GPIO
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化绿灯GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 按键引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 输入浮空模式,用于检测按键
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化按键GPIO
}
```
2. **定时器配置**:
使用定时器预设值和溢出中断,周期性地改变LED的状态。
```c
void TIM_Config(void) {
TIM_TimeBaseInitTypeDef.TIM_Period = (prescaler * period); // 预设计数值
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct); // 初始化定时器1
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 开启溢出中断
TIM_Cmd(TIM1, ENABLE); // 启动定时器
}
```
3. **中断处理函数**:
- 中断发生时,通过判断当前状态改变LED颜色。
- 检测按键按下,改变LED状态并启动延时。
```c
void TIM_IRQHandler(void) {
if (TIM_GetITStatus(TIM1, TIM_IT_Update)) { // 判断是否是溢出中断
if (current_state == STATE_FLASH) {
toggle_LED(PIN_RED); // 红绿灯切换
} else { // 当前状态为保持
toggle_LED(PIN_GREEN);
}
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); // 清除中断标志
}
if (GPIO_ReadInputDataBit(GPIOA, KEY_PIN) == SET) { // 检查按键
current_state = !current_state; // 状态反转
if (current_state) {
TIM_Config(); // 切换到保持状态,设置定时器
}
}
}
static void toggle_LED(uint8_t pin) {
GPIO_SetBits(GPIOA, pin); // 灯亮
HAL_Delay(delay_time);
GPIO_ResetBits(GPIOA, pin); // 灯灭
}
```
4. **延时函数**:
这里假设`HAL_Delay`用于实现5秒延迟。
最后别忘了开启系统中断和安装中断向量表。记得检查`pin_red`、`pin_green`、`KEY_PIN`、`prescaler`、`period`、`delay_time`等宏定义的实际值。
阅读全文