🔬 实验13:定时器——定时功能
📌 实验目标
- 掌握通用定时器的定时中断配置
- 学会计算定时器的 PSC 和 ARR 参数
- 实现精确定时中断控制 LED 闪烁
一、实验内容
- 配置通用定时器 TIM3 为定时模式
- 设置预分频器 PSC 和自动重装寄存器 ARR
- 使能定时器更新中断
- 在定时器中断服务函数中翻转 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);
}
}
💡 这段代码怎么用?
- 定时器做「精确延时」比软件空循环可靠得多——72MHz 下空循环延时不准且与编译优化相关
- 想改定时时长,套公式
T = (ARR+1)×(PSC+1)/72MHz:例如要 500ms,可令 ARR=4999、PSC=7199 - 别忘了在
main()最前面调用NVIC_PriorityGroupConfig()设置中断分组(全局只设一次)
三、参考资料
| 资料 | 文件 |
|---|---|
| 定时器 PPT | 实验六 定时器-定时功能.pptx |
| 实验指导文档 | 实验6 定时器-定时功能.docx |