什么是看門狗
如果程序跑飛了怎么辦?
可以用看門狗來監控。
看門狗是:
一個遞減的計數器,如果不按時給計數器賦值,計數器的值減到一定程度,就會使系統復位。
也就是說如果程序運行異常,無法正常給計數器賦值(喂狗),系統會自動復位。
STM32F407有兩種看門狗:
- 獨立看門狗
- 窗口看門狗
獨立看門狗
- 在鍵值寄存器(IWDG_KR)中寫入0xCCCC:開始啟用獨立看門狗。
- 此時計數器開始遞減
- 當計數器值計數到尾值0x000時會產生一個復位信號(IWDG_RESET)。
- 無論何時,只要在鍵值寄存器IWDG_KR中寫入0xAAAA(通常說的喂狗),
- 自動重裝載寄存器IWDG_RLR的值就會重新加載到計數器,從而避免看門狗復位。
- 如果程序異常,就無法正常喂狗,從而系統復位。
- 時鍾源是頻率為32K的LSI(low speed internal 時鍾),經過預分頻寄存器的值分頻后,即為獨立看門狗的計數器的頻率。
- 預分頻寄存器IWDG_PR和鍵值寄存器IWDG_KR都有寫保護功能,要操作他們需要先取消寫保護。
獨立看門狗時間計算
如何計算超時時間,即獨立看門狗多久不喂會復位?
下圖適用與M4:
由圖可知
分頻系數 = (2^PR寄存器的值)×4
∴超時時間= 周期×初值
=(分頻系數/32K)× rlr
=(2^PR寄存器的值)×4 ×rlr
獨立看門狗適用場合
- 獨立看門狗(IWDG)由專用的低速時鍾(LSI)驅動,即使主時鍾發生故障它仍有效。
- 獨立看門狗適合應用於需要看門狗作為一個在主程序之外 能夠完全獨立工作,並且對時間精度要求低的場合。
獨立看門狗代碼寫法
#include "iwdg.h"
//////////////////////////////////////////////////////////////////////////////////
//初始化獨立看門狗
//prer:分頻數:0~7(只有低3位有效!)
//rlr:自動重裝載值,0~0XFFF.
//分頻因子=4*2^prer.但最大值只能是256!
//rlr:重裝載寄存器值:低11位有效.
//時間計算(大概):Tout=((4*2^prer)*rlr)/32 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
//1.取消寄存器寫保護:0x5555使能
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能對IWDG->PR IWDG->RLR的寫
//2. 設置IWDG分頻系數:寫PR
IWDG_SetPrescaler(prer);
//3. 設置IWDG裝載值
IWDG_SetReload(rlr);
//4. 喂狗:寫0xAAAA到KR,賦初值
IWDG_ReloadCounter(); //reload
//5. 使能看門狗:寫0xCCCC到KR
IWDG_Enable();
}
//喂獨立看門狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//喂狗:寫0xAAAA到KR
}