专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

STM32窗口看门狗程序

作者:佚名   来源:本站原创   点击数:  更新时间:2013年10月22日   【字体:

窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位(WWDG->CR的第六位)变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。


 

图 3.6.1.1中,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位

窗口看门狗寄存器介绍:






如何使用窗口看门狗:
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_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才能喂狗  在窗口内
   WWDG->SR&=0x00;                       //清楚提前唤醒标志位
   LED1=!LED1;
}


//------------------------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 <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;

 
   }

 
}
关闭窗口

相关文章