学嵌入式的时候 ,碰到以下延时函数,麻烦高手帮帮忙~

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<val>>1);
};
}

冉冉说
浏览 172回答 2
2回答

ibeautiful

一种最原始,最没有效率的延时程序。在调用这个延时程序时,CPU将在while(time--){}这个循环处不停的等待,直到time减到零,标志着延时结束。程序也随之退出。从函数第一句开始,直到while循环语句之前,都属于定时器配置。通过注释可以看出,使用了定时器3。由于不知道单片机的型号,只能做一个通用的解释。看懂这一解释的基础是你知道单片机定时器的配置方法和工作原理。首先,表示时间的变量time不是时间单位,并不表示毫秒或者秒,他代表了延时多少个脉冲。而变量val也是脉冲,他定义了一个定时器工作周期所经过的脉冲数。单个脉冲表示的时间间隔则通过单片机工作频率计算出来。比如说,单片机的频率为10mHz,那么每个脉冲的时间就是1uS(假设分频电路为1:1)。如果需要定时器的一个工作周期为1ms,那么val就需要设为1000。如果延时10ms,则time=100。可见,延时时间只能是定时器工作周期的整数倍。rTcon3是定时器3的计数器,每个脉冲过后,会根据定时器的设定而自动进行+1操作。完成一个工作周期后,恢复为0。

HUH函数

这是利用定时器3的计数功能来延时的程序void Delay(int time){U32 val = (PCLK>>3)/1000-1;rTCFG0 &= ~(0xff<<8);rTCFG0 |= 3<<8; //prescaler = 3+1rTCFG1 &= ~(0xf<<12);rTCFG1 |= 0<<12; //mux = 1/2 //这四句设置定时器输入的频率,PCLK/8rTCNTB3 = val; //设置计数值,输入频率除以1000,即计数器到底时正好1msrTCMPB3 = val>>1; // 50% //这个是设置比较值,计数到这个值时,引脚会有输出rTCON &= ~(0xf<<16);rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3rTCON &= ~(2<<16); //clear manual update bit //这几行是启动定时器,开始进行计数,计数到0时自动重新装载计数值while(time--) {while(rTCNTO3>=val>>1);while(rTCNTO3<val>>1); //这两行是读取计数器的值,每次到一半时,将time减一次,因为计数器一直在走的,所以要使用范围读取,不能像这样while(rTCNTO3 == 0),这样的话,估计会永远都等等不到的。};}
打开App,查看更多内容
随时随地看视频慕课网APP