static int delayLoopCount=400;void Delay(int time)
{
int i,adjust=0;
本文引用地址:http://www.ex-cimer.com/article/201611/322312.htmif(time==0)//校準(zhǔn)
{
time=200;
adjust=1;
delayLoopCount=400;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);//MCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
rWTDAT=0xffff;//for first update
rWTCNT=0xffff;//resolution=64us@any MCLK
rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
}
for(;time>0;time--)
for(i=0;i
if(adjust==1)
{
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);//Watch-dog timer stop
i=0xffff-rWTCNT;//1count->64us, 200*400 cycle runtime = 64*i us
delayLoopCount=8000000/(i*64);//200*400:64*i=1*x:100 -> x=80000*100/(64*i)
}
}
初看這個(gè)函數(shù)時(shí)有問(wèn)題的,花了很長(zhǎng)時(shí)間才搞懂,很經(jīng)典的一段程序。
(1)這個(gè)函數(shù)在使用前必須先運(yùn)行一下Delay(0),這個(gè)是關(guān)鍵。它主要完成的是delayLoopCount變量的計(jì)算,即100uS的校準(zhǔn)。
(2)假設(shè)MCLK=66M,
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);經(jīng)過(guò)預(yù)分頻,輸出頻率1M,即1us計(jì)時(shí);時(shí)鐘除數(shù)因子=1/64,即看門狗定時(shí)器對(duì)1M的64分頻計(jì)數(shù), 計(jì)數(shù)一次是64us,每64usWTCON減1。
(3)for(i=0;i
(4)用此函數(shù)前,先用Delay(0)校準(zhǔn),一個(gè)是兩個(gè)for循環(huán)延時(shí)。for循環(huán)延時(shí)同時(shí),定時(shí)器計(jì)數(shù)。
200*400個(gè)循環(huán)對(duì)應(yīng)------看門狗計(jì)數(shù)次數(shù)i(i=0xffff-rWTCNT,計(jì)數(shù)一次是64us),延時(shí)64*i個(gè)us;(200*400)/64i是每個(gè)us循環(huán)的個(gè)數(shù), 100us對(duì)應(yīng)的循環(huán)個(gè)數(shù),(200*400)*100/64i;
delayLoopCount=8000000/(i*64);就是100us的for循環(huán)個(gè)數(shù)
評(píng)論