“看門狗定時器”是這樣一種東西,從功能上說它可以讓微控制器在意外狀況下(比如軟件陷入死循環(huán))重新回復(fù)到系統(tǒng)上電狀態(tài),以保證系統(tǒng)出問題的時候重啟一次。就跟我們現(xiàn)在用電腦一樣,死機了你就按一下reset鍵重啟一次電腦,看門狗就是負(fù)責(zé)干這個事兒的。它是52單片機增加的一個功能,以前Intel 8031、……、AT 89C51時代單片機片內(nèi)都沒有“看門狗”功能,需要我們外擴看門狗芯片,比如X5045。 很多人初次接觸不太理解怎么用,書上也講的含含糊糊,故意說的很復(fù)雜很玄妙(可能是現(xiàn)在寫書人的通病,生怕寫的簡單的別人覺得他沒水平)。其實要是說明白點:“看門狗”就是一個計數(shù)器,由于位數(shù)有限計數(shù)器能夠裝的數(shù)值是有限的(比如8位的最多裝256個數(shù)、16位的最多裝65536個數(shù)),從開啟“看門狗”那刻起,它就開始不停的數(shù)機器周期,數(shù)一個機器周期就計數(shù)器加1,加到計數(shù)器盛不下了(術(shù)語叫溢出)就就產(chǎn)生一個復(fù)位信號,重啟系統(tǒng)。 本文引用地址:http://m.butianyuan.cn/article/201611/321362.htm 注解:這里順便說一下,一般教材上叫“看門狗定時器”,其實定時器原理還是計數(shù)器,只是計的是時鐘周期,所以我為了初學(xué)者好理解叫統(tǒng)一叫“計數(shù)器”,這里闡明一下。 明白了上面的原理,我們在設(shè)計程序時,先根據(jù)看門狗計數(shù)器的位數(shù)和系統(tǒng)的時鐘周期算一下計滿數(shù)需要的時間,就是說在這個時間內(nèi)“看門狗”計數(shù)器是不會裝滿的,然后在這個時間內(nèi)告訴它重新開始計數(shù),就是把計數(shù)器清零,這個過程叫“喂狗”,這樣隔一段時間喂一次狗,只要程序正常運行他就永遠(yuǎn)計不滿,一旦出現(xiàn)死循環(huán)之類的故障,沒有及時來清零計數(shù)器,就會導(dǎo)致裝滿了溢出,他就重啟系統(tǒng),這就是看門狗的看門原理,其實想想傻傻的、笨笨的。 舉個例子說:8051 單片機選用12MHz晶振,一個時鐘周期為1us,如果“看門狗計數(shù)器”是16位的,最大計數(shù)65536個,那么從0開始計到65535需要約65ms,所以我們可以在程序的50ms左右清零一次計數(shù)器(“喂狗”),讓他重新從0開始計,再過50ms,再清,……,這樣下去只要程序正常運行,計數(shù)器永遠(yuǎn)不會計滿,也就永遠(yuǎn)不會被“看門狗”復(fù)位。當(dāng)然這個喂狗的時間是大家自己選的,只要不超過65ms,你選多少都可以,一般不要喂得太勤,這樣單片機運行時間浪費了,比如你1ms喂一次就太勤了,也不要說那我65ms喂一次,這樣太邊緣,這樣抗干擾能力就下降了,最好是留一定的余量,這個就是設(shè)計者自己掌握了,我一般是讓計到90%左右就清一次。 每種單片機的“看門狗”實現(xiàn)方法不盡相同,但是原理都一樣,而且“看門狗”都是啟動了之后就不能被關(guān)閉,只能系統(tǒng)復(fù)位(重新斷電在上電)才能關(guān)閉。設(shè)置“看門狗”的一般步驟如下: 1. 設(shè)置“看門狗”相關(guān)寄存器,啟動“看門狗”; 2. 隔一段時間清零一次,“喂狗”; 3. 如果程序正常,一直運行;如果程序出錯,沒有按時“喂狗”,“看門狗”就在溢出的時候復(fù)位系統(tǒng)。 值得提一下: 由于現(xiàn)在AT89S52應(yīng)用比較廣泛,所以我先說說ATMEL的看門狗;再說說本次試驗用的STC89C52RC的看門狗;注意兩個不一樣?。?! AT89S52單片機看門狗定時器是14位的,最大計數(shù)214=16384個數(shù),每計16384個時鐘周期就溢出一次。也就是說如果使用12M晶振的話,至少應(yīng)該在16.384ms內(nèi)喂一次狗。 STC89C5X系列單片機由于采用了“預(yù)分頻技術(shù)”,它的溢出時間是=(N*Prescale*32768)/晶振頻率(不要問我為什么,他們就是這么設(shè)計的,我們就這么用就行)。 - 其中N是單片機的時鐘周期,STC89C5X系列單片機提供6時鐘周期和12時鐘周期兩種時鐘周期,可以在燒寫程序時修改;
- Prescale是預(yù)分頻數(shù),通過設(shè)置【看門狗控制寄存器】可以設(shè)置為2、4、8、16、32、64、128、256;怎么設(shè)置演示程序中有介紹;
- 晶振頻率就是系統(tǒng)選用的晶振。
所以如果同樣選擇12MHz晶振,使用傳統(tǒng)的12時鐘周期,它最小的溢出時間是(12*2*32768)/(12*106)=65.536ms,最大溢出時間是(12*256*32768)/(12*106)≈8.38s。如果選擇256分頻,也就是說只要在8.38秒之內(nèi)喂一次狗就可以了。戲謔的說:這只狗比較抗餓,J~~ 對于我們用戶來說,看門狗的時間是越長越好,這樣可以節(jié)省更多的單片機資源,尤其是對時間要求精準(zhǔn)的系統(tǒng),如果執(zhí)行過程中我們不停地“喂狗”,那么是比較浪費時間的。所以STC89C5X系列單片機的看門狗更有優(yōu)勢一些。當(dāng)然這個也是個人的選擇,如果對時間要求的不苛刻的話,勤喂幾次狗也沒關(guān)系。 下面我就以STC89C52RC單片機為例說說典型的51單片機的看門狗程序如何寫,關(guān)于STC89C52RC單片機的“看門狗”定義請看STC89C51RC-RD單片機使用說明。以下程序在Keil 2和Keil 3下調(diào)時通過,下載在本校的實驗板上達(dá)到預(yù)期效果。STC89C52RC/54RD+/58RD+/516RD+單片機上測試正常運行。 如果沒有我們的實驗板,請按照下面的硬件原理圖自己在最小系統(tǒng)上搭建一個實驗環(huán)境也很容易。 圖1. STC89C52最小單片機系統(tǒng)+兩個指示燈 圖2. 串行口接口(用于下載程序和測試本次試驗) 001 | /*************************************************************************** |
002 | 程序功能:本程序演示STC51單片機看門狗程序 |
003 | 程序設(shè)計:燕山大學(xué) 魯信瓊 |
004 | 晶振選擇:11.0592MHz, 如果晶振不匹配,請修改延時函數(shù)參數(shù) |
005 | 承接51單片機、PIC單片機程序、VB/VC++上位機程序、電子產(chǎn)品軟硬件設(shè)計開發(fā)工作 |
006 | EMail: xqlu(at)ysu.net.cn QQ: 9790335 |
008 | 由于現(xiàn)在AT89S52很流行,所以我先說說ATMEL的看門狗;再說說本次試驗用的STC89C52RC的看門狗;注意兩個不一樣?。?! |
010 | ★下面是關(guān)于ATMEL-51單片機看門狗的描述 |
011 | 【看門狗計數(shù)器】(watchdog timer)是一個14位的計數(shù)器,它以機器周期(晶振頻率/12)增加,當(dāng)計數(shù)值計滿(16383/0x3FFF)了就使單片機軟復(fù)位; |
012 | 當(dāng)啟動了【看門狗計數(shù)器】之后,我們需要在它計數(shù)沒有滿之前復(fù)位計數(shù)器強制它不能夠溢出,這個過程稱作喂狗。 |
015 | 1. 系統(tǒng)上電并不啟動看門狗計數(shù)器,通過設(shè)置【看門狗重置寄存器(WDTRST SFR)】啟動【看門狗計數(shù)器】,一般設(shè)置是給WDTRST寫入0x1E和0xE1啟動; |
016 | 2. 【看門狗計數(shù)器】一旦啟動不可停止,除非是硬件RST或者看門狗的軟復(fù)位才能使其停止; |
017 | 3. 設(shè)計程序在適當(dāng)?shù)臅r間喂狗一次,使其不能計滿,程序就能不間斷執(zhí)行; |
018 | 4. 如果程序中出現(xiàn)死循環(huán)或者執(zhí)行某一步超時,看門狗計數(shù)器就會計滿溢出,(這個時候我們認(rèn)為程序沒有按照預(yù)定計劃執(zhí)行--程序跑飛),則復(fù)位系統(tǒng)。 |
020 | ★下面是關(guān)于STC89C5XX-51單片機看門狗的描述 |
021 | WDT_CONTR位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0] |
022 | EN_WDT: 看門狗允許位,置1啟動看門狗,看門狗不能自動啟動,需要設(shè)置該位后啟動,一旦啟動不能關(guān)閉(只能系統(tǒng)重新上電和看門狗復(fù)位可以關(guān)閉) |
023 | CLR_WDT: 看門狗計數(shù)器清零位,置1清零看門狗計數(shù)器,當(dāng)計數(shù)器開始重新計數(shù),硬件清零該位。 |
024 | IDLE_WDT: 單片機IDLE模式看門狗允許位,當(dāng)IDLE_WDT=1時,單片機在IDLE模式(空閑模式)依然啟用看門狗 |
025 | PS2~PS0: 看門狗定時器預(yù)分頻器,下表中Prescale表示預(yù)分頻數(shù) |
036 | 看門狗溢出時間:(N*Prescale*32768)/晶振頻率,其中N表示指令周期數(shù)N=12表示12時鐘周期模式;N=6表示6時鐘周期模式 |
039 | 1. 本次試驗使用的是11.0592MHz晶振,設(shè)置WDT_CONTR=(0011 0100)B,32預(yù)分頻,單片機使用12指令周期模式。 |
040 | 計算看門狗溢出時間:[12*32*32768/(11059200)]≈1s。 |
041 | 2. 本次試驗的硬件電路很簡單,就是最小系統(tǒng)上增加兩個LED燈,原理圖見正文,用戶可以很容易實現(xiàn)。 |
042 | ***************************************************************************/ |
044 | sfr WDT_CONTR=0xE1;//定義特殊功能寄存器:STC單片機看門狗控制寄存器 |
045 | #define uchar unsigned char |
048 | #define WEIGOU WDT_CONTR=0x34 //看門狗啟動設(shè)置和“喂狗”操作 |
049 | sbit LED=P1^6;//信號燈,系統(tǒng)正常工作就一閃一閃的 |
050 | sbit LED_busy=P1^7;//工作燈,上電滅一會兒(約800ms),然后正常工作的時候一直亮著;用于指示系統(tǒng)是否重啟 |
052 | constuchar str[]="I love MCU!";//定義一句話,讓他從串口輸出,只有系統(tǒng)重啟的時候才輸出一次,所以也是用于驗證看門狗有沒有重啟系統(tǒng) |
054 | /*************************************************************************/ |
055 | //延時函數(shù),11.0592MHz晶振下延時約xms毫秒 |
056 | voiddelay_ms(unsigned xms) |
062 | /*************************************************************************/ |
064 | /*************************************************************************/ |
072 | TMOD=0x21;//定時器0工作在方式1,作為16位定時器;定時器1工作在方式2,作為串行口波特率發(fā)生器 |
073 | TH0=0x4C;//定時器0裝初值:每隔50ms溢出一次 |
075 | IE=0x82;//IE=(1000 0010)B, 使能定時器0中斷 |
078 | /*************************************************************************/ |
080 | /*************************************************************************/ |
084 | SCON=0x50;//SCON=(0101 0000)B,波特率不加倍,允許接收 |
085 | TH1=0xFD;//設(shè)置波特率=9600bps |
089 | /*************************************************************************/ |
091 | /*************************************************************************/ |
092 | //定時器0中斷服務(wù)程序程序,控制信號燈閃爍。如果系統(tǒng)正常運行,信號燈1.5秒閃一次 |
093 | voidTimer0_isr() interrupt 1 |
101 | TR0=0;//定時器0暫停,否則再次來中斷會沖斷程序 |
109 | /*************************************************************************/ |
113 | WEIGOU;//上來第一步設(shè)置看門狗定時器,并且啟動 |
117 | //開機通過串口發(fā)送一次“I love MCU!”,使用串口調(diào)試助手可以查看 |
118 | //由于在while大循環(huán)外邊,所以只要系統(tǒng)不重新啟動,則上電后只會發(fā)送一次,用于判斷系統(tǒng)是否重啟 |
|