|
本帖最后由 lnhnkjxy 于 2011-8-14 20:23 编辑
#include "2440addr.h"
#include "2440lib.h"
void watchdog_test(void);
void __irq Watchdog_ISR(void);
//复位次数
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();
}
/**********************************
watchdog_init
watchdog interrupt service routine
************************************/
void watchdog_test(void)
{
//clear interrupt registers
ClearPending(BIT_WDT_AC97);
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));
//看门狗时钟中断周期T=WTCNT*t_watchdog=3S
//看门狗喂狗
rWTDAT=15000;
rWTCNT=15000;
rWTCON &= ~(3); //disable reset
rWTCON |= ((1<<5)|(1<<2));//enable Watchdog timer and watchdog interrupt
//开中断
EnableIrq(BIT_WDT_AC97);
EnableSubIrq(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");
}
}
if(rSUBSRCPND & ~BIT_SUB_AC97)
{
ClearSubPending(BIT_SUB_AC97);
ClearPending(BIT_WDT_AC97);
}
}
请问各位,为什么rSUBSRCPND & ~BIT_SUB_AC97不为零。我单步调试发现rSUBSRCPND的值为0x92,我就是不明白:1,为什么rSUBSRCPND的值是这个。我看了手册,这几个值为1的位是发送中断的标志位:INT_TXD0~2 ,初始化不应该为零吗。2,清除不掉这几个标志位,一直置一。 |
|