1. 程式人生 > >【記錄】視窗看門狗

【記錄】視窗看門狗

特性

視窗看門狗,顧名思義,看門狗的計數值既有上限也有下限(下限值固定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之間變化。

這裡寫圖片描述

這裡寫圖片描述

相對於獨立看門狗,視窗看門狗的一個特性是計數器有下限值,即過早的喂狗,依然會產生復位訊號。想象這樣一個應用,程式由於某種異常進入一段無限迴圈操作,而這段無限迴圈操作中恰恰包含喂狗動作,現象上看,程式異常,但沒有被重啟。獨立看門狗顯然無法檢測出此種異常,視窗看門狗就可以。

操作步驟

  1. 使能WWDG時鐘
  2. 設定看門狗時間
  3. 開啟中斷並設定中斷分組
  4. 編寫中斷服務程式
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 開發指南(暫存器版)