stm32有兩個看門狗,獨立看門狗和窗口看門狗,其實兩者的功能是類似的,只是喂狗的限制時間不同。
獨立看門狗是限制喂狗時間在0-x內,x由你的相關寄存器決定。喂狗的時間不能過晚。
窗口看門狗,所以稱之為窗口就是因為其喂狗時間是一個有上下限的范圍內,你可以通過設定相關寄存器,設定其上限時間和下限時間。喂狗的時間不能過早也不能過晚。
窗口看門狗的上窗口就是配置寄存器WWDG->CFR里設定的W[6:0];
下窗口是固定的0x40;
當窗口看門狗的計數器在上窗口值之外,或是低于下窗口值都會產生復位。
上窗口的值可以只有設定,7位二進制數最大只可以設定為127(0x7F),最小又必須大于下窗口的0x40,所以其取值范圍為64~127(即:0x40~0x7F);
配置寄存器WWDG->CFR中為計數器設定時鐘分頻系數,確定這個計數器可以定時的時間范圍,從而確定窗口的時間范圍。
窗口看門狗的時鐘來自于PCLK1,在時鐘配置中,其頻率為外部時鐘經倍頻器后的二分頻時鐘,即為36MHz,根據手冊可以知道其定時時間計算方法:
36Mhz下相關窗口看門狗的喂狗時間范圍:
WDGTB(計數器分頻值)最早喂狗時間/us最晚喂狗時間/ms
0 113 7.28
1 227 14.56
2 455 29.12
3 910 58.25
本例直接寄存器實現4種測試模式,測試窗口看門狗的復位原理。
MODE_1 0 // 在30ms時喂狗,在窗口范圍內喂狗,LED燈閃爍
MODE_2 0 // 在10ms時喂狗,在窗口范圍外導致復位,LED燈常亮
MODE_3 0 // 在100ms時喂狗,在窗口范圍外喂狗導致復位
MODE_4 1 // 主函數不執行喂狗,開啟提前喚醒中斷,在WWDG中斷函數中喂狗
庫函數實現在提前喚醒中斷中,喂狗操作,PA4口LED正常閃爍。當外部中斷發生(按下PA0按鍵),長時間不喂狗,引發窗口看門狗復位。
直接操作寄存器
相關寄存器如下:
控制寄存器WWDG->CR:低8位有效。
第8位為WDGA,看門狗激活位。低7位[6:0]為看門狗計數器的計數值。
配置寄存器WWDG->CFR:低十位有效。
第10位為EWI:提醒喚起中斷。此位置1,當計數器值到達0x40時,將產生中斷。
第8,9位WDGTB:為計數器分頻系數設置為:
00: CK計時器時鐘(PCLK1除以4096)除以1 01: CK計時器時鐘(PCLK1除以4096)除以2
10: CK計時器時鐘(PCLK1除以4096)除以4 11: CK計時器時鐘(PCLK1除以4096)除以8
低7位[6:0]:為窗口值。