🔬 实验13:定时器——定时功能

📌 实验目标
  • 掌握通用定时器的定时中断配置
  • 学会计算定时器的 PSC 和 ARR 参数
  • 实现精确定时中断控制 LED 闪烁

一、实验内容

  1. 配置通用定时器 TIM3 为定时模式
  2. 设置预分频器 PSC 和自动重装寄存器 ARR
  3. 使能定时器更新中断
  4. 在定时器中断服务函数中翻转 LED

二、定时器计算

定时器时钟:APB1(36MHz)预分频≠1时翻倍 → TIM2-7 时钟=72MHz
设 PSC=7199, ARR=999 → 72M/(7200×1000)=10Hz → 100ms

TIM3 100ms 定时中断
void TIM3_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM_TimeBaseStructure.TIM_Period = 999;        // ARR
    TIM_TimeBaseStructure.TIM_Prescaler = 7199;    // PSC
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM3, ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        GPIO_ToggleBits(GPIOB, GPIO_Pin_0);
    }
}
💡 这段代码怎么用?
  1. 定时器做「精确延时」比软件空循环可靠得多——72MHz 下空循环延时不准且与编译优化相关
  2. 想改定时时长,套公式 T = (ARR+1)×(PSC+1)/72MHz:例如要 500ms,可令 ARR=4999、PSC=7199
  3. 别忘了在 main() 最前面调用 NVIC_PriorityGroupConfig() 设置中断分组(全局只设一次)

三、参考资料

资料文件
定时器 PPT实验六 定时器-定时功能.pptx
实验指导文档实验6 定时器-定时功能.docx