Ⅰ寫(xiě)在前面
IWDG:Independent WatchDog獨(dú)立看門(mén)狗
WWDG:Window WatchDog窗口看門(mén)狗
獨(dú)立看門(mén)狗模塊可以用于解決處理器因?yàn)?a href="http://hljzzgx.com/v/tag/1751/" target="_blank">硬件或軟件的故障所發(fā)生的錯(cuò)誤。它由一個(gè)內(nèi)部的128kHz的LSI阻容振蕩器作為時(shí)鐘源驅(qū)動(dòng),因此即使是主時(shí)鐘失效時(shí)它仍然照常工作。
窗口看門(mén)狗用于監(jiān)測(cè)由于外部干擾或不可預(yù)知的邏輯條件所產(chǎn)生的軟件錯(cuò)誤,這樣的軟件錯(cuò)誤通常會(huì)導(dǎo)致應(yīng)用程序不按照預(yù)期的方式運(yùn)行。
大概意思主要是:IWDG主要防止硬件問(wèn)題引起的復(fù)位,WWDG主要防止軟件問(wèn)題引起的復(fù)位.
為方便大家閱讀,本文內(nèi)容已經(jīng)整理成PDF文件:
http://pan.baidu.com/s/1i5uWhJR
Ⅱ看門(mén)狗知識(shí)
1.看門(mén)狗結(jié)構(gòu)圖
STM8S的獨(dú)立看門(mén)狗IWDG比窗口看門(mén)狗WWDG結(jié)構(gòu)看起來(lái)要簡(jiǎn)單一點(diǎn),其實(shí)寄存器都只有那么兩個(gè),軟件配置起來(lái)也比較簡(jiǎn)單。不管是獨(dú)立還是窗口看門(mén)狗,自己看結(jié)構(gòu)圖基本就能理解到它們。具體請(qǐng)看下面結(jié)構(gòu)圖進(jìn)行對(duì)比。
獨(dú)立看門(mén)狗IWDG結(jié)構(gòu)圖:
當(dāng)向下計(jì)數(shù)器“8-bit down-counter”等于0時(shí),就會(huì)產(chǎn)生看門(mén)狗復(fù)位“WDG reset”。因此,就需要在計(jì)數(shù)器等于0之前通過(guò)重載寄存器“IWDG_RLR”更新計(jì)數(shù)器的值。
窗口看門(mén)狗WWDG結(jié)構(gòu)圖:
窗口看門(mén)狗有兩地方會(huì)引起復(fù)位:
1.當(dāng)7位(T[6:0])遞減計(jì)數(shù)器從0x40翻轉(zhuǎn)到0x3F(T6位清零)時(shí)。這種和上面IWDG類(lèi)似,遞減到“0”就會(huì)復(fù)位。
2.當(dāng)更新的計(jì)數(shù)值大于窗口值(T6:0 > W6:0)時(shí)。
這兩種復(fù)位的情況如下圖:
2.IWDG獨(dú)立看門(mén)狗功能
當(dāng)在鍵寄存器(IWDG_KR)中寫(xiě)入數(shù)值0xCC后,獨(dú)立看門(mén)狗就被啟動(dòng)了,計(jì)數(shù)器開(kāi)始從它的復(fù)位值0xFF開(kāi)始遞減計(jì)數(shù),當(dāng)計(jì)數(shù)減到0x00時(shí)就會(huì)產(chǎn)生一個(gè)復(fù)位信號(hào)(WDG RESET)。
如果在IWDG_HW選擇字節(jié)中使能了硬件看門(mén)狗的功能,在芯片上電時(shí)看門(mén)狗的功能被自動(dòng)開(kāi)啟,如果軟件不能及時(shí)操作鍵寄存器,則在計(jì)數(shù)器達(dá)到0x00時(shí)產(chǎn)生復(fù)位。
看門(mén)狗復(fù)位的超時(shí)值是由你的配置(分頻值和計(jì)數(shù)值)決定的,大概如下(默認(rèn)LSI = 128 kHz 會(huì)隨溫度變化有所偏差):
3.WWDG獨(dú)立看門(mén)狗功能
● 可編程的自由運(yùn)行遞減計(jì)數(shù)器
● 有條件的復(fù)位
─ 如果開(kāi)啟了看門(mén)狗,當(dāng)遞減計(jì)數(shù)器的數(shù)值小于 0x40 時(shí)產(chǎn)生復(fù)位
─ 如果開(kāi)啟了看門(mén)狗,當(dāng)在指定的時(shí)間窗口之外重加載遞減計(jì)數(shù)器的數(shù)值時(shí)產(chǎn)生復(fù)位
● 硬件或軟件啟動(dòng)看門(mén)狗(由選擇字節(jié)指定)
● 可在HALT指令時(shí)產(chǎn)生復(fù)位(由選擇字節(jié)配置)
● 開(kāi)啟看門(mén)狗:
如果(通過(guò)選擇字節(jié))選擇了軟件看門(mén)狗,在系統(tǒng)復(fù)位后看門(mén)狗處于關(guān)閉狀態(tài)。設(shè)置WDGCR寄存器中的WDGA位將開(kāi)啟看門(mén)狗,隨后在下次復(fù)位之前將不能關(guān)閉看門(mén)狗。
如果(通過(guò)選擇字節(jié))選擇了硬件看門(mén)狗,看門(mén)狗將始終開(kāi)啟,而WDGA位將不起作用。
● 控制遞減計(jì)數(shù)器:
遞減計(jì)數(shù)器是自由運(yùn)行計(jì)數(shù)器:即使未開(kāi)啟看門(mén)狗,它依然不斷地遞減計(jì)數(shù)。當(dāng)開(kāi)啟看門(mén)狗時(shí),必須設(shè)置T6位以避免立刻產(chǎn)生復(fù)位。
T[5:0]位中包含了看門(mén)狗產(chǎn)生復(fù)位前允許的時(shí)間延遲;因?yàn)閷?xiě)入WDGCR寄存器時(shí),預(yù)分頻器的狀態(tài)是不可知的,所以這個(gè)時(shí)間延遲介于一個(gè)最小和最大數(shù)值之間。
窗口寄存器(WDGWR)的數(shù)值是指定窗口的高限:為防止復(fù)位,必須在遞減計(jì)數(shù)器的數(shù)值小于窗口寄存器的數(shù)值并大于0x3F時(shí)刷新遞減計(jì)數(shù)器。
提示: T6位可以用于產(chǎn)生一個(gè)軟件復(fù)位(即設(shè)置WDGA位同時(shí)清除T6位
● 在停止時(shí)產(chǎn)生看門(mén)狗復(fù)位
如果開(kāi)啟了看門(mén)狗,并且選擇了停止時(shí)產(chǎn)生看門(mén)狗復(fù)位的選項(xiàng),則執(zhí)行HALT指令將產(chǎn)生復(fù)位。
Ⅲ軟件工程源代碼
1、關(guān)于工程
本文提供兩個(gè)版本的工程代碼:
STM8S-A08_IWDG獨(dú)立看門(mén)狗
STM8S-A08_WWDG窗口看門(mén)狗
本文提供的工程代碼是基于前面軟件工程“STM8S-A04_UART基本收發(fā)數(shù)據(jù)”增加WDG看門(mén)狗修改而來(lái)。初學(xué)的朋友可以參看我前面對(duì)應(yīng)的基礎(chǔ)文章,那些文章講的比較詳細(xì)。
2.IWDG獨(dú)立看門(mén)狗代碼分析
A.IWDG_Initializes初始化
voidIWDG_Initializes(void)
{
IWDG_Enable();
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_256);
IWDG_SetReload(250);
IWDG_ReloadCounter();
}
預(yù)分頻值為IWDG_Prescaler_256,參數(shù)為枚舉類(lèi)型:
typedef enum
{
IWDG_Prescaler_4 = (uint8_t)0x00,
IWDG_Prescaler_8 = (uint8_t)0x01,
IWDG_Prescaler_16 = (uint8_t)0x02,
IWDG_Prescaler_32 = (uint8_t)0x03,
IWDG_Prescaler_64 = (uint8_t)0x04,
IWDG_Prescaler_128 = (uint8_t)0x05,
IWDG_Prescaler_256 = (uint8_t)0x06
} IWDG_Prescaler_TypeDef;
重裝計(jì)數(shù)值為8位寄存器,最大255,我們?cè)O(shè)置為250.
我在初始化看門(mén)狗時(shí),將復(fù)位超時(shí)值設(shè)置為1000ms,具體計(jì)算為如下:
128K/2 = 64K (輸入時(shí)鐘)
64K / 256 = 250(分頻后時(shí)鐘)
250 / 250 = 1 (重載值為250)
B.功能測(cè)試代碼
voidmain(void)
{
System_Initializes();
UART1_Printf((uint8_t*)"Start...");
while(1)
{
LED_REVERSE;
TIMDelay_Nms(990);
IWDG_ReloadCounter();
}
}
第一:如果復(fù)位,會(huì)打印“Start...";
第二:我們配置復(fù)位超時(shí)值為1000ms,理論小于1000ms內(nèi)喂狗都不會(huì)復(fù)位,由于LSI有偏差,我們?cè)O(shè)定在990ms喂狗一次。
第三:修改延時(shí)值為1010,則會(huì)發(fā)現(xiàn)系統(tǒng)復(fù)位(打印“Start...")。
3.WWDG窗口看門(mén)狗代碼分析
A.WWDG_Initializes初始化
#define WWDG_WINDOW_VALUE 0x7F //窗口值
#define WWDG_COUNTER_INIT 0x7F //計(jì)數(shù)值
voidWWDG_Initializes(void)
{
WWDG_Init(WWDG_COUNTER_INIT, WWDG_WINDOW_VALUE);
}
為了方便測(cè)試,我們這里將窗口值和計(jì)數(shù)值定義為宏,范圍:0x40 - 0x7F.
B.功能測(cè)試代碼
voidmain(void)
{
System_Initializes();
UART1_Printf((uint8_t*)"Start...");
WWDG_Initializes();
while(1)
{
LED_REVERSE;
TIMDelay_Nms(49);
WWDG_SetCounter(WWDG_COUNTER_INIT);
}
}
第一:同理,如果復(fù)位,會(huì)打印“Start...";
第二:我們配置復(fù)位超時(shí)值為49.152ms,如果這個(gè)延時(shí)大于49(設(shè)定為50及以上),就會(huì)復(fù)位(打印“Start...")。
第三:如果我們修改延時(shí)值(假如為T(mén)IMDelay_Nms(10);),修改窗口值為#define WWDG_WINDOW_VALUE 0x4F。則不在喂狗窗口范圍內(nèi),會(huì)發(fā)現(xiàn)系統(tǒng)復(fù)位(打印“Start...")。
提醒大家:多測(cè)試驗(yàn)證才能更容易理解和記住功能的要點(diǎn)。
Ⅳ下載
STM8S資料:
http://pan.baidu.com/s/1o7Tb9Yq
軟件源代碼工程兩版本(STM8S-A08_xWDGxx看門(mén)狗):
http://pan.baidu.com/s/1c2EcRo0
-
看門(mén)狗
+關(guān)注
關(guān)注
10文章
560瀏覽量
70789 -
STM8S
+關(guān)注
關(guān)注
16文章
149瀏覽量
31407 -
IWDG
+關(guān)注
關(guān)注
0文章
21瀏覽量
5211
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論