WDT(看门狗定时器), 看门狗定时器的主要作用是在程序因为干扰而跑飞后,能够使系统复位,不至于使系统永远的死下去。
看门狗的工作原理为:如果程序正常执行,就必须隔一段时间进行喂狗操作,如果达到设定时间没有进行喂狗则看门狗程序会认为程序跑飞或者死掉,会自动进行系统复位。
看门狗定时器跟不同定时器操作类似,只不过增加了中断复位和喂狗操作,给rWTCNT赋值就相当于进行喂狗操作,其它配置见注释。
本实验为debug模式下的测试实验,并没有开启复位功能,因为系统以复位就无法实现在线调试了,所以是不可能实现的,需要测试复位功能必须下载到开发板进行测试,本实验只用了看门狗定时器的中断功能,每隔4秒中断一次,蜂鸣器响一声。
#define GLOBAL_CLK 1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
void delay(int times)//延时函数
{
int i;
for(;times>0;times--)
for(i=0;i<400;i++);
}
void beep_init(void)//蜂鸣器初始化
{
rGPBCON =1<<0;// 设置GPB0为输出端口
rGPBUP=1<<0;//禁止GPB0上拉功能
}
void beep(void)
{
beep_init();//初始化蜂鸣器
rGPBDAT =0x1;//蜂鸣器响
delay(3000);
rGPBDAT=0x0;//蜂鸣器不响
delay(3000);
}
static void __irq WDT_ISR(void) //WDT中断处理函数
{
beep();
rSRCPND = 0x1<<9;
rSUBSRCPND = 0x1<<13;
rINTPND = 0x1<<9;
}
void inter_init()
{
rWTCON = 0xf9<<8; //Prescaler = 249,Division = 16,时钟频率为12.5kHz
rWTCON !=(0<<0); //禁止看门狗复位
rWTDAT = 50000; //设置看门狗定时器超时时间为4秒(50÷12.5)
rWTCNT = 50000;
rWTCON |= (1<<5)|(1<<2); //开启看门狗定时器中断
rSRCPND = 0x1<<9;
rSUBSRCPND = 0x1<<13;
rINTPND = 0x1<<9;
rINTSUBMSK = ~(0x1<<13); //打开中断子屏蔽
rINTMSK = ~(0x1<<9); //打开中断屏蔽
}
void Main(void)
{
MMU_Init();//内存重定向
inter_init();//初始化中断
pISR_WDT_AC97 = (U32)WDT_ISR;
while(1)
{
delay(50000);
}
}
看门狗的工作原理为:如果程序正常执行,就必须隔一段时间进行喂狗操作,如果达到设定时间没有进行喂狗则看门狗程序会认为程序跑飞或者死掉,会自动进行系统复位。
看门狗定时器跟不同定时器操作类似,只不过增加了中断复位和喂狗操作,给rWTCNT赋值就相当于进行喂狗操作,其它配置见注释。
本实验为debug模式下的测试实验,并没有开启复位功能,因为系统以复位就无法实现在线调试了,所以是不可能实现的,需要测试复位功能必须下载到开发板进行测试,本实验只用了看门狗定时器的中断功能,每隔4秒中断一次,蜂鸣器响一声。
#define GLOBAL_CLK 1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
void delay(int times)//延时函数
{
int i;
for(;times>0;times--)
for(i=0;i<400;i++);
}
void beep_init(void)//蜂鸣器初始化
{
rGPBCON =1<<0;// 设置GPB0为输出端口
rGPBUP=1<<0;//禁止GPB0上拉功能
}
void beep(void)
{
beep_init();//初始化蜂鸣器
rGPBDAT =0x1;//蜂鸣器响
delay(3000);
rGPBDAT=0x0;//蜂鸣器不响
delay(3000);
}
static void __irq WDT_ISR(void) //WDT中断处理函数
{
beep();
rSRCPND = 0x1<<9;
rSUBSRCPND = 0x1<<13;
rINTPND = 0x1<<9;
}
void inter_init()
{
rWTCON = 0xf9<<8; //Prescaler = 249,Division = 16,时钟频率为12.5kHz
rWTCON !=(0<<0); //禁止看门狗复位
rWTDAT = 50000; //设置看门狗定时器超时时间为4秒(50÷12.5)
rWTCNT = 50000;
rWTCON |= (1<<5)|(1<<2); //开启看门狗定时器中断
rSRCPND = 0x1<<9;
rSUBSRCPND = 0x1<<13;
rINTPND = 0x1<<9;
rINTSUBMSK = ~(0x1<<13); //打开中断子屏蔽
rINTMSK = ~(0x1<<9); //打开中断屏蔽
}
void Main(void)
{
MMU_Init();//内存重定向
inter_init();//初始化中断
pISR_WDT_AC97 = (U32)WDT_ISR;
while(1)
{
delay(50000);
}
}