前不久在修理一些坏板子的时候发现,板子上的外部晶振取下来后,用ACLK作时钟源的TimeA中断事件仍然被触发,通过仿真后发现确实进入TimerA中断函数中,并且IFG1中的OFIFG位也未被置1,请问这种现象如何解释?我的相关部分代码如下:
//初始化时调用函数,初始化DCO为8MHZ
void InitClk()
{
/*等待电压稳定*/
DelayN(30);
IE1 |= OFIE; /*Ena××e osc fault int (NMI)*/
BCS1_Fren_Addr=(uchar*)CALBC1_8MHZ_;
BCSCTL1 = *BCS1_Fren_Addr;
DCO_Fren_Addr=(uchar*)CALDCO_8MHZ_;
DCOCTL = *DCO_Fren_Addr;
}
//中断函数检测OSC 错误
#pragma vector=NMI_VECTOR
__interrupt void OscFault(void)
{
volatile uint uiCnt;
#ifdef ALARMLED
LedR_1;
#endif
do /* Loop until flag is clear*/
{
IFG1 &= ~OFIFG; /* Clear fault flag*/
for (uiCnt = 0xFFFF; uiCnt; uiCnt--); /* Delay for crystal to start*/
}
while (IFG1 & OFIFG); /* Test LF oscillator fault flag*/
IE1 |= OFIE; /* Re-ena××e osc fault int*/
#ifdef ALARMLED
LedR_0;
#endif
}
//TimerA初始化函数
void InitTimer()
{
uint uiResultInteger;
TACTL = TASSEL0 + TACLR + ID0; /*TimerAClock=ACLK ,divided by 2,clear TAR*/
TACTL |= MC0;
uiResultInteger = rand();
uiResultInteger &= 0x00ff;
CCR0 = (uiResultInteger + uiWorkFrequence)<<3; /*woke interval = (CCR0)*0.061ms */
CCTL0 |= CCIE; /*CCR0 interrupt ena××e*/
} |