久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

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

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

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

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

本文引用地址:http://cqxgywz.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看門狗中斷試

評論


技術專區

關閉