程序如下: void Delay(int time) // time=0: adjust the Delay function by WatchDog timer. // time>0: the number of loop time // 100us resolution. { int i,adjust=0; if(time==0) { time=200; adjust=1; delayLoopCount=400; rWTCON=((PCLK/1000000-1)<<8)|(2<<3); // 1M/64,Watch- dog,nRESET,interrupt disable rWTDAT=0xffff; rWTCNT=0xffff; rWTCON=((PCLK/1000000-1)<<8)|(2<<3)|(1<<5); // 1M/64,Watch-dog enable,nRESET,interrupt disable }
for(;time>0;time--) for(i=0;i<delayLoopCount;i++);
if(adjust==1) { rWTCON=((PCLK/1000000-1)<<8)|(2<<3); i=0xffff-rWTCNT; delayLoopCount=8000000/(i*64); //400*100/(i*64/200) } }
这段程序的本意是延时(time*100us) 但是我测试中发现调用delay(0)校准以后 传进来的time=10000,也就是让它延时1S的时候 它根本就没有延时1s,差不多就延时了1/30s左右 也就是必须传300000左右,才能真正的延时1s
我用的是2440的cpu,跑400MHz和300MHz的时候延时基本差不多(校准过) 400M的时候,PCLK=50MHz,最终delayLoopCount=0x93 大侠给看看
|