写在最前,不喜请略过。本博文的主要内容已在QQ空间、人人网、网易博客、百度空间等平台发表过,作者为Mr_D_prince(斌斌-龙臻),也就是本人,前两者均为我在非技术论坛的昵称。在技术论坛我更喜欢newofcortexm3这个昵称,原因无他,我就是个技术新人。之所以文章类型为什么是整理,是因为博文的主要内容均来自TI相关的技术手册,我只是做了下解读或者整理。
TMS320F28335的CPU Time有三个,分别为Timer0,Timer1,Timer2,其中Timer2是为操作系统DSP/BIOS保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为TINT0, TINT1, TINT2,分别对应于中断向量INT1,INT13,INT14。图1为定时器的结构框图,图中TIMH:TIM为计数寄存器,PRDH:PRD为周期寄存器,AH:A的形式表示一个32位的寄存器,是由两个16位的寄存器构成,AH是高16位,A是低16位。
CPU定时器的计数复位时,计数寄存器TIMH:TIM加载周期寄存器PRDH:PRD的值,经历一个计数器时钟时,TIMH:TIM内的值就减1,一直减到0,这时产生定时器周期中断事件,并重新装载PRDH:PRD的值,重新开始计数。置于每隔多少时间,定时器计数器才会减1由预定标寄存器TPRH:TPR来决定。TPRH和TPR这两个寄存器由两部分组成,高8位为定时器预定标计数器PSC,低8位是定时器分频TDDR。也即是说,TPRH是由PSCH和TDDRH构成,而TDDR由PSC和TDDR构成。且其工作的原理与定时器计数器类似,复位时,PSCH:PSC加载TDDRH:TDDR的值,然后经过一个CPU时钟,PSCH:PSC的值减1,当PSCH:PSC的值减到0时,会再次装载TDDRH:TDDR的值,并且产生一个计数器时钟,TIMH:TIM减1。
以上寄存器测值在配置函数ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)中设置。形参Freq为定时频率,Period为计时周期。假若Freq为15,Period为1000000,则时间t = 15*1000000/150M = 0.1s (系统时钟频率为150M)。不过这个算式的成立是有条件的,这个条件就是以下两条语句:
Timer->RegsAddr->TPR.all = 0
Timer->RegsAddr->TPRH.all = 0
上文曾提及,定时器的计数时钟是有预定标寄存器TPRH:TPR决定的。CpuTimerxRegs.TPR.all = 0, CpuTimerxRegs.TPRH.all = 0这两句话决定了1个时钟源周期为定时器的时钟周期,若CpuTimerxRegs.TPR.all = y,CpuTimerxRegs.TPRH.all = 0,则计y+1个时钟周期为定时器的时钟周期。X表示0,1,2中的任意值。
因此,真正的定时时间为:time =TPRH:TPR/SYSCLKOUT*Freq*Peroid。只有当TPRH:TPR=0时,time =Freq*Peroid/SYSCLKOUT。另外,在定时器配置函数中,
Timer->RegsAddr->TCR.bit.TSS = 1 表示停止定时器 ;
Timer->RegsAddr->TCR.bit.TRB = 1 表示重装定时器;
Timer->RegsAddr->TCR.bit.FREE = 1 表示定时器自由运行;
Timer->RegsAddr->TCR.bit.TIE = 1 表示使能定时器中断。
如果要利用定时器产生一定周期的时间中断,别忘了在主函数中设置响应的中断向量即可。
用户1739657 2014-5-7 15:07
用户377235 2013-7-28 16:21
呵呵
yxrlh327_818573914 2013-1-2 21:45
用户377235 2012-11-19 14:30