//***************************************************
//manymany-2440裸机篇之6 看门狗
//***************************************************
//目的:掌握看门狗的使用和设计,
//***************************************************
//看门狗的作用在于:防止系统跑飞,提高系统稳定性,
//故而必要时需要一条小狗看家。
//***************************************************
//Designed by: http://blog.ednchina.com/Manymany/
//2009-05-20
//**********************************************************
//看门狗工作原理:
//设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,
//Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因
//使系统不能在Tp时刻修改定时器的记数值,定时器将在Ti时刻溢出,
//引发系统复位,使系统得以重新运行,从而起到监控的作用。
//**********************************************************
//看门狗设计步骤:
//1,设置看门狗中断操作,包括全局中断操作和看门狗中断的使
// 能,看门狗中断向量的定义。
//2,对看门狗控制寄存器WTCON设置,包括设置预分频比例因子,
// 分频器的分频值,中断使能,复位使能。
//3,喂狗,即对WTDAT看门狗数据寄存器和WTCNT看门狗计数寄存器的设置。
//4,启动看门狗。
//**********************************************************
#include "2440addr.h"
#include "2440lib.h"
void watchdog_timer(void);
void watchdog_reset(void);
void __irq Watchdog_ISR(void);
//复位次数
int count="0";
void xmain(void)
{
ChangeClockDivider(3,1);
ChangeMPllValue(127,2,1); //405MHZ
Isr_Init();
/*看门狗定时器用于系统出错时复位,如果不想重启处理器,那么看门狗定时器禁用,
如果想使用看门狗定时器提供正常的定时功能,需使用看门狗中断和看门狗定时器*/
watchdog_timer(); //看门狗定时器函数
//watchdog_reset(); //看门狗复位函数
}
//*********************************************
//看门狗定时器函数
void watchdog_timer(void)
{
//清WatchDog中断寄存器
rSRCPND |=BIT_WDT_AC97;
rINTPND |=BIT_WDT_AC97;
rSUBSRCPND |= BIT_SUB_WDT;
//建立WatchDog中断
pISR_WDT_AC97=(unsigned)Watchdog_ISR;
//预分频值=100;时钟除数因子=128 ;PCLK=67.5MHz
//每个定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]
// =1/[67.5*1000000/(100+1)/128]=0.0002
//不允许中断
rWTCON=((100<<8)|(3<<3));
//看门狗喂狗
rWTDAT="20000"; //WTDAT看门狗数据寄存器,看门狗定时器重载的计数值
rWTCNT="20000"; //WTCNT看门狗计数寄存器,看门狗定时器当前计数值
//看门狗时钟中断周期T=WTCNT*t_watchdog=4S
rWTCON &= ~(3); //不允许复位
rWTCON |= ((1<<5)|(1<<2)); //允许看门狗定时器和允许中断产生
//开中断
rINTMSK &= ~(BIT_WDT_AC97);
rINTSUBMSK &= ~(BIT_SUB_WDT);
while(count<11);
}
//****************************************
//WatchDog中断
void __irq Watchdog_ISR(void)
{
if(rSUBSRCPND & ~ BIT_SUB_WDT)
{ //清除中断
rSUBSRCPND |=(BIT_SUB_WDT); //清除一级源中断指示寄存器相应位
rSRCPND |= BIT_WDT_AC97;
rINTPND |= BIT_WDT_AC97; //清除源中断指示寄存器相应位
count++; //复位次数自加
if(count<11) ; //判断复位次数
else
{
//屏蔽看门狗中断
rINTSUBMSK |= (BIT_SUB_WDT); //屏蔽看门狗相应中断位
rINTMSK |= (BIT_WDT_AC97);
}
}
if(rSUBSRCPND & ~ BIT_SUB_AC97)
{
rSUBSRCPND |=BIT_SUB_AC97;
rSRCPND |= BIT_WDT_AC97;
rINTPND |= BIT_WDT_AC97; //清除源中断指示寄存器相应位
}
}
//*****************************************
/*以下是需要复位时选用!!
void watchdog_reset(void) //看门狗复位函数
{
//预分频值=100;时钟除数因子=128 ;PCLK=67.5MHz
//每个定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]
// =1/[67.5*1000000/(100+1)/128]=0.0002
//不允许中断
rWTCON=((100<<8)|(3<<3));
//看门狗时钟周期T=WTCNT*t_watchdog=4S
//看门狗喂狗
rWTDAT="20000";
rWTCNT="20000";
rWTCON &= ~(3<<1); //禁止看门狗中断
rWTCON|=((1<<5)|(1<<0)); //允许看门狗定时,允许复位
while(1);
}
*/
//在这里是整个工程文件压缩https://static.assets-stash.eet-china.com/album/old-resources/2009/5/23/370afd98-f54c-4291-a5dd-59c4531ffd8d.rar在系统要求比较高的情况下,添加一个看门狗可以大大提高系统稳定性,这的确不错。
用户283045 2010-1-27 15:50
用户9442 2009-7-7 13:16