您的位置 首页 分销

ARM7S3C44b0看门狗作延时函数

staticintdelayLoopCount=400;voidDelay(inttime){inti,adjust=0;if(time==0)校准{time=200;adjust=1;delayLo

static int delayLoopCount=400;

void Delay(int time)
{
int i,adjust=0;

if(time==0)//校准
{
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)
}
}

初看这个函数时有问题的,花了很长时刻才搞懂,很经典的一段程序。

(1)这个函数在运用前必须先运转一下Delay(0),这个是要害。它首要完结的是delayLoopCount变量的核算,即100uS的校准。

(2)假定MCLK=66M,

rWTCON=((MCLK/1000000-1)<<8)|(2<<3);通过预分频,输出频率1M,即1us计时;时钟除数因子=1/64,即看门狗定时器对1M的64分频计数, 计数一次是64us,每64usWTCON减1。

(3)for(i=0;i

(4)用此函数前,先用Delay(0)校准,一个是两个for循环延时。for循环延时一起,定时器计数。

200*400个循环对应——看门狗计数次数i(i=0xffff-rWTCNT,计数一次是64us),延时64*i个us;(200*400)/64i是每个us循环的个数, 100us对应的循环个数,(200*400)*100/64i;

delayLoopCount=8000000/(i*64);便是100us的for循环个数

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/257212.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部