mini 2440 test 的Delay函数分析
时间:11-20
来源:互联网
点击:
延迟程序Delay
void Delay(int time)
{
U32 val = (PCLK>>3)/1000-1;
rTCFG0 &= ~(0xff<8);
rTCFG0 |= 3<8; //prescaler = 3+1
rTCFG1 &= ~(0xf<12);
rTCFG1 |= 0<12; //mux = 1/2
rTCNTB3 = val;
rTCMPB3 = val>>1; // 50%
rTCON &= ~(0xf<16);
rTCON |= 0xb<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
rTCON &= ~(2<16); //clear manual update bit
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3>1);
};
}
1) 计数器的输入时钟(CCLK)频率:PCLK/(预分频+1)/分割值
预分频值和分割值分别由TCFG0,TCFG1来确定。
rTCFG0 &= ~(0xff<8);
rTCFG0 |= 3<8; //prescaler = 3+1
rTCFG1 &= ~(0xf<12);
rTCFG1 |= 0<12; //mux = 1/2
预分频为3,分割值为2,又已知PCLK=50Mhz
因此可以计算出计数器输入时钟频率6.25Mhz。
2)初始值的设定了是由TCMPB3和TCNTB3来完成了
TCMPB3一定要小于TCNTB3。
TCMPB3在定时的过程中不变,然后TCNTB3开始减计数,直到与TCMPB3相等时触发中断,通过设定就可以重新转载TCNTB3。
U32 val = (PCLK>>3)/1000-1;
rTCNTB3 = val;
rTCMPB3 = val>>1; // 50%
我们可以比较一下rTCNTB3与计数器的输入时钟,可以发现rTCNTB3的频率是输入时钟的1000分之一,(因为包括0)。因此我们可以这样等价的认为rTCNTB3 = 1000CCLK, rTCMPB3=500CCLK。
然后我们看上面的定时的时序,rTCNTB3开始减计数,直到减到500与rTCMPB3相等,触发中断,然后rTCNTB3再减一以后继续装载。
2) rTCON定时控制寄存器
rTCON[16,17,18,19]控制Timer3
rTCON &= ~(0xf<16);
rTCON |= 0xb<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
rTCON &= ~(2<16); //clear manual update bit
3) 实现延迟
由于Delay程序只是软件定时,因此设计了一个while循环来完成定时的功能。具体实现如下:
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3>1);
};
最外层的WHILE只是DELAY的次数,然后看里面的两个WHILE,TCNTO3是个BUFFER,用来读TCNTB3,其实也就等同于 TCNTB3,while(rTCNTO3>=val>>1);就是等到rTCNTO3 此外前面程序设定rTCNTB3 = val;
并且rTCMPB3 = val>>1;
while(rTCNTO3>=val>>1)也就等同于
while(rTCNTO3>=rTCMPB3 );
所以,rTCNTB3开始减计数,当等于以后,再减1则进入下一个语句的while(rTCNTO3>1);显然此时要自动转载TCNTO3为VAL下一个WHILE 为假,退出while。
然后开始下一个time--
4)实现的延迟时间的计算
通过以上的分析,可以得到延迟时间的频率:CCLK/2
时间是0.32ms
该文让我多少能够理解val = (PCLK>>3)/1000-1;一句中减1的理由,也许是
void Delay(int time)
{
}
1)
预分频值和分割值分别由TCFG0,TCFG1来确定。
rTCFG0 &= ~(0xff<8);
rTCFG0 |= 3<8;
rTCFG1 &= ~(0xf<12);
rTCFG1 |= 0<12;
预分频为3,分割值为2,又已知PCLK=50Mhz
因此可以计算出计数器输入时钟频率6.25Mhz。
2)初始值的设定了是由TCMPB3和TCNTB3来完成了
TCMPB3一定要小于TCNTB3。
TCMPB3在定时的过程中不变,然后TCNTB3开始减计数,直到与TCMPB3相等时触发中断,通过设定就可以重新转载TCNTB3。
我们可以比较一下rTCNTB3与计数器的输入时钟,可以发现rTCNTB3的频率是输入时钟的1000分之一,(因为包括0)。因此我们可以这样等价的认为rTCNTB3 = 1000CCLK,
然后我们看上面的定时的时序,rTCNTB3开始减计数,直到减到500与rTCMPB3相等,触发中断,然后rTCNTB3再减一以后继续装载。
2)
rTCON[16,17,18,19]控制Timer3
rTCON &= ~(0xf<16);
3)
由于Delay程序只是软件定时,因此设计了一个while循环来完成定时的功能。具体实现如下:
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3
};
最外层的WHILE只是DELAY的次数,然后看里面的两个WHILE,TCNTO3是个BUFFER,用来读TCNTB3,其实也就等同于 TCNTB3,while(rTCNTO3>=val>>1);就是等到rTCNTO3
并且rTCMPB3 = val>>1;
while(rTCNTO3>=val>>1)也就等同于
while(rTCNTO3>=rTCMPB3 );
所以,rTCNTB3开始减计数,当等于以后,再减1则进入下一个语句的while(rTCNTO3
然后开始下一个time--
4)实现的延迟时间的计算
通过以上的分析,可以得到延迟时间的频率:CCLK/2
时间是0.32ms
该文让我多少能够理解val = (PCLK>>3)/1000-1;一句中减1的理由,也许是
计数的时候要计上0,至于是否如此,未曾验证。
认为时钟频率为50M/3+1/2=6.25M没错,但是计数50M/8000次,那么计数周期应
该是1/6.25*50/8000=1ms才对。
mini2440Delay函数分 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)