现在想要把MCLK通过FLL倍频到25MHZ。但是发现,如果不打开并配置好XT1,好像某个标志位就会一直置位,导致程序无法运行。如果XT1无法正常工作,系统不是会自动切换到REFO吗?我现在不用XT1,但还要把它打开,很麻烦啊?有没有人能够解释一下啊。非常感谢啊!!!!!!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
现在想要把MCLK通过FLL倍频到25MHZ。但是发现,如果不打开并配置好XT1,好像某个标志位就会一直置位,导致程序无法运行。如果XT1无法正常工作,系统不是会自动切换到REFO吗?我现在不用XT1,但还要把它打开,很麻烦啊?有没有人能够解释一下啊。非常感谢啊!!!!!!
void MCLK_SET(void)
{
P5SEL |= BIT4|BIT5;
UCSCTL6 |= XCAP_3;//适配电容
UCSCTL6 &=~ XT1OFF;//打开XT1
/*上面三句配置XT1,没有的话,MCLK好像就没信号了*/
SetVCore(3); //提高Vcore电压到最高级,以满足倍频需求
__bis_SR_register(SCG0);
UCSCTL0 = 0;
UCSCTL1 = DCORSEL_6;
UCSCTL2 = FLLD_1 | 380;//FLLD=1,FLLN=380,则频率为2*(380+1)*32.768=24.969MHZ
__bic_SR_register(SCG0);
__delay_cycles(782000);
while (SFRIFG1 & OFIFG)
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG;
}
UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;//选择DCO输出作为时钟源
}
ZhaoF 你好,
这段程序中有一段代码就是检查是否所有的时钟源(XT1,XT2,DCO)是否都正常起振,如果有一个没有起振,下面的循环就不会通过。
while (SFRIFG1 & OFIFG)
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG;
}
UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;//选择DCO输出作为时钟源
}
所以,如果没有用XTI,可以不用检查这个位。上面的代码中,OFIFG会在任何一个时钟源没有起振的时候置位,可以这样改:
while (UCSCTL7 & 0x01) //检查DCO是否正常
{
UCSCTL7 &= ~ DCOFFG;
SFRIFG1 &= ~OFIFG;
}
跳过XT1的检查。