程序如下:
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?想请教论坛上的高人指点一下,谢谢!