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