当前位置:文档之家› 看门狗实验

看门狗实验

看门狗实验
1. 为什么要看门狗?看门狗的原理是什么?
外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog)它的基本原理为,给看门狗设置一个时间周期,如果在这个周期内程序不能正常运行结束,定时器会自动益处,则系统会自动复位,使系统重新运行进而得到监控系统的作用。

假设程序运行的时间为Tp,定时器时间为Ti,Ti>Tp,在Ti时间内程序正常结束则不会发生益处的现象,如果受干扰等原因系统不能在Tp时刻内修改计数器的值,则在Ti时刻时系统会自动复位,引发系统重新运行。

一般情况下都是应用程序在运行结束后去喂狗,当应用程序出现异常而不能去喂狗时,在超过看门狗定时器的时间范围后,cpu会复位,起始喂狗的过程就是给看门狗的寄存器置位,当程序开始运行时,看门狗的计数器开始递减,在减到零之前必须喂狗,否则系统会复位,当减到零时还没有喂狗则系统复位。

2. 看门狗的功能
1)作为常规功能可以产生中断,通用的中断用16bit定时器
2)作为看门狗使用,当时钟计数器减为0时(超时),他将产生一个128个时
(PCLK)钟的的复位信号
我们常见的时钟有3个,FCLK,HCLK,PCLK,他们的工作频率分别是400MHz,400/3MHz,和400/6MHz,看门狗使用的是PCLK时钟。

下图为看门狗的电路示意图
PCLK经过两次降频,prescaler的值从0到256-1,Division_factor的值为16,32,64,128。

看门狗定时器记数值的计算公式如下:
t_watchdog的值是寄存计数器(WDTCNT)多长时间自减一次,他的单位是时间,一旦看门狗定时器被允许,看门狗定时器数据寄存器(WTDAT)的值不能被自动的装载到看门狗计数器(WTCNT)中,因此,看门狗启动前要将一个初始值写入看门狗计数器
(WTCNT)中。

3. 看门狗定时器要用到的寄存器
1. WTCON――看门狗定时器控制寄存器
WTCON允许用户禁止或使能看门狗定时器,从4中不同的信号源选择时钟信号,允许或禁止中断,并且能允许或禁止看门狗时钟输出,如果用户想要使用看门狗作为普通时钟,应该中断使能,禁止看门狗定时器。

2. WTDAT――看门狗定时器数据寄存器
WTDAT 用于设置看门狗定时器的超时时间值,在初始化看门狗过程中,WTDAT 的值不会自动加载到定时计数器中,首次使用定时器超时值为其初始值即0x8000,以后该寄存器的值会被自动加载到WTCNT 寄存器中。

这是个数据寄存器,你可以设置t_watchdog的次数,上面计算出看门狗计数寄存器每减一次需要的时间,就是t_watchdog,WTDAT设置的就是它自减的次数,所以看门狗相邻两次复位的时间间隔就是你设置的WTDAT的次数乘以t_watchdog。

如果正常程序运行的时间比较长,你可以将WTDAT的次数设置大一点,这样复位的时间就变大,不会影响系统复位。

注意:WTDAT和WTCNT不一样,WTDAT是数据寄存器,它是你设置的一个值,这个值是个固定的值,而WTCNT是数据计数器,他的值是会变的,每变一次就经历t_watchdog这么长时间,直到将WTDAT设置的数自减到0,也就是所说的看门狗的复位时间间隔,当WTCNT自减到0,系统才会复位。

3. WTCNT――看门狗定时器计数寄存器
WTCNT 为看门狗定时器工作的时间计数器的当前计数值,注意在初始化看门狗操作后,看门狗数据寄存器(WTDAT)的值不能自动装载到看门狗计数寄存器(WTCNT)中,所以看门狗被允许之前应该初始化看门狗计数寄存器的值。

实例代码分析
#include "2440addr.h"
#include "2440lib.h"
void watchdog_test(void);
void __irq Watchdog_ISR(void); //__irq是ADS中定义中断函数的关键字
//复位次数
int f_ucSencondNo=0; //复位次数
void xmain(void)
{
ChangeClockDivider(3,1);
ChangeMPllValue(127,2,1); //405MHZ
Isr_Init();
Uart_Init(0, 115200);
Uart_Select(0);
Uart_Printf("watchdog test is beginning\n");
watchdog_test();
}
void watchdog_test(void)
{
rSUBSRCPND |= BIT_SUB_WDT; //set bit 13 =1 open INT_WDT
// ClearSubPending(BIT_SUB_WDT);
// ClearSubPending(BIT_SUB_WDT);
//建立WatchDog中断
pISR_WDT_AC97=(unsigned)Watchdog_ISR;
//Prescaler value=100;lock division factor=128 ;PCLK=67.5MHz
//t_watchdog=1/[PCLK/(Prescaler value+1)/Division_factor]=0.0002
//disable watchdog
rWTCON=((100<<8)|(3<<3)); //factor=128 [4,3]=11,Prescaler value = 100
//看门狗时钟中断周期T=WTCNT*t_watchdog=3S
//看门狗喂狗
rWTDAT=15000; //两次喂狗的中断时间次数
rWTCNT=15000; //15000 * t_watchdog 复位周期,t_watchdog指多长时间计数器减一,一共15000次,所以总时间长为15000 * t_watchdog
rWTCON &= ~(3); //disable reset关闭定时器复位
rWTCON |= ((1<<5)|(1<<2)); //enable Watchdog timer and watchdog interrupt
//开中断
rINTMSK &=~BIT_WDT_AC97;
rINTSUBMSK &=~BIT_SUB_WDT;
while(f_ucSencondNo<11);
}
/**** watchdog_init ****/
void __irq Watchdog_ISR(void)
{
if(rSUBSRCPND & BIT_SUB_WDT)
{//清除中断
ClearSubPending(BIT_SUB_WDT);
ClearPending(BIT_WDT_AC97);
f_ucSencondNo++;
if(f_ucSencondNo<11)
Uart_Printf("%ds\n",f_ucSencondNo*3);
else
{
//mask watchdog timer interrupt
DisableSubIrq(BIT_SUB_WDT);
DisableIrq(BIT_WDT_AC97);
Uart_Printf("watch dog is ok\n");
}
}
}。

相关主题