ATMEGA128看門(mén)狗定時(shí)器
一、ATMEGA128數(shù)據(jù)手冊(cè)
看門(mén)狗定時(shí)器
看門(mén)狗定時(shí)器由獨(dú)立的1 Mhz 片內(nèi)振蕩器驅(qū)動(dòng)。這是VCC= 5V 時(shí)的典型值。請(qǐng)參見(jiàn)特性數(shù)據(jù)以了解其他VCC電平下的典型值。通過(guò)設(shè)置看門(mén)狗定時(shí)器的預(yù)分頻器可以調(diào)節(jié)看門(mén)狗復(fù)位的時(shí)間間隔,如P53 Table 22 所示。看門(mén)狗復(fù)位指令WDR用來(lái)復(fù)位看門(mén)狗定時(shí)器。此外,禁止看門(mén)狗定時(shí)器或發(fā)生復(fù)位時(shí)定時(shí)器也被復(fù)位。復(fù)位時(shí)間有8 個(gè)選項(xiàng)。如果沒(méi)有及時(shí)復(fù)位定時(shí)器,一旦時(shí)間超過(guò)復(fù)位周期,ATmega128 就復(fù)位,并執(zhí)行復(fù)位向量指向的程序。具體的看門(mén)狗復(fù)位時(shí)序在P50 有說(shuō)明。
為了防止無(wú)意之間禁止看門(mén)狗定時(shí)器或改變了復(fù)位時(shí)間,根據(jù)熔絲位M103C 和 WDTON 芯片提供了3 個(gè)不同的保護(hù)級(jí)別,如Table 21. 所示。安全級(jí)別0 相應(yīng)于A(yíng)Tmega103 的 設(shè)置。使能看門(mén)狗定時(shí)器則沒(méi)有限制。請(qǐng)參考P 54“ 改變看門(mén)狗定時(shí)器配置的時(shí)間序列”。
看門(mén)狗定時(shí)器控制寄存器- WDTCR
? Bits 7..5 – Res: 保留
保留位,讀操作返回值為零。
? Bit 4 – WDCE: 看門(mén)狗修改使能
清零WDE 時(shí)必須先置位WDCE,否則不能禁止看門(mén)狗。一旦置位,硬件將在緊接的4 個(gè) 時(shí)鐘周期之后將其清零。請(qǐng)參考有關(guān)WDE 的說(shuō)明來(lái)禁止看門(mén)狗。工作于安全級(jí)別1 和2 時(shí)也必須置位WDCE 以修改預(yù)分頻器的數(shù)據(jù),如P 54 “ 改變看門(mén)狗定時(shí)器配置的時(shí)間序列” 所示。
? Bit 3 – WDE: 看門(mén)狗使能
WDE為"1“時(shí),看門(mén)狗使能,否則看門(mén)狗將被禁止。只有在WDCE為"1“時(shí)WDE才能清零。以下為關(guān)閉看門(mén)狗的步驟:
1. 在同一個(gè)指令內(nèi)對(duì)WDCE 和WDE 寫(xiě)"1“,即使WDE 已經(jīng)為"1“。
2. 在緊接的4 個(gè)時(shí)鐘周期之內(nèi)對(duì)WDE 寫(xiě)"0”。
工作于安全級(jí)別2 時(shí)是永遠(yuǎn)無(wú)法禁止看門(mén)狗定時(shí)器的。參見(jiàn) P 54 “ 改變看門(mén)狗定時(shí)器配置的時(shí)間序列” 。
? Bits 2..0 – WDP2, WDP1, WDP0: 看門(mén)狗定時(shí)器預(yù)分頻器2, 1, 和0
WDP2、WDP1 和WDP0 決定看門(mén)狗定時(shí)器的預(yù)分頻器,如Table 22 所示。
下面的例子分別用匯編和C 實(shí)現(xiàn)了關(guān)閉WDT 的操作。在此假定中斷處于用戶(hù)控制之下 (比如禁止全局中斷) ,因而在執(zhí)行下面程序時(shí)中斷不會(huì)發(fā)生。
匯編代碼例程WDT_off:; 置位 WDCE 和 WDE
ldir16, (1<
; 關(guān)閉WDT
ldir16, (0<
ret
C 代碼例程
voidWDT_off(void)
{
WDTCR = (1<
WDTCR = 0x00;
}
看門(mén)狗初始化程序
C 代碼例程
voidWDT_Init(void)
{
_WDR();//reset watchdog timer
WDTCR |= (1<
}
改變看門(mén)狗定時(shí)器配置的時(shí)間序列
改變配置的序列根據(jù)不同的安全級(jí)別略有不同。下面將逐一說(shuō)明。
安全級(jí)別0
這個(gè)模式與ATmega103 的看門(mén)狗操作相兼容??撮T(mén)狗的初始狀態(tài)是禁止的,可以沒(méi)有限制地通過(guò)置位WDE 來(lái)使能它,以及改變定時(shí)器溢出周期。禁止看門(mén)狗定時(shí)器時(shí)則需要遵 守有關(guān)WDE 的說(shuō)明。
安全級(jí)別1
在這個(gè)模式下,看門(mén)狗定時(shí)器的初始狀態(tài)是禁止的,可以沒(méi)有限制地通過(guò)置位WDE 來(lái)使能它(例如:WDTCR|= (1<
2. 在緊接的4 個(gè)時(shí)鐘周期之內(nèi)同時(shí)對(duì)WDE 寫(xiě)"0”,以及為WDP 寫(xiě)入合適的數(shù)據(jù),而WDCE 則寫(xiě)"0”。
安全級(jí)別2
在這個(gè)模式下,看門(mén)狗定時(shí)器總是使能的, WDE 的讀返回值為"1”。 改變定時(shí)器溢出周期需要執(zhí)行一個(gè)特定的時(shí)間序列:
1. 在同一個(gè)指令內(nèi)對(duì)WDCE和WDE寫(xiě)"1“。雖然WDE總是為置位狀態(tài),也必須寫(xiě)"1“以啟動(dòng)時(shí)序。
2. 在緊接的4 個(gè)時(shí)鐘周期之內(nèi)同時(shí)對(duì)WDCE 寫(xiě)"0”,以及為WDP 寫(xiě)入合適的數(shù)據(jù)。WDE 的數(shù)值可以任意。
二、看門(mén)狗AVR-GCC例程
頭文件:#include ,包含看門(mén)狗復(fù)位命令 _WDR();
avr-libc 提供三個(gè)API 支持對(duì)器件內(nèi)部Watchdog 的操作,它們分別是:
wdt_reset() // Watchdog 復(fù)位
wdt_enable(timeout) // Watchdog 使能
wdt_disable() // Watchdog 禁止
調(diào)用上述函數(shù)前要包含頭文件 wdt.h ,wdt.h 中還定義Watchdog 定時(shí)器超時(shí)符號(hào)常量,它們用于為wdt_enable 函數(shù)提供timeout 值。符號(hào)常量分別如下:
符號(hào)常量值含意
WDTO_15MS Watchdog定時(shí)器15 毫秒超時(shí)
WDTO_30MS Watchdog定時(shí)器30 毫秒超時(shí)
WDTO_60MS Watchdog定時(shí)器60 毫秒超時(shí)
WDTO_120MS Watchdog定時(shí)器120 毫秒超時(shí)
WDTO_250MS Watchdog定時(shí)器250 毫秒超時(shí)
WDTO_500MS Watchdog定時(shí)器500 毫秒超時(shí)
WDTO_1S Watchdog定時(shí)器1 秒超時(shí)
WDTO_2S Watchdog定時(shí)器2 秒超時(shí)
Watchdog 測(cè)試程序:
在CA-M8 上執(zhí)行此程序時(shí)應(yīng)打開(kāi)S1-8(LEDY),使黃色發(fā)光管連接PB0 引腳。
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define SET_LED PORTB&=0XFE //PB0 接黃色發(fā)光管
#define CLR_LED PORTB|=0X01
//誤差不會(huì)太大的延時(shí)1ms 函數(shù)
void DelayMs(uint ms)
{
uint i;
for(i=0;i
_delay_loop_2(4 *250);
}
int main(void)
{
DDRB=_BV(PB0);
PORTB=_BV(PB0); //CLR_LED
//WDT 計(jì)數(shù)器同期為一秒
wdt_enable(WDTO_1S);
wdt_reset();//喂狗
DelayMs(500);
SET_LED;
//等待餓死狗
DelayMs(5000);
SET_LED;
while(1)
wdt_reset();
}
執(zhí)行結(jié)果:
CA-M8 上的黃色發(fā)光管不斷的閃爍,證明了Watchdog 使MCU 不斷的復(fù)位。
三、注意事項(xiàng)
如果循環(huán)體內(nèi)每循環(huán)一次的時(shí)間不超過(guò)看門(mén)狗的復(fù)位時(shí)間,主要喂狗一次就可以,否則需要多次喂狗。