程序如下:
void setup_FLL(void)
{//启动晶振和时钟;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
UCSCTL6 &= ~(XT1OFF); // XT1 On
do
{
UCSCTL7 &= ~XT1LFOFFG; // Clear XT1 fault flags
for (int i = 30000; i; i--);
} while (UCSCTL7 & XT1LFOFFG); // Test XT1 fault flag
UCSCTL3 = SELREF__XT1CLK; // Set DCO FLL reference
UCSCTL4 = SELS__DCOCLKDIV + SELM__DCOCLK + SELA__XT1CLK;
__delay_cycles(781250);
while (SFRIFG1&OFIFG) // Test oscillator fault flag
{ // Clear fault flags
UCSCTL7 &= ~(XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
for (int i = 30000; i; i--);
}
}
问题描述:程序运行后,会在最后一个while(SFRIFG1&OFIFG)中循环,此时DCOFFG与OFIFG置位,XT1LFOFFG 为0。发现问题后,进入单步调试,发现断点在SFRIFG1 &= ~OFIFG;处正常,但下一步单调时,UCSCTL0值变为0x00f8,即MOD{32},DCO{0}。
我猜测是MOD{32},DCO{0}后,引发DCOFFG,再触发了OFIFG。但想不通为何UCSCTL0值一开始还正常,但后来变为0x00f8?想请教论坛上的高人指点一下,谢谢!