看门狗实验

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档