窗口看門狗(WWDG)通常被用來監(jiān)測(cè)由外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用程序背離正常的運(yùn)行序列而產(chǎn)生的軟件故障。除非遞減計(jì)數(shù)器的值在T6位(WWDG->CR的第六位)變成0前被刷新,看門狗電路在達(dá)到預(yù)置的時(shí)間周期時(shí),會(huì)產(chǎn)生一個(gè)MCU復(fù)位。在遞減計(jì)數(shù)器達(dá)到窗口配置寄存器(WWDG->CFR)數(shù)值之前,如果7位的遞減計(jì)數(shù)器數(shù)值(在控制寄存器中)被刷新, 那么也將產(chǎn)生一個(gè)MCU復(fù)位。這表明遞減計(jì)數(shù)器需要在一個(gè)有限的時(shí)間窗口中被刷新。
圖 3.6.1.1中,T[6:0]就是WWDG_CR的低七位,W[6:0]即是WWDG->CFR的低七位。T[6:0]就是窗口看門狗的計(jì)數(shù)器,而W[6:0]則是窗口看門狗的上窗口,下窗口值是固定的(0X40)。當(dāng)窗口看門狗的計(jì)數(shù)器在上窗口值之外被刷新,或者低于下窗口值都會(huì)產(chǎn)生復(fù)位。
上窗口值(W[6:0])是由用戶自己設(shè)定的,根據(jù)實(shí)際要求來設(shè)計(jì)窗口值,但是一定要確保窗口值大于0X40,否則窗口就不存在了。
窗口看門狗的超時(shí)公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG超時(shí)時(shí)間(單位為ms)
Fpclk1:APB1的時(shí)鐘頻率(單位為Khz)
WDGTB:WWDG的預(yù)分頻系數(shù)
T[5:0]:窗口看門狗的計(jì)數(shù)器低6位
窗口看門狗寄存器介紹:


如何使用窗口看門狗:
1)使能WWDG時(shí)鐘
2)設(shè)置WWDG_CFR和WWDG_CR兩個(gè)寄存器
4) 編寫中斷服務(wù)函數(shù)
軟件例程:
//---------------------------wdg.c-----------------------
窗口看門狗寄存器介紹:


如何使用窗口看門狗:
1)使能WWDG時(shí)鐘
2)設(shè)置WWDG_CFR和WWDG_CR兩個(gè)寄存器
在時(shí)鐘使能完后,我們?cè)O(shè)置WWDG的CFR和CR兩個(gè)寄存器,對(duì)WWDG進(jìn)行配置。包括使能窗口看門狗、開啟中斷、設(shè)置計(jì)數(shù)器的初始值、設(shè)置窗口值并設(shè)置分頻數(shù)WDGTB
3)開啟WWDG中斷并分組4) 編寫中斷服務(wù)函數(shù)
軟件例程:
//---------------------------wdg.c-----------------------
#include "wdg.h"
#include "led.h"
u8 wwdg_cnt=0x7f; //窗口看門狗計(jì)數(shù)器初值
void wwdg_init(u8 tr,u8 wr,u8 fprer)
{
RCC->APB1ENR|=1<<11; //使能WWDG時(shí)鐘
wwdg_cnt=tr&wwdg_cnt; // 初始化計(jì)數(shù)器值
WWDG->CFR|=fprer<<7; //設(shè)置頻率時(shí)基
WWDG->CFR|=1<<9; //使能串口看門狗中斷
WWDG->CFR&=0xff80; //窗口值清零
WWDG->CFR|=wr; //設(shè)定窗口值
WWDG->CR|=(wwdg_cnt|1<<7); // 啟動(dòng)看門狗設(shè)置7位計(jì)數(shù)器初值
MY_NVIC_Init(2,3,WWDG_IRQChannel,2);
}
void wwdg_feed(u8 cnt)
{
WWDG->CR|=(cnt&0x7f); //喂狗值
}
void WWDG_IRQHandler(void)
{
u8 tr,wr;
wr=WWDG->CFR&0x7f;
tr=WWDG->CR&0x7f;
if(tr<wr)wwdg_feed(wwdg_cnt); //只有TR小于WR才能喂狗 在窗口內(nèi)
WWDG->SR&=0x00; //清楚提前喚醒標(biāo)志位
LED1=!LED1;
}
//------------------------wdg.h---------------------
///-----------------------主函數(shù)------------test.c---------------
//------------------------wdg.h---------------------
#ifndef _wdg_h
#define _wdg_h
#include "sys.h"
void wwdg_init(u8 tr,u8 wr,u8 fprer);
void wwdg_feed(u8 cnt);
#endif
//------------------led.c----------------------#include "led.h"
void led_init(void)
{
RCC->APB2ENR|=1<<2;
RCC->APB2ENR|=1<<5;
GPIOA->CRH&=0xfffffff0;
GPIOA->CRH|=0x00000003;
GPIOD->CRL&=0xfffff0ff;
GPIOD->CRL|=0x00000300;
GPIOA->ODR|=1<<8;
GPIOD->ODR|=1<<2;
}
//---------------------led.h------------------#ifndef _led_h
#define _led_h
#include "sys.h"
#define LED0 PAout(8)
#define LED1 PDout(2)
void led_init(void);
#endif
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "wdg.h"
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
led_init();
wwdg_init(0x7f,0x5f,3);
LED0=0;
delay_ms(1800);
while(1)
{
LED0=1;
}
}