推迟程序Delay
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才对。