今天要學習的是獨立看門狗,看門狗電路的應用,使單片機可以在無人狀態(tài)下實現連續(xù)工作,其 工作原理是:看門狗芯片和單片機的一個I/O引腳相連,該I/O引腳通過程序控制它定時地往看門狗的 這個引腳上送入高電平(或低電平),這一程序語句是分散地放在單片機其他控制語句中間的,一旦單片機由于干擾造成程序跑飛后而陷入某一程序段進入死循環(huán)狀態(tài)時,寫看門狗引腳的程序便不 能被執(zhí)行,這個時候,看門狗電路就會由于得不到單片機送來的信號,便在它和單片機復位引腳相 連的引腳上送出一個復位信號,使單片機發(fā)生復位。即程序從程序存儲器的起始位置開始執(zhí)行,這樣便實現了單片機的自動復位。
1.1獨立看門狗簡介
看門狗定時器 (WDT,Watch Dog Timer)是單片機的組成部分,它實際上是一個計數器,一般 給看門狗一個數值,程序開始運行后看門狗開始倒計時。如果程序運行正常,過一段時間CPU應發(fā) 出指令讓看門狗復位,重新開始計數,也就是所謂的“喂狗”。如果看門狗減到0就認為程序沒有正常 工作,強制整個系統(tǒng)復位。獨立看門狗由專用低速時鐘(LSI)驅動,計時主時鐘發(fā)生故障它也仍然 有效。 看門狗主要是用于在發(fā)生系統(tǒng)軟件故障時,將系統(tǒng)復位。也可以用于將系統(tǒng)從休眠或空閑模式喚 醒。IWDG主要應用于那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,并且對時間精度 要求較低的場合。
1.2獨立看門狗功能描述
獨立看門狗是自由運行的遞減計數器,時鐘由獨立的RC振蕩器提供(可在停止和待機模式下工 作),看門狗被激活后,在計數器計數到0x000時產生復位。 在鍵寄存器(IWDG_KR)中寫入0xCCCC,開始啟用獨立看門狗;此時計數器開始從其復位值 0xFFF遞減計數。當計數器計數到末尾0x000時,會產生一個復位信號(IWDG_RESET)。無論何 時,只要在鍵寄存器IWDG_KR中寫入0xAAAA,IWDG_RLR中的值就會被重新加載到計數器,從而 避免產生看門狗復位。
其中,預分頻寄存器(IWDG_PR),最低三位PR[2:0](Prescaler divider)有效,可設置有8種不同的計數器時鐘預分頻因子。
重裝載寄存器(IWDG_RLR)低12位RL[11:0]: 看門狗計數器重裝載值 (Watchdog counter reload value) 有效,用來設置計數器的重裝載值。
注意要設置以上兩個寄存器的值需滿足兩個條件,詳見如下:
鍵寄存器(IWDG_KR),用來控制去除IWDG_PR和IWDG_RLR寫保護功能以便正常寫值,向此寄存器寫入0x5555則暫時去除IWDG_PR和IWDG_RLR的寫保護功能才可向兩個寄存器中寫值。
當向此寄存器寫入0xAAAA則IWDG_RLR的值會重裝載,防止MCU復位,向入0xCCCC是開啟狗立看門狗動作。
狀態(tài)寄存器(IWDG_SR)最低兩位有效RVU: 看門狗計數器重裝載值更新 (Watchdog counter reload value update) 標識位和PVU: 看門狗預分頻值更新 (Watchdog prescaler value update) 標識位,分別用來指示此時是否可向IWDG_RLR 和 IWDG_PR寫值,此寄存器由硬件置1與清0,只有當為0時才可向上面兩個寄存器寫值。
窗口看門狗中斷函數是在遞減計數器減少到0x40是被調用,因為它本身計數就比較慢,所以離數到0x3F復位還有一段時間,我認為這樣設計是為MCU復位之前留下一點時間,能夠使工程設計人員根據需要在中斷函數保存一些重要的數據,這樣在復位后MCU可知道系統(tǒng)因異常復位的某此狀態(tài),以使系統(tǒng)有更高穩(wěn)定性。
控制寄存器(WWDG_CR)中的值必須在0xFF與0xC0之間, 因為它的第0至第6位為遞減計數器CNT,在它的第6位變?yōu)?時將產生復位,所以在初始化時需要為1,第7位WDGA是用來設置啟動或禁止窗口看門狗的,當為1進才會啟動窗口看門狗,所以第6和第7位都需為1,即WWDG_CR 的值需要大于等于0xC0 。配置寄存器(WWDG_CFR) 第0至第6位 是設置窗口邊界值用的,只有當遞減計數器CNT的值小于邊界值時才可以喂狗,過早不行,狗還不餓,撐死了。
并且我覺得在窗口看門狗中斷函數中喂狗沒有什么意義,程序本來已經不按正常運行了,還在中斷函數中喂狗防止復位只會錯上加錯,不好好利用它干點正事,更是浪費資源。