引言:硬體中的看門狗,不是門衛的意思,而是一隻很兇的狗!如果你不按時喂它,它就會讓系統重新開機!這反而是我們想要的功能~
1、看門狗概述
看門狗定時器(WDT,Watch Dog Timer)是單片機的一個組成部分,它實際上是一個計數器,一般給看門狗一個數字,程式開始運作後看門狗開始倒計數。如果程式運作正常,過一段時間CPU應發出指令讓看門狗複位,重新開始倒計數。如果看門狗減到0就認為程式沒有正常工作,強制整個系統複位。是以可以用看門狗防止程式在跑飛的時候回不到正常模式。
看門狗可用于受到電氣噪音、電源故障、靜電放電等影響的應用,或需要高可靠性的環境。如果一個應用不需要看門狗功能,可以配置看門狗定時器為一個間隔定時器,這樣可以用于在標明的時間間隔産生中斷。
The features of the Watchdog Timer are as follows:
● 四個可選的定時器間隔
● 看門狗模式
● 定時器模式
● 在定時器模式下産生中斷請求
WDT 可以配置為一個看門狗定時器或一個通用的定時器。WDT 子產品的運作由WDCTL 寄存器控制。看門狗定時器包括一個15 位計數器,它的頻率由32kHz 時鐘源規定。注意使用者不能獲得15 位計數器的内容。在all power modes下,15 位計數器的内容保留,且當重新進入active mode,看門狗定時器繼續計數。
2、看門狗模式
當系統重新開機後看門狗定時器失能。To start the WDT in watchdog mode, the WDCTL.MODE[1:0] bits must be set to 10. The Watchdog Timer counter then starts incrementing from 0. When the timer is enabled in watchdog mode, it is not possible to disable the timer. Therefore, writing 00 or 01 to WDCTL.MODE[1:0] has no effect if the WDT is already operating in Watchdog mode.
WDT 運作在一個頻率為32.768 kHz(當使用32 kHz XOSC時)的看門狗定時器時鐘上。這個時鐘頻率的逾時期限等于1.9ms,15.625 ms,0.25 s 和1s,分别對應64,512,8192 和32768 的計數值設定。
當計數器達到設定的計數值時,看門狗會對系統産生一個reset信号,如果在計數器到達設定值之前執行了看門狗clear序列,counter的值會被重置為0,并會繼續遞增。看們狗的clear序列包含:writing 0xA to WDCTL.CLR[3:0], followed by writing 0x5 to the same register bits within one watchdog clock period. 如果這個完整序列不能在watch dog時期結束前完成,看門狗就會産生一個系統reset信号。
When the WDT has been enabled in watchdog mode, it is not possible to change the mode by writing to the WDCTL.MODE[1:0] bits and the timer interval value can not be changed.
3、定時器模式
To start the WDT in timer mode, the WDCTL.MODE[1:0] bits must be set to 11. The timer is started and the counter starts incrementing from 0. When the counter reaches the selected interval value, the timer produces an interrupt request (IRCON2.WDTIF/IEN2.WDTIE).
In timer mode, it is possible to clear the timer contents by writing a 1 to WDCTL.CLR[0]. When the timer is cleared, the content of the counter is set to 0. Writing 00 or 01 to WDCTL.MODE[1:0] stops the timer and clears it to 0.
The timer interval is set by the WDCTL.INT[1:0] bits. The interval cannot be changed during timer operation, and should be set when the timer is started. In timer mode, a reset is not produced when the timer interval has been reached.
注意:如果看門狗模式被選擇,那隻能等到晶片reset之後定時器模式才能被選擇。
4、工程DEMO
main code:
<a></a>
其中42~46行用于看門狗初始化:
第44行令WDCTL為0是因為下表WDCTL中關于MODE介紹——MODE[1:0]是用來模式選擇,這兩位用來在Watchdog模式或Timer模式啟動看門狗定時器。其中有個主意說明“如果在timer模式想切換到看門狗模式,第一步需要停止WDT,然後才能在看門狗模式啟動WDT。當處在看門狗模式,向這些位寫資料是無效的”。是以向MODE中寫00是使讓看門狗處于IDLE模式(停止timer),接着才能啟動WDT。
第45行是設定INT,選擇超期時限為1s(即設定INT[1:0]=00)

第48~53行是喂狗的函數,其中第50、51行設定設定WDCTL為0xa0,緊接着設定為0x50,使一個clear序列,用于清除定時器(第2節紅色字型部分由介紹)
是以,整個工程的意思是:初始化看門狗并設定1s種的喂狗期限,如果整個工程執行過程中超過1s不喂狗,看門狗timer就會産生一個系統reset信号讓系統重置。是以代碼中69行如果注釋掉喂狗,帶來的結果就是系統不斷重新開機LED2不斷閃爍;如果喂狗則LED2常亮。
Zigbee系列文章:
<a href="http://www.cnblogs.com/zjutlitao/p/5641958.html" target="_blank">[ZigBee] 1、 ZigBee簡介</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5652025.html" target="_blank">[ZigBee] 2、 ZigBee開發環境搭建</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5652058.html" target="_blank">[ZigBee] 3、ZigBee基礎實驗——GPIO輸出控制實驗-控制Led亮滅</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5658395.html" target="_blank">[ZigBee] 4、ZigBee基礎實驗——中斷</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5658644.html" target="_blank">[ZigBee] 5、ZigBee基礎實驗——圖文與代碼詳解定時器1(16位定時器)(長文)</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5671921.html">[ZigBee] 6、ZigBee基礎實驗——定時器3和定時器4(8 位定時器)</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5675169.html" target="_blank">[ZigBee] 7、ZigBee之UART剖析(ONLY序列槽發送)</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5676675.html" target="_blank">[ZigBee] 8、ZigBee之UART剖析·二(序列槽收發)</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5677624.html">[ZigBee] 9、ZigBee之AD剖析——AD采集CC2530溫度序列槽顯示</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5683177.html" target="_blank">[ZigBee] 10、ZigBee之睡眠定時器</a>
<a href="http://www.cnblogs.com/zjutlitao/p/5686488.html">[ZigBee] 11、ZigBee之睡眠定時器二</a>
本文轉自beautifulzzzz部落格園部落格,原文連結:http://www.cnblogs.com/zjutlitao/p/5686834.html,如需轉載請自行聯系原作者