2440lib.c里面有一个delay函数
我做过以下分析:
//初步估算这个延时函数,延时1MS,1毫秒
void Delay(int time)
{
U32 val = (PCLK>>3)/1000-1;//PCLK=50Mhz
rTCFG0 &= ~(0xff<<8); //此8 位决定定时器2,3,4 的预标定器值,这样的写法是不改变其他位的数值,只改变8-15位的数值
rTCFG0 |= 3<<8; //prescaler = 3+1
rTCFG1 &= ~(0xf<<12);
rTCFG1 |= 0<<12; //mux = 1/2//Select MUX input for PWM Timer3
//这么一来定时器3的输入频率=PCLK/4/2=1/8*PCLK
//定时器3的输入时钟频率为6.25Mhz,周期就是倒数
//在计数缓存寄存器中存的值为6.25Mhz/1000-1,那么与6.25Mhz的倒数相乘就得到1/1000秒,也就是1MS
//那么定时器的时间为1/6.25,应该定时1ms左右,但是减了个1,不明白
rTCNTB3 = val; //定时器3 计数缓存寄存器
rTCMPB3 = val>>1; // 50%比较缓存寄存器,这中的值是val的一半,也就是到了0.5MS的时候
//当TCNTn的值等于TCMPN的值时,定时器N的输出管脚TOUTN反转;TCNTN继续减一计数,当TCNTN的值到达0时,其管脚TOUTN再次反转,并触发定时器N的中断。
rTCON &= ~(0xf<<16); //设置16-19位
rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3(1011)//设置开启定时器3,内部模式(自动加载),手动更新TCNTB3&TCMPB3,Inverter关闭
rTCON &= ~(2<<16); //clear manual update bit,定时器3的一些定时器控制,又将这个手动更新TCNTB3&TCMPB3功能关闭
while(time--) {
while(rTCNTO3>=val>>1);//定时器3 计数观察寄存器
while(rTCNTO3<val>>1);
};
}
有注释,我觉得该函数延时是一毫秒的。。由于有些裸机程序的外设比如SD卡是需要用到这个delay函数的。我试过,只有在2440test中调用SDI的读写函数是可以读写SD卡的,但是一旦将SD卡的驱动放到别的2440模板上面就不能运行了。仿真了一下,发现都是卡在这个delay函数上面的。
这个delay函数到底是不是延时1ms,大家讨论一下?还有我可不可以用for循环或者是别的什么方式代替呢???求解答