STM32定时器的配置原理和步骤

📅 2026/7/12 1:46:09
STM32定时器的配置原理和步骤
【步骤1】声明配置结构体TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;作用定义一个“时基配置结构体”变量用于存放定时器的周期、分频、计数模式等参数。实质这是一个局部变量稍后会把各项参数填进去最后一次性写入定时器的寄存器中。NVIC_InitTypeDef NVIC_InitStructure;作用定义一个“中断优先级配置结构体”变量用于存放 TIM3 中断的优先级和使能状态。【步骤2】开启 TIM3 外设时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);作用开启 TIM3 的时钟。实质TIM3 挂载在 APB1 总线上必须通过这句将它的时钟门控打开后续对 TIM3 寄存器的读写才有效。若省略此句所有后续操作都无效代码会卡死或触发硬错误。【步骤3】配置时基参数TIM_TimeBaseStructure.TIM_Period arr;作用设置自动重装载值ARR。实质这是定时器计数的“上限”。计数器从 0 递增到 arr 时产生更新事件溢出然后归零重新开始。周期公式溢出周期 (arr 1) × (psc 1) / TIM3时钟频率。TIM_TimeBaseStructure.TIM_Prescaler psc;作用设置预分频系数PSC。实质将 TIM3 的输入时钟通常为 72MHz进行分频得到计数器的实际时钟。计数时钟 72MHz / (psc 1)。例如 psc 7199则计数时钟为 72MHz / 7200 10kHz。TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1;作用设置时钟分割因子用于数字滤波器的采样时钟。实质TIM_CKD_DIV1 表示不分频tDTS tCK_INT。它不影响定时器的溢出周期只影响输入捕获/编码器模式下的滤波精度。常规中断/PWM场景保持此值即可。TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up;作用设置计数器的计数方向为向上计数。实质计数器从 0 递增到 arr 后溢出然后归零重新计数。这是最常用的模式。TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure);作用将上述所有时基参数一次性写入 TIM3 的硬件寄存器。实质该函数内部会把 arr、psc、ClockDivision、CounterMode 分别写入 TIM3-ARR、TIM3-PSC、TIM3-CR1 等寄存器。调用此句后定时器的时基才算真正配置完成。【步骤4】清除更新中断标志TIM_ClearITPendingBit(TIM3, TIM_IT_Update);作用清除 TIM3 的更新中断挂起标志。实质在使能中断之前先清除可能因复位或之前操作残留的更新标志防止使能中断后立即误触发中断服务程序。【步骤5】使能更新中断TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);作用使能 TIM3 的更新中断即溢出中断。实质当计数器溢出时硬件会自动置位更新标志并触发中断请求。但此时 CPU 能否响应还要看 NVIC 中是否使能了 TIM3 中断。【步骤6】配置 NVIC 中断优先级NVIC_InitStructure.NVIC_IRQChannel TIM3_IRQn;作用选择 TIM3 的中断通道。实质告诉 NVIC要配置的是 TIM3 全局中断TIM3_IRQn。NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0;作用设置抢占优先级为 0最高级。实质数值越小优先级越高。抢占优先级为 0 意味着它可以打断所有比它数值大的中断。注意如果你在 TIM3 中断里调用了 FreeRTOS 的 FromISR 函数此处建议改为 5 或以上数值大逻辑优先级低否则会破坏 RTOS 临界区导致死机。NVIC_InitStructure.NVIC_IRQChannelSubPriority 3;作用设置子优先级为 3。实质子优先级仅当两个中断的抢占优先级相同时才起作用。此处虽然设了 3但抢占优先级不同时子优先级无效。如果抢占优先级为 5此处填 0 即可。NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;作用使能 NVIC 中 TIM3 的中断响应。实质如果设为 DISABLE即使定时器溢出产生中断请求CPU 也不会响应。NVIC_Init(NVIC_InitStructure);作用将上述 NVIC 配置写入硬件寄存器。实质执行后TIM3 中断才算真正在 NVIC 层面生效。【步骤7】启动定时器计数【步骤7】启动定时器计数TIM_Cmd(TIM3, ENABLE);作用使能 TIM3 的计数器开始计数。实质将 TIM3 控制寄存器 CR1 的 CENCounter Enable位置 1。至此定时器开始从 0 递增当计数到 arr 时产生溢出中断。 执行顺序的因果关系逻辑链条开时钟 → 才能访问寄存器。填时基结构体并初始化 → 告诉定时器“多久溢出一次”。清中断标志 使能中断 → 告诉定时器“溢出时要给 CPU 发请求”。配置 NVIC → 告诉 CPU“收到请求后按照这个优先级去响应”。启动计数器 → 定时器真正跑起来进入循环溢出-中断-再溢出的工作流。注意中断相关配置步骤4~6必须在启动计数步骤7之前完成否则第一次溢出时 NVIC 还没就绪会丢失中断或触