淺談STC單片機(jī)看門狗的作用和使用成都控制器開發(fā)
有的控制器的運(yùn)行環(huán)境是很復(fù)雜的,比如可能突然來(lái)個(gè)電壓,突然來(lái)個(gè)浪涌,周圍存在的強(qiáng)電磁場(chǎng)也可能交替對(duì)控制器造成沖擊,也有可能外部器件出現(xiàn)錯(cuò)誤很久不響應(yīng),這樣就有可能讓單片機(jī)的程序跑飛,或者進(jìn)入死循環(huán)出不來(lái),那這就完蛋了。怎么辦呢?
本文引用地址:http://www.ex-cimer.com/article/202502/467120.htm一個(gè)簡(jiǎn)單的辦法就是使用單片機(jī)內(nèi)部的看門狗?,F(xiàn)實(shí)中的看門狗的話,你要是不定時(shí)喂狗,它就咬你,單片機(jī)里的看門狗的話,你要是不定時(shí)給看門狗計(jì)時(shí)器清零或者寫入特定數(shù)據(jù),它就讓單片機(jī)復(fù)位。
看門狗,又叫 watchdog,從本質(zhì)上來(lái)說(shuō)就是一個(gè)定時(shí)器電路,一般有一個(gè)輸入和一個(gè)輸出,其中輸入叫做喂狗,輸出一般連接到另外一個(gè)部分的復(fù)位端,一般是連接到單片機(jī)??撮T狗的功能是定期的查看芯片內(nèi)部的情況,一旦發(fā)生錯(cuò)誤就向芯片發(fā)出重啟信號(hào)??撮T狗命令在程序的中斷中擁有最高的優(yōu)先級(jí)。這是個(gè)很有用的功能,可以監(jiān)測(cè)程序是否按照預(yù)訂的順序或者周期循環(huán)在運(yùn)行,一旦出現(xiàn)異常就復(fù)位,可以防止單片機(jī)出現(xiàn)異常跑飛和死機(jī)等情況。另外,如果您需要開發(fā)定制,可聯(lián)系網(wǎng)址:3w點(diǎn)yonko-tech點(diǎn)com 或者Q 2531二六三七26
1.看門狗有什么作用
用于防止程序跑飛,或者防止因?yàn)橐馔馐钩绦蜻M(jìn)入死循環(huán)等。
2.看門狗怎么工作
當(dāng)單片機(jī)看門狗運(yùn)行時(shí),假如在規(guī)定的溢出時(shí)間內(nèi)給看門狗清零或者寫入特殊指令(喂狗),那么程序正常按預(yù)設(shè)的邏輯和順序運(yùn)行,假如沒(méi)有在規(guī)定時(shí)間給看門狗清零,那么單片機(jī)復(fù)位,程序從頭開始運(yùn)行。
3.怎么使用看門狗
以STC15單片機(jī)為例:
STC15單片機(jī)看門狗的使用重點(diǎn)就是操作看門狗寄存器WDT_CONTR。
? 看門狗的寄存器WDT_CONTR
寄存器WDT_CONTR是個(gè)8位的寄存器,各位的功能如下:
在使用看門狗時(shí),EN_WDT、CLR_WDT、IDLE_WDT、PS2-PS0這幾個(gè)二進(jìn)制位是比較重要的,其中EN_WDT用于看門狗的啟??刂?,CLR_WDT用于看門狗計(jì)時(shí)器清零,IDLE_WDT用于設(shè)置單片機(jī)“空閑模式”時(shí)看門狗是否工作,PS2-PS0用于設(shè)置看門狗的溢出時(shí)間。
? 怎么計(jì)算看門狗的溢出時(shí)間
看門狗的溢出時(shí)間是個(gè)重要參數(shù),因?yàn)槟阋诔绦蚶镄∮谶@個(gè)時(shí)間喂狗,才不會(huì)導(dǎo)致單片機(jī)復(fù)位。
看門狗的溢出時(shí)間與系統(tǒng)晶振和分頻系數(shù)有關(guān)系,部分晶振和分頻值對(duì)應(yīng)的溢出時(shí)間如下:
STC15單片機(jī)看門狗的使用步驟:
(1)根據(jù)程序循環(huán)周期、晶振,配置看門狗的分頻系數(shù)(即設(shè)置WDT_CONTR的低3位B2、B1、B0),以確定看門狗的溢出時(shí)間(溢出時(shí)間見圖 2),一般喂狗時(shí)間要遠(yuǎn)小于溢出時(shí)間最好。
(2)設(shè)置單片機(jī)在空閑模式時(shí)看門狗是否計(jì)數(shù)(即設(shè)置WDT_CONTR的B3位),這位0或者1其實(shí)沒(méi)什么影響,畢竟在空閑模式很多功能都停了,看門狗再繼續(xù)工作意義也不是很大。
(3)啟動(dòng)單片機(jī)的看門狗(即設(shè)置WDT_CONTR的B5位為1)。
(4)在程序里定時(shí)將單片機(jī)的看門狗計(jì)數(shù)值清零(喂狗)。假如超出溢出時(shí)間程序里沒(méi)進(jìn)行喂狗的話單片機(jī)將復(fù)位。
以上設(shè)置步驟,可用位運(yùn)算指令對(duì)WDT_CONTR的某些位進(jìn)行操作。
看門狗配置(第1-3步)也可以在STC下載軟件里進(jìn)行:
一個(gè)參考程序:
#include "STC15F2K60S2.h" //載入STC15單片機(jī)頭文件
void main()//主程序
{
WDT_CONTR=0x36; //看門狗設(shè)置:0x36->二進(jìn)制為0011 0110,表示打開看門狗,看門狗計(jì)時(shí)器清零,空閑模式不計(jì)數(shù),分頻系數(shù)128(在11.0592mhz下溢出時(shí)間約4.55s)
while(1)//循環(huán)程序
{
WDT_CONTR|=0x10;// 在主循環(huán)里喂狗(看門狗計(jì)時(shí)器清零),注意循環(huán)喂狗的周期不能超出看門狗溢出時(shí)間,否則復(fù)位
}
}
來(lái)解釋一下以上程序的重點(diǎn),程序中 “WDT_CONTR=0x36”的說(shuō)明如下表:
程序中“WDT_CONTR|=0x10”表示對(duì)WDT_CONTR 的B4位與“1”或運(yùn)算,即B4置1,表示看門狗計(jì)時(shí)器清零(喂狗),說(shuō)明如下表:
“/”表示保持原來(lái)不變。
注意:
喂狗的方式有很多,可以主循環(huán)里喂狗,定時(shí)器里喂狗等,一般建議主循環(huán)里喂狗。要想看門狗正常工作,要正確估算程序運(yùn)行時(shí)間,保證喂狗周期一般要遠(yuǎn)小于看門狗溢出時(shí)間,而且還得滿足系統(tǒng)工作使用狀況的要求。實(shí)在不行可以程序段里多處喂狗。
不同的單片機(jī)喂狗方式不一樣,有的可能不是給看門狗定時(shí)器清零,有的是往指定寄存器寫特殊數(shù)據(jù),這需按其手冊(cè)操作。
4.什么情況適合使用看門狗
(1)在現(xiàn)場(chǎng)環(huán)境干擾較大,容易導(dǎo)致單片機(jī)死機(jī)時(shí);
(2)程序里使用了較多while, do……until等指令時(shí)等情況。
簡(jiǎn)單說(shuō),就是在單片機(jī)復(fù)位的情況下也對(duì)系統(tǒng)沒(méi)什么影響的情況時(shí),適合使用單片機(jī)看門狗。
5.什么情況使用看門狗要慎重
(1)重要的計(jì)時(shí)或計(jì)數(shù)情況。此時(shí)不太建議用看門狗,因?yàn)閺?fù)位了,數(shù)據(jù)清零了,就沒(méi)用了;
(2)使用了較多全局狀態(tài)變量的時(shí)刻,如果復(fù)位會(huì)導(dǎo)致這些變量丟失會(huì)導(dǎo)致運(yùn)行錯(cuò)誤,則不建議隨意使用看門狗。比如是一個(gè)加工工藝,需要一步一步按照流程來(lái)操作,此時(shí)就不能使用看門狗,因?yàn)橐坏?fù)位會(huì)導(dǎo)致工藝步驟丟失,會(huì)產(chǎn)生錯(cuò)誤。
(3)其他不能隨意復(fù)位的情況。
以上就是STC15單片機(jī)看門狗的使用要點(diǎn),總之看門狗很有用,但是不能亂用,用好了可以增強(qiáng)系統(tǒng)的抗干擾能力,不至于導(dǎo)致系統(tǒng)失效,亂用的話,就嘿嘿了。
評(píng)論