stm32学习之窗口看门狗(WWDG)

窗口看门狗的工作原理和上一篇学的独立看门狗的原理是基本一样的,只是独立看门狗是在设定的时间内x-0(计数器在递减)要进行喂狗,否则计数器减到0后将产生RESET信号,而窗口看门狗是在时间段内进行喂狗(递减计数器递减,在上窗口和下窗口内时间段进行喂狗),其中,上窗口是由用户定义的,下窗口是固定为0x3f,如果计数器的值减到大于上窗口值,又进行喂狗时,此时产生RESET信号,如果计数器的值减到0x3f后,此时也产生RESET信号。具体的看图:
stm32学习之窗口看门狗(WWDG)_第1张图片1代表上窗口的值,2代表下窗口的值,在这个时间段内喂狗不会产生RESET信号。
stm32学习之窗口看门狗(WWDG)_第2张图片先看5号,复位的信号来自一个与门,也就是来自WDGA的位和3号的结果,所以首先要让WDGA位置1,也就是使能看门狗,然后看5号的右边,输入端是一个或门(3号),也就是说3号的上端或下端输入只要有一个为1时,3号便输出1。仔细看一下3号,里面的4号是一个非门,也就是说T6置0时,经过4号便是1,3号也输出1,RESET信号产生。再者是3号的上端,输入是2号的输出端,2号是一个与门,当T6:0>W6:0时,输出结果为1,也就是当计数器的值大于上窗口的值,还写入WWDG_CR(喂狗),此时产生RESET信号。说的有点乱,对照图片分析一下便好。
接着便是寄存器的配置了,配置的流程:

	#include "WWDG.h"
	void Wwdg_Init()
	{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//使能时钟

	Wwdg_NVIC();配置WWDG中断

	WWDG_SetWindowValue(0X5F);//上窗口的赋值
	WWDG_SetPrescaler(WWDG_Prescaler_8);//预分频的值
	WWDG_Enable(0x7f);//计时器的初始化
	WWDG_ClearFlag();//清除WWDG的中断标志位
	WWDG_EnableIT();//使能WWDG
	}

	void Wwdg_NVIC()
	{
	NVIC_InitTypeDef Wwdg;
	Wwdg.NVIC_IRQChannel=WWDG_IRQn;
	Wwdg.NVIC_IRQChannelPreemptionPriority=2;
	Wwdg.NVIC_IRQChannelSubPriority=2;
	Wwdg.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&Wwdg);
	}

	void WWDG_IRQHandler()
	{
	WWDG_SetCounter(0x7f);//重新装载计时器,也就是喂狗
	WWDG_ClearFlag();
	Led_YellowTurn();//灯状态翻转
	}

和独立看门狗不一样,WWDG使用的是PCLK时钟,所以用之前要使能。而关于WWDG的中断,0x40是中断标志,也就是计时器减到0x40时,会产生中断自行喂狗,具体的看一下WWDG_CFR寄存器说明。

你可能感兴趣的:(STM32)