STM8S_008_WDG獨立看門狗和視窗看門狗
相關標題:STM8S看門狗、IWDG、WWDG
Ⅰ、寫在前面
STM8S看門狗WDG分為兩類:
IWDG:Independent WatchDog獨立看門狗
WWDG:Window WatchDog視窗看門狗
獨立看門狗模組可以用於解決處理器因為硬體或軟體的故障所發生的錯誤。它由一個內部的128kHz的LSI阻容振盪器作為時鐘源驅動,因此即使是主時鐘失效時它仍然照常工作。
視窗看門狗用於監測由於外部干擾或不可預知的邏輯條件所產生的軟體錯誤,這樣的軟體錯誤通常會導致應用程式不按照預期的方式執行。
大概意思主要是:IWDG主要防止硬體問題引起的復位,WWDG主要防止軟體問題引起的復位.
作者:strongerHuang
版權所有,未經允許,禁止用於其它商業用途!!!
Ⅱ、看門狗基礎知識
1.看門狗結構圖
STM8S的獨立看門狗IWDG比視窗看門狗WWDG結構看起來要簡單一點,其實暫存器都只有那麼兩三個,軟體配置起來也比較簡單。不管是獨立還是視窗看門狗,自己看結構圖基本就能理解到它們。具體請看下面結構圖進行對比。
獨立看門狗IWDG結構圖:
當向下計數器“8-bit down-counter”等於0時,就會產生看門狗復位“WDG reset”。因此,就需要在計數器等於0之前通過過載暫存器“IWDG_RLR”更新計數器的值。
視窗看門狗WWDG結構圖:
視窗看門狗有兩地方會引起復位:
1.當7位(T[6:0])遞減計數器從0x40翻轉到0x3F(T6
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-A04_UART基本收發資料”增加WDG看門狗修改而來。初學的朋友可以參看我前面對應的基礎文章,那些文章講的比較詳細。
2.IWDG獨立看門狗程式碼分析
A.IWDG_Initializes初始化
void IWDG_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.功能測試程式碼
void main(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 //計數值
void WWDG_Initializes(void)
{
WWDG_Init(WWDG_COUNTER_INIT, WWDG_WINDOW_VALUE);
}
為了方便測試,我們這裡將視窗值和計數值定義為巨集,範圍:0x40 - 0x7F.
B.功能測試程式碼
void main(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-A08_xWDGxx看門狗):
提示:如果網盤連結失效,可以微信公眾號“底部選單”檢視更新連結。
Ⅴ、最後
微信搜尋“EmbeddDeveloper” 或者掃描下面二維碼、關注,檢視更多精彩內容。