好的,我们来仔细算一下你这段 GD32 TIMER0 配置 的时钟频率与定时周期。
🧩 已知条件
| 参数 | 值 | 说明 |
|---|---|---|
| AHB 时钟 | 240 MHz | 系统主频 |
| APB1 时钟 | 60 MHz | AHB/4 |
| APB2 时钟 | 120 MHz | AHB/2 |
TIMER0 |
位于 APB2 总线 | |
rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL2) |
选择 "倍频模式" | |
| 预分频器(Prescaler) | 0 | |
| 自动重装载值(ARR / period) | 48 | |
| 计数方向 | 向上计数 |
⚙️ 步骤1:确定定时器时钟频率 CK_TIMER
根据 GD32 的时钟结构说明:
当
RCU_TIMER_PSC_MUL2被设置时:
- 如果 APB2 分频不为 1,则定时器时钟 = 2 × APB2 时钟
你的 APB2 = 120 MHz
→ 因此:
f_{TIMER} = 2 \\times 120,\\text{MHz} = 240,\\text{MHz}
✅ 定时器时钟频率:240 MHz
⚙️ 步骤2:计算计数周期(即更新事件周期)
定时器计数频率计算公式:
f_{CNT} = \\frac{f_{TIMER}}{(PSC + 1)}
代入 PSC = 0:
f_{CNT} = \\frac{240,\\text{MHz}}{1} = 240,\\text{MHz}
一个计数周期时间:
T_{CNT} = \\frac{1}{f_{CNT}} = \\frac{1}{240 \\times 10\^6} = 4.1667,\\text{ns}
⚙️ 步骤3:计算溢出周期(即定时器中断周期)
当定时器从 0 计数到 ARR(period)后产生更新事件。
周期计算公式:
T_{update} = (ARR + 1) \\times T_{CNT}
代入参数:
T_{update} = (48 + 1) \\times 4.1667,\\text{ns} = 204.17,\\text{ns}
✅ 结果总结
| 项目 | 值 |
|---|---|
| 定时器输入时钟 | 240 MHz |
| 计数频率 | 240 MHz |
| 计数周期(每个 tick) | 4.17 ns |
| 自动重装载值 ARR | 48 |
| 溢出周期(中断周期) | ≈ 204 ns |
| 溢出频率 | ≈ 4.9 MHz |
💡 如果你想得到 400ns 周期
那就反推 ARR:
ARR = \\frac{T_{target}}{T_{CNT}} - 1 = \\frac{400,\\text{ns}}{4.1667,\\text{ns}} - 1 ≈ 95
所以如果想得到 400ns 的更新周期,应该设置:
c
timer_initpara.period = 95;
结论:
- 当前配置下的 实际定时周期 ≈ 204ns
- 如果目标是 400ns ,请将
period = 95。