dsp 28335 ConfigCpuTimer()详细介绍

时间:2023-02-21 10:13:02

我自己的理解;写的不一定对,还请多指教;

从网上看到的好多都是复制粘贴的一个版本,感觉不太对

dsp 28335 ConfigCpuTimer()详细介绍

图上的是系统时钟(SYSCLKOUT)=75MHz;

ConfigCpuTimer(&CpuTimer0, 150, 500000);

这样不太现实,系统时钟跑75M次是1s,你cpu定时器跑150M才是1s,怎么可能?TPR里的TDDRH:TDDR没法设置啊,不可能让他们等于1/2吧!所以我觉得这说的不对;

下图是我们在程序中经常见到的对cpu定时器的设置;

dsp 28335 ConfigCpuTimer()详细介绍

从注释中可以知道,CPU定时器的时钟频率是150Mhz时(区别于系统时钟SYSCLKOUT),(500000是定时器一个周期的时间,应该就是设定的时间T)每50ms会发生一次中断;怎么实现的呢?

dsp 28335 ConfigCpuTimer()详细介绍

CPUFreqInMHz这个是cpu定时器的频率,由ConfigCpuTimer()的Freq可知为150,单位为Mhz;(区别于系统时钟SYSCLKOUT),

CPU的定时器时钟周期即:TIMCLK=(TDDRH:TDDR+1)x(1/SYSCLKOUT),他的倒数就是cpu定时器的频率,已知函数中自定义的Freq就是频率,那么就可以求得(TDDRH:TDDR)的值了;Freq是等于系统时钟频率的所以TDDR是1;在这里

dsp 28335 ConfigCpuTimer()详细介绍

这样设置TPR(即PSC+TDDR)就表示定时器的时钟等于系统时钟;

为什么将(Freq*Period)赋给PRD?PRD是定时器周期寄存器,意思应该就是定时器从开始到发出中断的时间,让它走(Freq*Period)个定时器周期,停止然后中断;

ConfigCpuTimer(&CpuTimer0, 150, 500000);由此函数知

T(想要的定时时间/定时器周期)=TIMCLK*(PRDH:PRD)==>(PRDH:PRD)=T/TIMCLK=T*Freq;

(比如说系统时钟150MHz,即一个周期是6.67ns;由PRD知运行的系统周期是500000x150=75000000个;75000000x6.666667=500000250ns,大约就是0.5s);

ConfigCpuTimer(&CpuTimer0, 75, 500000);

即:cpu定时器的频率是75MHz,即每两个系统时钟周期代表一个CPU定时器周期;那么时间就变位2x6.666667ns(1/75);

我需要的一个定时器周期是500000us,一个周期是(1/75M)s,那么我就需要500000x75个这样的周期,所以PRDH:PRD就被设置为75*500000=37.5M;

(PRDH:PRD)*2x6.666667ns=0.5s;