窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位(WWDG->CR的第六位)变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个复位。在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
窗口看门狗寄存器介绍:
如何使用窗口看门狗:
1)使能WWDG时钟
2)设置WWDG_CFR和WWDG_CR两个寄存器 在时钟使能完后,我们设置WWDG的CFR和CR两个寄存器,对WWDG进行配置。包括使能窗口看门狗、开启中断、设置计数器的初始值、设置窗口值并设置分频数WDGTB 3)开启WWDG中断并分组
4)编写中断服务函数
软件例程:
//---------------------------wdg.c-----------------------
#include "wdg.h" #include "led.h"
u8 wwdg_cnt=0x7f; //窗口看门狗计数器初值
void wwdg_init(u8 tr,u8 wr,u8 fprer) { RCC->APB1ENR|=1<<11; //使能WWDG时钟 wwdg_cnt=tr&wwdg_cnt; // 初始化计数器值 WWDG->CFR|=fprer<<7; //设置频率时基 WWDG->CFR|=1<<9; //使能串口看门狗中断 WWDG->CFR&=0xff80; //窗口值清零 WWDG->CFR|=wr; //设定窗口值 WWDG->CR|=(wwdg_cnt|1<<7); // 启动看门狗设置7位计数器初值 MY_N_Init(2,3,WWDG_QChannel,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
//------------------------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
///-----------------------主函数------------test.c---------------
#include
#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;
}
}
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。