怎样设置参数值,使得F2812的定时器0能够准确定时

[复制链接]
3770|5
 楼主| linhai2009 发表于 2009-10-18 19:18 | 显示全部楼层 |阅读模式
最近在看定时器中断问题,遇到下面的程序:
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
        Uint32         temp;

        Timer->CPUFreqInMHz = Freq;
        Timer->PeriodInUSec = Period;
        temp = (long) (Freq * Period);
        Timer->RegsAddr->PRD.all = temp;

               
        Timer->RegsAddr->TPR.all  = 0;
        Timer->RegsAddr->TPRH.all  = 0;
        
        Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart Timer
        Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timer
        Timer->RegsAddr->TCR.bit.SOFT = 1;
        Timer->RegsAddr->TCR.bit.FREE = 1;     // Timer Free Run
        Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt
        
        Timer->InterruptCount = 0;
}

然后在主程序中,有这样的设置:
ConfigCpuTimer(&CpuTimer0,100,1000000);//设定定时周期

我想问的是:这些参数是如何设置来确定定时的啊。打个比方,我想定时1ms,主程序的该如何设置啊。
thf2008 发表于 2009-10-20 22:45 | 显示全部楼层
看看这几段语句就会明白的,你要定时的时间就是period,单位是us,比如,ConfigCpuTimer(&CpuTimer0,100,1000000);是指100MHZ的主频,1000ms(即1s)的周期,想改变定时时间1ms ,只要更改为ConfigCpuTimer(&CpuTimer0,100,1000)即可。

temp = (long) (Freq * Period);
Timer->RegsAddr->PRD.all = temp;

ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
ConfigCpuTimer(&CpuTimer0,100,1000000);
 楼主| linhai2009 发表于 2009-10-21 00:02 | 显示全部楼层
我想问下,你上面说的主频100MHZ,是不是外接晶振,然后通过PLL倍频得到的频率啊?比如说,我现在用的试验箱,外接30M的晶振,然后最高主频可以达到150M,那么我这个地方是不是要设置为150,那么,这个时候,我想定时1s,是不是还设置为100,0000。对不?
zfj_go 发表于 2011-4-14 08:36 | 显示全部楼层
我的理解是,如果经过倍频后,你的SYSCLKOUT是150MHZ的话,定时器还跟TPR寄存器里的TDDR,TDDRH有关,如果TDDR,TDDRH设置为0,那么你的定时器时钟周期与系统时钟周期相同,这时候你要是想定时1S中断一次,应该是ConfigCpuTimer(&CpuTimer0,150,1000000)。 你看这样对不对?
加班加点 发表于 2011-4-14 12:52 | 显示全部楼层
我的理解是楼主你就根本没有看过数据手册,也不知道开发的流程!
杜_U_ME 发表于 2011-4-20 21:57 | 显示全部楼层
楼主好好看看数据手册吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

1930

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部
0