新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM 學習筆記六 (看門狗中斷試驗)

        ARM 學習筆記六 (看門狗中斷試驗)

        作者: 時間:2016-11-20 來源:網絡 收藏
        什么是看門狗呢?我也不是很清楚,網上資料說看門狗的作用就是防止程序發生死循環,或者說程序跑飛。工作原理:在系統運行以后也就啟動了看門狗的計數器,看門狗就開始自動計數,如果到了一定時間,不給把看門狗的計數清0,就會引起計數益處中斷,產生系統復位。

        但是我知道S3c2440啟動代碼里一開始就禁止看門狗了。所以,一般都用不上吧。除非你的應用程序實時性比較高,那就得考慮用看門狗來看門了。

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

        #define GLOBAL_CLK 1

        #include "def.h"
        #include "2440addr.h"
        #include "mmu.h"
        #include "option.h"

        #define LED1 (1<<5) // rGPB[5] =1 ;
        #define LED2 (1<<6) // rGPB[6] =1 ;
        #define LED3 (1<<7) // rGPB[7] =1 ;
        #define LED4 (1<<8) // rGPB[8] =1 ;

        static int index=0;

        void Delay1(int time)
        {
        unsigned int i,j;
        for(i=1;i<100;i++)
        for(j=1;j ;
        }

        void LightLED(void){

        rGPBDAT = 0xfff;

        if ( index==1 )
        rGPBDAT=rGPBDAT & ~LED1;

        if ( index==2 )
        rGPBDAT=rGPBDAT & ~LED2;

        if ( index==3)
        rGPBDAT=rGPBDAT & ~LED3;

        if ( index==4 )
        rGPBDAT=rGPBDAT & ~LED4;

        Delay1( 20000 ) ;


        }
        void __irq WatchDog_ISR(void){

        rSUBSRCPND = BIT_SUB_WDT; //注意用到子中斷源寄存器
        rSRCPND = BIT_WDT_AC97;
        rINTPND = BIT_WDT_AC97;


        if (index >4 ){
        index=1;
        }
        else{
        index++;
        }
        LightLED();


        }

        void EINT_Init(void){

        ClearPending(BIT_WDT_AC97);

        pISR_WDT_AC97=(unsigned int)WatchDog_ISR;
        //Prescaler value=100; lock dividion factor=128;PCLK=67.5MHz
        //t_watchdog=1/[PCLK/(Prescaler value+1)/Division_factor]=0.0002
        //disable watchdog
        rWTCON=0x6418; //01100100 00 0 11 0 0 0
        //周期T=WTCNT*t_watchdog=3S
        rWTDAT=15000;
        rWTCNT=15000;

        rINTMSK &= (~BIT_WDT_AC97);
        rINTSUBMSK &= (~BIT_SUB_WDT); //這個要用子中斷屏蔽寄存器

        rWTCON=0x643c; //01100100 00 1 11 1 0 0

        }

        void Main(void){
        rGPBCON = 0x015550;
        rGPBUP = 0x7ff;

        ChangeClockDivider(3,1);
        ChangeMPllValue(127,2,1);

        MMU_Init();


        EINT_Init();
        while (1);

        }

        上面的程序每隔3秒會自動點亮一個LED.實現定時跑馬燈的效果。

        這個例子我本想參考按鍵的例子來寫代碼,但是中途發現按鍵的例子不適用于看門狗。

        因為看門狗是內部中斷,按鍵是外部中斷。另外最讓我不明白的是,書上或是網上很多例子都用


        pISR_WDT_AC97作為看門狗中斷服務的向量地址。嘗試用TIME0,TIME1都不行。奇怪啊



        關鍵詞: ARM看門狗中斷試

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 利津县| 呈贡县| 安宁市| 寻甸| 台东县| 板桥市| 五大连池市| 土默特左旗| 东辽县| 南涧| 佛教| 徐水县| 蛟河市| 顺昌县| 河池市| 来安县| 利津县| 赤水市| 昭通市| 布拖县| 潼关县| 保亭| 大关县| 汝州市| 霞浦县| 元朗区| 大竹县| 都昌县| 集贤县| 伊通| 北流市| 泰和县| 鸡泽县| 揭西县| 深州市| 台山市| 天全县| 临夏县| 介休市| 安乡县| 钟山县|