-
定时器的内部结构如下图所示:

-
上面图中可以看到定时器的几个寄存器:
- 32位定时器周期寄存器PRDH:PRD
- 32位计时器寄存器TIMH:TIM
- 16位定时器分频器寄存器TDDRH:TDDR
- 16位预定标计数器寄存器PSCH:PSC
-
F28335的存储器是16位的,那么如何用16位寄存器来表示32位的寄存器呢?
- 在这里,使用2个16位的存储器XH和X来表示32位的寄存器,其中XH表示高16位,X表示低16位。
-
CPU定时器的工作原理:
- 闹铃原理:睡前把闹铃设定好,闹钟每秒走动一次,当闹钟的时间与设定值相同时,闹铃开始打铃。
- 在CPU定时器工作前,根据实际需要,计算好CPU定时器周期寄存器的值,然后给周期寄存器PRDH:PRD赋值,好比给闹钟设定时间一样。当启动定时器开始计数时,周期寄存器PRDH:PRD里的值装载到定时器计数寄存器TIMH:TIM中。就像闹钟每隔1秒钟走动一下,计数寄存器中的值每隔一个TIMCLK就会减小1,直到减小到0,完成一个周期的计数。(注意,这里是减计数,就像手机中的计时器一样,减到0铃声响)
- 就像闹钟到点后会响铃,而CPU定时器计时完成后,会产生一个中断信号TINT。用来告诉CPU已经完成了定时任务。
- 完成一个周期的计数后,在下一个定时器输入时钟周期开始时,周期寄存器中的值重新装载到计数器寄存器中,周而复始循环。
- 一个CPU定时器周期的时间T = (PRDH:PRD + 1) * TIMCLK
- 定时器寄存器TIMH:TIM每隔TIMCLK时间减少1,那么TIMCLK是多少呢?
- 这个时钟是由定时器分频寄存器TDDRH:TDDR和定时器预订标寄存器PSCH:PSC来控制的。
- 首先给定时器分频器TDDRH:TDDR赋值,然后将数值装载入预定标器PSCH:PSC中,每隔一个SYSCLKOUT脉冲,PSCH:PSC中的值减小1,当PSCH:PSC减小到0时,就会输出一个TIMCLK,从而使TIMH:TIM寄存器中的数值减小1。
- TIMCLK = (TDDRH:TDDR + 1) * SYSCLKOUT

-
如果想要用CPU定时器来计量一段时间,那么需要设定的寄存器有两个:
- 周期寄存器PRDH:PRD,决定了计数器要走多少步。
- 分频器寄存器TDDRH:TDDR,决定了计数器每走一步所用的系统时间。
-
假设系统时钟SYSCLKOUT的值为X MHz,那么计时器每走一步,所需要的时间是:
- TIMCLK = ((TDDRH:TDDR + 1) / X) * 10^-6 s
-
因为CPU定时器一个周期总共计数了(PRDH:PRD + 1)次,因此,CPU定时器一个周期所计量的时间是:
- T = (PRDH:PRD + 1) * TIMCLK
-
实际应用时,通常是确定了要定时的时间T和CPU的系统时钟X,来确定周期寄存器PRDH:PRD的值。TDDRH:TDDR通常可以取0,如果取0的时候,PRDH:PRD的值超过了32位寄存器的范围,那么TDDRH:TDDR可以取其他的值,使得PRDH:PRD的值小一些,从而能放入32位寄存器中。
-
比如,f_SYSCLKOUT = XMHz,想要定时Yus,则:
- Y = (PRDH:PRD + 1) * X * 10^-6
- PRDH:PRD = X * Y * 10^6 -1