一、獨立看門狗概述:
獨立看門狗其實就是一個獨立於主時鐘的定時復位狗。一旦開啓獨立看門狗,它就會根據自己設定的時間不斷倒數,倒數到0後就開始復位。
二、關於喂狗:
喂狗就是讓狗去吃東西,分心後,這隻狗就得重新倒數。
三、stm32看門狗示例程序:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能對寄存器IWDG_PR和IWDG_RLR的寫操作
IWDG_SetPrescaler(prer); //設置IWDG預分頻值:設置IWDG預分頻值爲64
IWDG_SetReload(rlr); //設置IWDG重裝載值
IWDG_ReloadCounter(); //按照IWDG重裝載寄存器的值重裝載IWDG計數器
IWDG_Enable(); //使能IWDG
}
int main(void)
{
//延時函數初始化
delay_init()
//設置NVIC中斷分組2:2位搶佔優先級,2位響應優先級
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//初始化與LED連接的硬件接口
LED_Init();
//按鍵初始化
KEY_Init();
delay_ms(500);
//與分頻數爲64,重載值爲625,溢出時間爲1s
IWDG_Init(4,625);
//點亮LED0
LED0=0;
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)
{
IWDG_ReloadCounter(); //如果WK_UP按下,則喂狗
}
}
}
從主程序main的第一行開始運行到下面的代碼時,開啓看門狗
//與分頻數爲64,重載值爲625,溢出時間爲1s
IWDG_Init(4,625);
此時,鍵值寄存器(IWDG_KR)中寫入 0xCCCC,開始啓用獨立看門狗;此時計數器開始從其復位值 0xFFF 遞減計數。當計數器計數到末尾 0x000 時,會產生一個復位信號(IWDG_RESET)。
所以我們會看到等一亮一滅。
此時,如果檢測到按鍵按下,那麼就會運行喂狗程序:
if(KEY_Scan(0)==WKUP_PRES)
{
IWDG_ReloadCounter(); //如果WK_UP按下,則喂狗
}
喂狗後, 鍵寄存器 IWDG_KR 中被寫入 0xAAAA, IWDG_RLR 中的值就會被重新加載到計數器,也就是對應到初始化設置的計數值,我們設置的1S,那麼計數器就將重1s處開始遞減,如果我們持續按按鍵,那麼計數器就會持續保持在那個值,不會倒數到0,也就不會產生復位,那麼燈就會始終保持亮的狀態。
從而驗證了看門狗和喂狗的功能。