C2000 CPU Timer 学习笔记
1. CPU Timer 是什么
C2000 的 CPU Timer 本质是:
32 位倒计数器从设定值开始减,减到 0 后产生中断,然后重新装载,继续下一轮。
2. 工作流程
CPU Timer 流程图
核心流程:
SYSCLKOUT ↓ 预分频器 PSC ↓ TIMCLK ↓ 主计数器 TIM ↓ TIM = 0 ↓ 产生中断3. 两级计数
CPU Timer 时序图
第一级:预分频器
SYSCLKOUT 驱动 PSC 递减 PSC 减到 0 → 产生 TIMCLK第二级:主计数器
TIMCLK 驱动 TIM 递减 TIM 减到 0 → 产生定时器中断4. 主要寄存器
| 寄存器 | 作用 |
|---|---|
| PRD / PRDH | 设置 32 位定时周期 |
| TIM / TIMH | 32 位当前计数值 |
| TPR / TPRH | 存放预分频设定值和当前预分频计数值 |
| TCR | 控制定时器启动、停止、中断 |
TPR、TDDR、PSC 的关系
TPR和TPRH是两个 16 位寄存器,但里面又分成几个 8 位字段:
| 寄存器 | 高 8 位 | 低 8 位 |
|---|---|---|
| TPRH | PSCH | TDDRH |
| TPR | PSC | TDDR |
组合后:
| 组合字段 | 含义 |
|---|---|
| TDDRH:TDDR | 16 位预分频设定值 |
| PSCH:PSC | 16 位预分频当前计数值 |
简单记:
TDDRH:TDDR 决定分频多少 PSCH:PSC 是当前倒计数值 TPR/TPRH 只是存放这些字段的寄存器5. 定时时间
定时时间 ≈ (PRD + 1) × (TDDR + 1) / SYSCLKOUT不使用预分频时:
TDDR = 0 定时时间 ≈ (PRD + 1) / SYSCLKOUT例子:
SYSCLKOUT = 60MHz 目标定时 = 1ms PRD = 60000 - 1 TDDR = 06. 配置步骤
1. 设置 PRD 2. 设置 TPR / TPRH 3. 重装载计数器 4. 使能定时器中断 5. 启动定时器 6. 配置 PIE 和 CPU 中断7. 核心代码
CpuTimer0Regs.TCR.bit.TSS = 1; // 停止定时器 CpuTimer0Regs.PRD.all = 60000 - 1; // 1ms,60MHz CpuTimer0Regs.TPR.all = 0; // TDDR = 0,不预分频 CpuTimer0Regs.TPRH.all = 0; CpuTimer0Regs.TCR.bit.TRB = 1; // 重装载 CpuTimer0Regs.TCR.bit.TIF = 1; // 清中断标志 CpuTimer0Regs.TCR.bit.TIE = 1; // 使能中断 CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器8. 总结
CPU Timer = 预分频器 + 32 位倒计数器。 TDDRH:TDDR 设置预分频; PSCH:PSC 是预分频当前值; TIMH:TIM 减到 0 后产生中断。