【記錄】視窗看門狗
特性
視窗看門狗,顧名思義,看門狗的計數值既有上限也有下限(下限值固定0x40,且上限值需要大於0x40),在該時間視窗之前喂狗,或超過視窗時間,都會產生復位訊號。並且,當計數到0x40時,產生EWI中斷。
看門狗框圖如下,看門狗使能後,【WWDG_CR】開始向下計數,並與【WWDG_CFR】中的預設值進行比較,在視窗外喂狗會產生【RWSET】訊號。
視窗計數值範圍為W[6:0]~0x3F,下限值固定為0x3F+1,上限值可設W[6:0]。
應用
既然有了獨立看門狗,為什麼還要增加個視窗看門狗呢?
首先,精度問題,獨立看門狗使用外部低速時鐘,時間精度相對比較低。按照32KHz頻率,預分頻PR[2:0]=0,根據公式,計算出單位計數值得時間精度為
((4*2^0)*1)/32=0.125ms
視窗看門狗的最高時間精度,按照頻率Fpclk1=30MHz,WDGTB=0,計算出
(4096*2^0)/30M=136.53um
此外,雖然內部低速時鐘寫著為32KHz,但,實際上,MCU內部的RC頻率會在30KHz到60KHz之間變化。
相對於獨立看門狗,視窗看門狗的一個特性是計數器有下限值,即過早的喂狗,依然會產生復位訊號。想象這樣一個應用,程式由於某種異常進入一段無限迴圈操作,而這段無限迴圈操作中恰恰包含喂狗動作,現象上看,程式異常,但沒有被重啟。獨立看門狗顯然無法檢測出此種異常,視窗看門狗就可以。
操作步驟
- 使能WWDG時鐘
- 設定看門狗時間
- 開啟中斷並設定中斷分組
- 編寫中斷服務程式
void WWDG_Init(u8 tr, u8 wr, u8 fprer)
{
RCC->APB1ENR |= 1<<11;
WWDG->CFR |= fprer<<7;
WWDG->CFR &= 0xFF80;
WWDG->CFR |= wr;
WWDG->CR |= tr&0x7F;
WWDG->CR |= 1<<7;
MY_NVIC_Init(2, 3, WWDG_IRQn, 2);
WWDG-> SR = 0x00;
WWDG->CFR |= 1<<9;
}
void WWDG_Set_Counter(u8 cnt)
{
WWDG->CR = (cnt&0x7F);
}
void WWDG_IRQHandler(void)
{
WWDG_Set_Counter(0x7F);
WWDG->SR = 0x00;
LED1 = !LED1;
}
int main(void)
{
sys_init();
while(1)
{
LED0 = 1;
}
}
static void sys_init(void)
{
Stm32_Clock_Init(336, 8, 2, 7);
delay_init(168);
led_init();
key_init();
delay_ms(1000);
LED0 = 0;
WWDG_Init(0x7F, 0x5F, 3);
}
為了試驗效果,在中斷服務函式中翻轉LED來表示發生了中斷。實際應用中應該觸發特定的操作,如通訊或資料記錄。看門狗是用於檢測程式異常的,在中斷中應該觸發一些能夠表示異常發生的動作。切記,不要在中斷服務函式中喂狗,否則就看門狗就沒有意義了。
參考
STM32F3與 F4 系列 Cortex M4 核心程式設計手冊
STM32F4xxx中文參考手冊
STM32F4xxx英文參考手冊
STM32F4 開發指南(暫存器版)