打印

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

[复制链接]
2953|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)。 你看这样对不对?

使用特权

评论回复
5
加班加点| | 2011-4-14 12:52 | 只看该作者
我的理解是楼主你就根本没有看过数据手册,也不知道开发的流程!

使用特权

评论回复
6
杜_U_ME| | 2011-4-20 21:57 | 只看该作者
楼主好好看看数据手册吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

1930

帖子

2

粉丝