原理
窗口看门狗( WWDG )通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序
背离正常的运行序列而产生的软件故障。

T[6:0] 就是 WWDG_CR 的低七位, W[6:0] 即是 WWDG->CFR 的低七位。 T[6:0]就是窗口看门狗的计数器,而 W[6:0] 则是窗口看门狗的上窗口,下窗口值是固定的( 0X40 )。当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。
上窗口值( W[6:0] )是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保
窗口值大于 0X40 ,否则窗口就不存在了。
窗口看门狗的超时公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1))/Fpclk1
Twwdg : WWDG 超时时间(单位为 ms )
Fpclk1 : APB1 的时钟频率(单位为 Khz )
WDGTB : WWDG 的预分频系数
T[5:0] :窗口看门狗的计数器低 6 位
根据上面的公式,假设 Fpclk1=36Mhz ,那么可以得到最小 - 最大超时时间表如下 所示:

控制寄存器( WWDG_CR ):

可以看出,这里我们的 WWDG_CR 只有低八位有效, T[6 : 0] 用来存储看门狗的计数器值,
随时更新的,每个窗口看门狗计数周期(4096×2^ WDGTB )减 1 。当该计数器的值从 0X40 变
为 0X3F 的时候,将产生看门狗复位。
WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该
位一旦设置,就只能在硬件复位后才能清零了。

是配置寄存器(WWDG_CFR)
该位中的 EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间( T[6:0]=0X40 )来
提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗
的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中
断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后,必
须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 36M 且 WDGTB 为 0 的条件下,
该时间为 113us )内重新写 WWDG_CR ,否则,看门狗将产生复位!

状态寄存器( WWDG_SR)该寄存器用来记录当前是否有提前唤醒的标志。
窗口看门狗配置步骤:
1. 使能 WWDG 时钟
(WWDG 不同于 IWDG,IWDG 有自己独立的 40Khz 时钟,不存在使能问题。而 WWDG使用的是 PCLK1 的时钟,需要先使能时钟。)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
2. 设置窗口值和分频数
void WWDG_SetWindowValue(uint8_t WindowValue);//设置窗口值
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); //设置分频数
3. 开启 WWDG 中断并分组
WWDG_EnableIT(); // 开启窗口看门狗中断
进行中断优先级配置,这里就不重复了,使用 NVIC_Init() 函数
4. 设置计数器初始值并使能看门狗
void WWDG_Enable(uint8_t Counter) ;
5. 编写中断服务函数
在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当
窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态
寄存器的 EWIF 位清空。
实验
实验现象: 我们将通过 DS0 来指示 STM32 是否被复位了,如果被复位了就会点亮 300ms。DS1 用来指示中断喂狗,每次中断喂狗翻转一次。