关于内部时钟ARR和PCS值的计算方法
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1; //计数周期,即ARR的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1; //预分频器,即PSC的值
这两个数值是如何计算的?
这段代码是 STM32 定时器时间基准初始化的配置。要理解这两个数值是如何计算的,首先需要知道定时器的输入时钟频率以及你想要达到的定时时间。
通常情况下,STM32 定时器挂载在 APB1 或 APB2 总线上。假设你的系统时钟频率为 72MHz,且定时器的时钟已经配置为 72MHz。
针对你给出的数值进行计算
-
已知条件:
- 定时器时钟频率 = 72 MHz = ( 72,000,000 ) Hz
- TIM_Prescaler (PSC) = 7200 - 1
- TIM_Period (ARR) = 10000 - 1
-
计算步骤:

结论
这两个数值是这样计算出来的:
为了让定时器每隔 1 秒 触发一次中断或更新事件:
-
TIM_Prescaler 的计算:
- 72MHz 对于直接计数来说太快了(1秒计数 72,000,000 次)。
- 我们希望降低计数速度。选择一个值,让计数器的计数频率降为 10kHz(即每秒计数 10,000 次,每 0.1ms 计一次数),这样便于计算。
- ( 72,000,000 / 10,000 = 7200 )。
- 所以 PSC = 7200 - 1。
-
TIM_Period 的计算:
- 现在计数器每 ( 0.0001 ) 秒(0.1ms)加 1。
- 如果我们需要 1 秒的周期,计数器需要从 0 数到 9999,总共计数 10000 次。
- ( 10000 \times 0.0001s = 1s )。
- 所以 ARR = 10000 - 1。
为什么要减 1?
在 STM32 的标准库或寄存器设置中,写入 TIM_Prescaler 和 TIM_Period 的值是直接写入 PSC 和 ARR 寄存器的。
这两个寄存器都是从 0 开始计数的。
- 如果你需要预分频器进行 7200 分频,你必须写入 7200 - 1。
- 如果你需要计数器计数 10000 次后溢出(从 0 数到 9999),你必须写入 10000 - 1。
总结:你给出的代码配置的是一个 72MHz 时钟源下,每 1 秒产生一次更新事件的定时器。
ARR 和 PSC 是 STM32 定时器中两个关键的寄存器,用于控制定时的时间长度。
ARR(Auto-Reload Register)—— 自动重装载寄存器
- 含义: 它决定了定时器计数周期的“终点”。计数器从 0 开始向上计数,当计数值达到 ARR 中设定的值时,计数器会溢出(或称为上溢),并自动重置回 0,同时可以触发中断或事件。
- 通俗理解: 相当于一个倒计时的“总次数”。例如,你设定 ARR = 9999,那么计数器就需要从 0 数到 9999(共 10000 个计数周期)才会完成一个定时周期。
- 计算公式作用: 它与最终的定时时间直接相关。
PSC(Prescaler)—— 预分频器
- 含义: 它用于对定时器的输入时钟源(通常是几十 MHz 的系统时钟)进行分频,产生一个频率较低的时钟信号,供给计数器使用。这样可以避免计数器计数过快,使得我们可以实现较长的定时时间。
- 通俗理解: 相当于一个“节拍发生器”。输入时钟太快,我们就用 PSC 把它放慢。比如,72 MHz 的时钟经过 PSC = 7199 的分频后,送给计数器的时钟就变成了 10 kHz(每秒 1 万个节拍)。
- 计算公式作用: 它决定了计数器每计一个数所花费的时间。
它们如何配合工作?
定时器工作的基本流程:
- 定时器的输入时钟(比如 72 MHz)先经过 PSC 预分频器,得到一个频率较低的计数时钟。
- 计数器在这个计数时钟的驱动下,从 0 开始向上计数。
- 每来一个计数时钟脉冲,计数器加 1。
- 当计数器的值达到 ARR 自动重装载寄存器中设定的值时,计数器溢出,定时周期完成,同时计数器自动重置为 0,开始下一个周期。
简单来说:
PSC 控制着“多长时间计一次数”,ARR 控制着“一共计多少次”。
两者结合起来,就确定了整个定时周期的时间长度。

浙公网安备 33010602011771号