您现在的位置是:首页 >学无止境 >定时器定时中断中TIM分频器失效原因探讨网站首页学无止境

定时器定时中断中TIM分频器失效原因探讨

ZL Ren 2025-07-27 00:01:06
简介定时器定时中断中TIM分频器失效原因探讨

定时器定时中断中TIM分频器失效原因探讨

根据上一篇文章,我发现在无论设置 TIM_CKD_DIV1TIM_CKD_DIV2 还是 TIM_CKD_DIV4,最终定时器的行为都跟无分频(TIM_CKD_DIV1)相同。 本文章我结合了AI的回答,想与大家一起探讨一下可能原因,如果有错误,欢迎指正。

首先,我们先来看看TIM_ClockDivision的作用:


1. TIM_ClockDivision 的作用

① 作用范围

在 STM32F103 的定时器中,TIM_ClockDivision 仅影响 输入信号的滤波器,例如:

  • 输入捕获(Input Capture)
  • 编码器接口(Encoder Mode)
  • 外部触发信号(Trigger Filter)

但它 不影响定时器的时钟源,即 定时器的计数频率不会因为 TIM_ClockDivision 的变化而改变

② 具体作用

TIM_ClockDivision 仅对 定时器滤波器采样时钟 进行分频:

TIM_CKD_DIV1  // 采样频率 = 内部时钟
TIM_CKD_DIV2  // 采样频率 = 内部时钟 / 2
TIM_CKD_DIV4  // 采样频率 = 内部时钟 / 4

但它不会影响定时器的主时钟。


2. 定时器的主时钟来源

STM32F103 的通用定时器(TIM2~TIM5)的主时钟来源是 APB1 总线时钟(PCLK1)

  • 如果 APB1 预分频因子 PCLK1_Prescaler = 1,则 定时器时钟 = PCLK1
  • 如果 PCLK1_Prescaler ≠ 1,定时器时钟会 自动加倍,即:
    TIM_CLK = 2 * times PCLK1
  • 默认情况下:
    PCLK1 = 36MHz, TIM_CLK = 72MHz

因此,影响定时器计数的关键参数是:

  1. 时钟源(APB1 总线时钟)
  2. 时钟预分频器(Prescaler)
  3. 计数周期(Period)
  4. TIM_ClockDivision 不会影响定时器的计数时钟!

3. 代码中的无效配置

在代码中:

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

这个 TIM_ClockDivision 参数的设置 对定时器的计时功能没有影响,无论设置 TIM_CKD_DIV1TIM_CKD_DIV2 还是 TIM_CKD_DIV4,最终的定时器计时频率都不会改变。


4. 正确影响定时器时钟的方法

如果想改变 TIM2 的计数频率,可以调整:

方法①:修改预分频器

TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
  • 这个参数会直接影响定时器的计数速度。
  • 例如:
    • Prescaler = 7200 → 计数频率 从 72MHz 降到 10kHz
    • Prescaler = 3600 → 计数频率 从 72MHz 降到 20kHz

方法②:修改自动重装值(ARR)

TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
  • 这个值决定了 计数器溢出的时间,影响定时器中断的周期。

5. 结论

  • 在 STM32F103 系列中,TIM_ClockDivision(时钟分频) 仅对数字滤波器(如输入捕获、编码器模式) 相关的功能起作用,而不影响定时器的计数时钟。
  • TIM_ClockDivision 只影响输入信号滤波,不影响定时器计数频率!
  • 要调整定时器的工作频率,应该修改 TIM_PrescalerTIM_Period
  • 如果希望让 TIM2 运行得更快或更慢,应该修改 TIM_Prescaler,而不是 TIM_ClockDivision
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。