當(dāng)受到各種各樣的干擾而使GPRS DTU不能執(zhí)行正常的程序時(shí),需要了解看門狗定時(shí)器(WDT),它具有兩種功能,其一作為普通的定時(shí)器,該模式下產(chǎn)生正常的定時(shí)中斷信號;其二作為通常意義上的看門狗,用來復(fù)位單片機(jī),避免單片機(jī)長時(shí)間處于不正常工作狀態(tài)??撮T狗程序只是用來把單片機(jī)從不正常的工作狀態(tài)中拉回來,也就是說正常情況下,它是靜默的,程序運(yùn)行過程中必須在適當(dāng)?shù)臅r(shí)間間隔內(nèi)喂狗。如果用戶程序執(zhí)行時(shí)間很長到不能滿足喂狗時(shí)間,這時(shí)候應(yīng)當(dāng)將用戶程序盡可能模塊化、時(shí)間片化以滿足喂狗時(shí)間。鑒于看門狗的工作職責(zé),看門狗寄存器值的讀寫通常采用密碼字+數(shù)據(jù)的方式,以防止單片機(jī)正常執(zhí)行過程中對看門狗的誤寫??撮T狗初始化和喂狗操作程序如下所示:
#include
#include "wdt.h"
/*******************************************
函數(shù)名稱:看門狗初始化程序
功 能:看門狗設(shè)定32ms,看門狗時(shí)鐘選擇SMCLK
參 數(shù):無
返回值 :無
********************************************/
void wdt_init(void)
{
WDTCTL = WDT_MRST_32; // 設(shè)定看門狗定時(shí)器32ms復(fù)位
}
/*******************************************
函數(shù)名稱:喂狗程序
功 能:清零看門狗定時(shí)器計(jì)數(shù)值
參 數(shù):無
返回值 :無
********************************************/
void wdt_clear(void)
{
WDTCTL = WDTPW + WDTCNTCL; // 清零看門狗定時(shí)器
}
該程序設(shè)定看門狗時(shí)鐘采用SMCLK,設(shè)定最大喂狗時(shí)間為32ms,當(dāng)用戶程序在規(guī)定的32ms內(nèi)沒有清零看門狗定時(shí)器的計(jì)數(shù)值,看門狗定時(shí)器溢出,產(chǎn)生復(fù)位信號,最終復(fù)位單片機(jī)。注意到看門狗計(jì)數(shù)值清零與初始化為同一個(gè)寄存器,采用賦值的方式清零看門狗定時(shí)器計(jì)數(shù)值,同時(shí)會改變看門狗定時(shí)器的工作模式。本程序之所以可以按用戶的設(shè)定運(yùn)行,是因?yàn)榭撮T狗定時(shí)器采用SMCLK時(shí)鐘,喂狗操作正好不改變寄存器相應(yīng)工作模式位的設(shè)定值。但是如果選擇ACLK作為時(shí)鐘,采用該喂狗操作就會影響看門狗的工作模式了。假如設(shè)定看門狗定時(shí)器1000ms復(fù)位,WDTCTL = WDT_ARST_1000;喂狗之后就變成32ms自動復(fù)位了。用戶程序如果沒有在32ms內(nèi)喂狗,程序就一直停在復(fù)位了。
注意到設(shè)定模式時(shí)同時(shí)具有清零的功能,正常的喂狗程序即為初始化設(shè)置程序WDTCTL = WDT_ARST_1000。
#include
#include "wdt.h"
/*******************************************
函數(shù)名稱:看門狗初始化程序
功 能:看門狗設(shè)定1000ms,看門狗時(shí)鐘選擇ACLK
參 數(shù):無
返回值 :無
********************************************/
void wdt_init(void)
{
WDTCTL = WDT_ARST_1000; // 設(shè)定看門狗定時(shí)器1000ms復(fù)位
}
/*******************************************
函數(shù)名稱:喂狗程序
功 能:清零看門狗定時(shí)器計(jì)數(shù)值
參 數(shù):無
返回值 :無
********************************************/
void wdt_clear(void)
{
WDTCTL = WDT_ARST_1000; // 清零看門狗定時(shí)器
}
看門狗程序用來把單片機(jī)從不正常的工作狀態(tài)中拉回來,也就是說不正常情況下,它是運(yùn)作的,程序不正常運(yùn)行過程中不應(yīng)該滿足喂狗條件,從而產(chǎn)生需要的復(fù)位信號,復(fù)位單片機(jī)。這樣來看,喂狗程序不能放在中斷中,因?yàn)橹鞒绦蚩赡芘茱w了,中斷程序仍能正常工作,這樣看門狗程序失去作用。