新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM7S3C44b0看門狗作延時函數

        ARM7S3C44b0看門狗作延時函數

        作者: 時間:2016-11-27 來源:網絡 收藏
        static int delayLoopCount=400;

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

        本文引用地址:http://www.104case.com/article/201611/322312.htm

        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循環個數



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 新巴尔虎右旗| 绿春县| 上饶县| 隆德县| 丘北县| 西峡县| 化隆| 聊城市| 天柱县| 彰化市| 田阳县| 清苑县| 瑞昌市| 无棣县| 磐安县| 镇赉县| 青岛市| 岑溪市| 资阳市| 年辖:市辖区| 庄河市| 阿勒泰市| 哈巴河县| 富平县| 梁山县| 奎屯市| 洱源县| 浠水县| 泗阳县| 呈贡县| 哈尔滨市| 白水县| 涿州市| 丹江口市| 巨鹿县| 安泽县| 泰和县| 江永县| 蒲江县| 绥阳县| 营山县|