AVR的一點(diǎn)馴狗心得
AVR新的看門(mén)狗與舊狗(例如,ATMEGA16等)比較,增加了新的功能的同時(shí)脾氣也有了不少改變。設計時(shí)要摸清它的脾氣,以防被狗咬。
下面說(shuō)明以ATMEGA16和ATMEGA168作一個(gè)簡(jiǎn)單比較為例,簡(jiǎn)要地說(shuō)明一下注意要點(diǎn):
看門(mén)狗定時(shí)器控制寄存器– WDTCR:
Atmega16:

Atmega168:

1.A1tmega168由于具有中斷功能,所以WDTCR增加了WDIF和WDIE兩個(gè)額外的bit的功能;
2.增加了WDP3,溢出周期可以有長(cháng)達8秒;
3.新的看門(mén)狗在初始化時(shí),WDT的值不再一定是0。只要MCUSR寄存器上的WDRF置位,WDT也將被強制置位。這時(shí),如果WDE要清零,必須要WDRF先清零。
4.在設計時(shí)即使不用WDT,它也可能在無(wú)意中被能使,例如在runaway指針和調電情況下。因此即使不用WDT,在初始代碼中一定要檢查復位標志,如果WDT系統復位發(fā)生要采取處理步驟。
最近重新設計一個(gè)項目,由原先使用的ATMEGA16更新到ATMEGA168。把原代碼轉換后,測試結果異常。經(jīng)過(guò)一天多的測試,才發(fā)現是新的看門(mén)狗惹的禍。以前用ATMEGA16,在初始化后才開(kāi)始喂狗,可是新的AVR系列(例如ATMEGA168等),系統復位發(fā)生時(shí)(除上電復位外) ,WDT可能繼續運行,并使用最小溢出周期(大約15mS) ,造成了系統不斷復位。根據datasheet,在程序開(kāi)始時(shí)的關(guān)狗后一切就恢復正常了:
#include
#include
uint8_t mcusr_mirror;
void get_mcusr(void)
__attribute__((naked))
__attribute__((section(".init3")));
void get_mcusr(void)
{
mcusr_mirror = MCUSR;
MCUSR = 0;
wdt_disable();
}
5.使用看門(mén)狗的中斷時(shí),當WDIF和WDIE置位,就會(huì )產(chǎn)生中斷。進(jìn)入相應的中斷程序后,系統自動(dòng)WDIF和WDIE清零。下次要使用看門(mén)狗的中斷時(shí)必須重新WDIE置位。
評論