bsp_wwdg.c 3.04 KB
#include "bsp.h"
#include "stm32f4xx_wwdg.h"
/*
*********************************************************************************************************
*	                                  
*	模块名称 : 窗口看门狗程序
*	文件名称 : bsp_wwdg.c
*	版    本 : V1.0
*	说    明 : WWDG例程。
*	修改记录 :
*		版本号   日期        作者     说明
*		V1.0    2013-12-04  armfly   正式发布
*
*	Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
*********************************************************************************************************
*/

#include "bsp.h"


/*
*********************************************************************************************************
*	函 数 名: bsp_InitWwdg
*	功能说明: 窗口看门狗配置 
*	形    参:
*             _ucTreg       : T[6:0],计数器值 	范围0x40 到 0x7F                                               
*             _ucWreg       : W[6:0],窗口值     必须小于 0x80
*            WWDG_Prescaler : 窗口看门狗分频	PCLK1 = 42MHz
*                             WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1
*							  WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2
*							  WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4
*							  WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 
*	返 回 值: 无		        
*********************************************************************************************************
*/
u8 WWDG_CNT=0X7F;

void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
	NVIC_InitTypeDef NVIC_InitStructure;
 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看门狗时钟
	
	WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT. 
	WWDG_SetPrescaler(fprer); //设置分频值
	WWDG_SetWindowValue(wr); //设置窗口值
//	WWDG_SetCounter(WWDG_CNT);//设置计数值
	WWDG_Enable(WWDG_CNT);  //开启看门狗
	
	NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;  //窗口看门狗中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  //抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;					//子优先级为3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //使能窗口看门狗
	NVIC_Init(&NVIC_InitStructure);
	
	WWDG_ClearFlag();//清除提前唤醒中断标志位
	WWDG_EnableIT();//开启提前唤醒中断
}

//窗口看门狗中断服务程序 
//void WWDG_IRQHandler(void)
//{
//	static u8 Count = 0;

//	WWDG_SetCounter(0x7f); //重设窗口看门狗值
//	WWDG_ClearFlag();	//清除提前唤醒中断标志位
//	
//	Count += 1;
//	if(Count > 1)return;

//	
//	USART_ITConfig(USART6, USART_IT_RXNE, DISABLE);
//    USART_ITConfig(USART6, USART_IT_TXE,  DISABLE); 
//	USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
//    USART_ITConfig(USART1, USART_IT_TXE,  DISABLE); 
//	USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
//    USART_ITConfig(USART2, USART_IT_TXE,  DISABLE); 
//	USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
//    USART_ITConfig(USART3, USART_IT_TXE,  DISABLE); 
//	
//	NVIC_SystemReset();
//}

void FeedDog(void)
{
	if((WWDG->CR&0X7F)<(WWDG->CFR&0X7F))   // 计数器值tr必须小于窗口值wr时才能喂狗,在之前喂狗则太早,会产生看门狗复位
	{
		WWDG_SetCounter(0X7F);
	}
}

void bsp_InitWWDG(void)
{
	WWDG_Init(0x7F,0X7E,WWDG_Prescaler_8); 	//计数器值为7f,窗口寄存器为5f,分频数为8	   
}