看门狗实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
看门狗实验
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