天天看点

窗口看门狗WWDG

WWDG:

WWDG的作用:通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。

窗口看门狗WWDG

配置寄存器WWDG_CFR中W[6:0]是由用户自己设定的上窗口值.可以控制中断占空比范围。

控制寄存器WWDG_CR 中T[6:0]就是窗口看门狗的计数器。当产生中断后,计数器都会恢复到设置数值或默认最大数值0x7F(喂狗),之后每个窗口看门狗计数周期减1。

配置寄存器(WWDG_CFR)中WTGDB[1:0]设置分频值,可以控制中断的时间范围。

窗口看门狗的超时公式如下:

Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;

其中:

Twwdg:WWDG超时时间(单位为ms)

Fpclk1:APB1的时钟频率(单位为Khz)

WDGTB:WWDG的预分频系数

T[5:0]:窗口看门狗的计数器低6位

T[5:0]+1:当复位产生时要从0x40到0x3F位上,既0x3F也工作了。

窗口看门狗WWDG
窗口看门狗WWDG

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

//*****************************************************************

#include "wwdg.h"

#include "led.h"

void WWDG_Init(u8 tr,u8 wr,u32 fprer)//wr:窗口值;fprer:分频值;tr:计数值

{

  NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看门狗时钟,WWDG使用的是PCLK1的时钟

WWDG_SetWindowValue(wr); //设置窗口值 ,配置寄存器WWDG_CFR中W[6:0]              

        WWDG_SetPrescaler(fprer); //设置分频值   配置寄存器(WWDG_CFR)中WDGTB[1:0]

WWDG_SetCounter(tr);//设置计数值,控制寄存器WWDG_CR 中T[6:0]

WWDG_Enable(tr);  //开启看门狗

NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;  //窗口看门狗中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;  //抢占优先级为2

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级为3

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //使能窗口看门狗

NVIC_Init(&NVIC_InitStructure);

WWDG_ClearFlag();//清除提前唤醒中断标志位

        WWDG_EnableIT();//开启提前唤醒中断,

*一般来说,这个"死前"中断里面不应该喂狗的,而是应该做系统临死前的一些工作, 例如保存重要数据之类的

}

void WWDG_IRQHandler(void)

{

        WWDG_SetCounter(tr); //重设窗口看门狗值

WWDG_ClearFlag();//清除提前唤醒中断标志位

}

继续阅读