使用STM32F103标准库实现用TIM2定时器中断控制流水灯为一秒闪烁一次,三次之后流水灯熄灭的代码
时间: 2024-02-24 15:00:18 浏览: 79
Proteus仿真STM32定时器TIM2与中断来控制流水灯的定时闪烁。
好的,很高兴为您解答这个问题。以下是实现该功能的代码:
```c
#include "stm32f10x.h"
void TIM2_IRQHandler(void)
{
static uint8_t count = 0;
// 清除定时器中断标志
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
// 点亮流水灯
GPIO_SetBits(GPIOB, GPIO_Pin_5 << count);
// 延时一段时间
for (volatile int i = 0; i < 500000; i++);
// 熄灭流水灯
GPIO_ResetBits(GPIOB, GPIO_Pin_5 << count);
// 更新计数器
count = (count + 1) % 3;
if (count == 0)
{
// 流水灯已经闪烁了三次,停止定时器
TIM_Cmd(TIM2, DISABLE);
}
}
int main(void)
{
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 使能定时器中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
// 启动定时器
TIM_Cmd(TIM2, ENABLE);
while (1);
}
```
在上面的代码中,我们使用了 TIM2 定时器以及 GPIOB 的 5、6、7 三个引脚来控制流水灯的闪烁。代码中的 `TIM2_IRQHandler` 函数是定时器中断处理函数,每次定时器中断时会执行其中的代码。
在 `TIM2_IRQHandler` 函数中,我们使用了一个静态变量 `count` 来记录流水灯的状态。每次定时器中断时,我们会点亮当前的 LED 引脚,然后经过一段延时后熄灭该引脚,并更新 `count` 的值。当 `count` 的值为 0 时,表示流水灯已经闪烁了三次,此时我们会停止定时器。
在 `main` 函数中,我们首先启用了 GPIOB 和 TIM2 的时钟。接着,我们配置了 GPIOB 的 5、6、7 引脚为输出模式,并配置了 TIM2 的计数器周期和预分频器,以及使能了定时器中断。最后,我们启动了定时器,并进入了一个死循环,等待定时器中断的触发。
阅读全文