<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 裸奔程序之看門(mén)狗定時(shí)器

裸奔程序之看門(mén)狗定時(shí)器

作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò ) 收藏
WATCHDOG定時(shí)器簡(jiǎn)介:

WATCHDOG定時(shí)器也可以像一般的16位定時(shí)器一樣用于產(chǎn)生周期性中斷,也可以用于發(fā)出復位信號以重啟時(shí)常的系統。它的結構與PWM很相似,如下圖所示:

本文引用地址:http://dyxdggzs.com/article/201611/318178.htm

從上圖我們可以發(fā)現,WATCHDOG 定時(shí)器先經(jīng)過(guò)8位預分頻將PCLK分頻后,被再次分頻得到4種頻率,16分頻、32分頻、64分頻、128分頻,WATCHDOG 定時(shí)器可以通過(guò)設置 WTCON[4:3]來(lái)決定工作在哪種頻率之下,WTCHT 寄存器按照其工作頻率減1計數,當達到0時(shí),可以產(chǎn)生中斷信號,可以輸出復位信號。在第一次使用WATCHDOG 定時(shí)器時(shí),需要往WTCNT 寄存器中寫(xiě)入初始計數值,以后在計數值到達0時(shí),自動(dòng)從WATDAT 寄存器中裝入,重新開(kāi)始下一個(gè)計數值。

使用WATCHDOG定時(shí)器的“WATCHDOG 功能”時(shí),在正常的程序中,必須不斷重新設置WTCNT 寄存器,使之不為0,這樣可以保證系統不被重啟,這就是所謂的“喂狗”啦。當程序崩潰時(shí)不能正常“喂狗”,計數值達到0后系統將被重啟,這樣程序將重新運行。

有關(guān)WATCHDOG 定時(shí)器的寄存器只有3個(gè)。我們來(lái)簡(jiǎn)單介紹一下:

1、WTCON 寄存器(WATCHDOG TIMER CONTROL)

用于設置分頻系數,選擇工作頻率,決定是否使能中斷,是否啟用WATDOG 功能(即是否輸出復位信號),WATCHDOG 定時(shí)器的工作頻率可以通過(guò)下面這個(gè)公式計算:
WATCHDOG 定時(shí)器工作頻率 = PCLK / {prescaler +1 } / {divider value }

{prescaler value } = 0~255, {divider value} = 16,32,64,128。

2、WTDAT 寄存器(WATCHDOG TIMER DATA)

WTDAT 寄存器被用來(lái)決定WATCHDOG 定時(shí)器的超時(shí)周期,在定時(shí)器啟動(dòng)后,當計數達到0時(shí),WTDAT 寄存器的值會(huì )自動(dòng)傳入 WTCNT 寄存器。不過(guò),第一次啟動(dòng)WATCHDOG 定時(shí)器時(shí),WTDAT 寄存器的值不會(huì )自動(dòng)傳入WTNT寄存器,這就需要首先在WTNT裝入初值啦。

3、WTCNT 寄存器(WATCHDOG TIMR COUNT)

在啟動(dòng)WATCHDOG 定時(shí)器前,必須往WTCNT這個(gè)寄存器寫(xiě)入初始計數值。啟動(dòng)定時(shí)器后,它減1計數,當計數值達到0時(shí),如果中斷被使能的話(huà),就會(huì )發(fā)出中斷請求;如WATCHDOG功能被使能的話(huà),將會(huì )發(fā)出復位信號,裝載 WTDAT寄存器的值并重新計數。

注意:

當使能中斷的時(shí)候,WATCHDOG定時(shí)器中斷是有次級中斷源的,初始化中斷的時(shí)候需要格外注意。

————————————————————————————————————————————

下面開(kāi)始講解main.c程序:

#include "2440addr.h"
#include "Option.h"


#define LED1_ON (rGPBDAT &=~(1<<5))
#define LED1_OFF (rGPBDAT |=(1<<5) )
#define LED2_ON (rGPBDAT &=~(1<<6))
#define LED2_OFF (rGPBDAT |=(1<<6))
#define LED3_ON (rGPBDAT &=~(1<<7))
#define LED3_OFF (rGPBDAT |=(1<<7))
#define LED4_ON (rGPBDAT &=~(1<<8))
#define LED4_OFF (rGPBDAT |=(1<<8))

void __irq Wdt_Int(void);

void Delay(void)
{
int i;
for(i=0;i<1000000;i++);
}

void Main(void)
{
rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16)); //對GPBCON[10:17]清零
rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16)); //設置GPB5~8為輸出
rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //設置GPB5~8的上拉功能
rGPBDAT |=(1<<5)|(1<<6)|(1<<7)|(1<<8); //關(guān)閉LED

rGPBCON |=1; //輸出
rGPBUP |=0;
rGPBDAT|=0; //關(guān)閉蜂鳴器

rWTDAT=50000; //設置看門(mén)狗定時(shí)器超時(shí)時(shí)間為4秒(50÷12.5)
rWTCNT=50000;
rWTCON=(249<<8)|(1<<5)|(0<<3)|(1<<2);//預分頻值為249,使能看門(mén)狗,分頻系數為16,中斷使能

rSRCPND |=BIT_WDT_AC97;
rINTPND |=BIT_WDT_AC97;
rSUBSRCPND |= BIT_SUB_WDT; //清除中斷標志

rINTMSK &= ~(BIT_WDT_AC97);
rINTSUBMSK &= ~(BIT_SUB_WDT);//開(kāi)中斷

pISR_WDT_AC97=(unsigned)Wdt_Int;//設置中斷程序入口
while(1)
{
LED1_ON;Delay();LED1_OFF;
LED2_ON;Delay();LED2_OFF;
LED3_ON;Delay();LED3_OFF;
LED4_ON;Delay();LED4_OFF;
rWTCNT=50000; //喂狗 沒(méi)喂狗蜂鳴器很響
}
}

void __irq Wdt_Int(void)
{
rSRCPND |=BIT_WDT_AC97;
rINTPND |=BIT_WDT_AC97;
rSUBSRCPND |= BIT_SUB_WDT; //清除中斷標志
rGPBDAT =1;
Delay();// from 2440lib.c
rGPBDAT =0; //蜂鳴器響一段時(shí)間
}

—————————————————————————————————————————————

我們首先來(lái)看main函數,進(jìn)入main函數之后,首先是設置LED1~4對應管腳為輸出、使能上拉、關(guān)閉全部LED。(前面四句)

接著(zhù)三句是設置蜂鳴器控制管腳GPB0為輸出、使能上拉、關(guān)閉蜂鳴器。

我們先來(lái)看這句 rWTCON=(249<<8)|(1<<5)|(0<<3)|(1<<2);//預分頻值為249,使能看門(mén)狗,分頻系數為16,中斷使能

通過(guò)WATCHDOG 定時(shí)器工作頻率 = PCLK / {prescaler +1 } / {divider value }

{prescaler value } = 0~255, {divider value} = 16,32,64,128。

計算求得WATCHDOG工作頻率為12500Hz,即每秒鐘計數12500次。

再回頭來(lái)看看上面那二句就很清楚的知道是定時(shí)器4秒的意思啦。

rWTDAT=50000; //設置看門(mén)狗定時(shí)器超時(shí)時(shí)間為4秒(50÷12.5)
rWTCNT=50000;

接下來(lái)是清除中斷標志,注意WATCHDOG是有次級中斷源的,所以需要清除二個(gè)中斷掛起寄存器。

rSRCPND |=BIT_WDT_AC97;
rINTPND |=BIT_WDT_AC97;
rSUBSRCPND |= BIT_SUB_WDT; //清除中斷標志

接下來(lái)是打開(kāi)中斷,也是打開(kāi)二個(gè)中斷允許寄存器。

rINTMSK &= ~(BIT_WDT_AC97);
rINTSUBMSK &= ~(BIT_SUB_WDT);//開(kāi)中斷

接下來(lái)是設置中斷的起始地址,將中斷服務(wù)程序的起始地址映射到內存。

pISR_WDT_AC97=(unsigned)Wdt_Int;//設置中斷程序入口

我們進(jìn)入中斷服務(wù)程序看看:

——————————————————————————————————————————————

void __irq Wdt_Int(void)
{
rSRCPND |=BIT_WDT_AC97;
rINTPND |=BIT_WDT_AC97;
rSUBSRCPND |= BIT_SUB_WDT; //清除中斷標志
rGPBDAT =1; //蜂鳴器響
Delay();
rGPBDAT =0; //蜂鳴器響一段時(shí)間
}

——————————————————————————————————————————————

進(jìn)入中斷服務(wù)程序后,首先清楚中斷標志,接著(zhù)讓蜂鳴器響一下,接著(zhù)關(guān)閉。

最后進(jìn)入死循環(huán),前面四句是循環(huán)點(diǎn)亮LED燈,接著(zhù)重新賦值給WTCNT,實(shí)現喂狗功能。

rWTCNT=50000; //喂狗 沒(méi)喂狗蜂鳴器很響

——————————————————————————————————————————————

到這里,我們WATCHDOG 定時(shí)器的講解結束啦。



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>