DCO选用XT2晶振4MHZ作为参考源,想要倍到12MHZ,但是发现实际MCLK输出只有4.35MHZ。
时钟设置如下:
void UCSSet2()
{
P2DIR |= BIT2; // SMCLK输出
P2SEL |= BIT2;
P7DIR |= BIT7; // MCLK输出
P7SEL |= BIT7;
P5SEL |= BIT2+BIT3; // 选择XT2
UCSCTL6 &= ~XT2OFF; // 打开XT2
UCSCTL3 |= SELREF_2; // FLL基准选择
do //直到振荡稳定
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// 清除XT2,XT1,DCO错误标志
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1&OFIFG);
//UCSCTL6 &= ~XT2DRIVE0; __delay_cycles(375000);
UCSCTL3 |= SELREF_5; // Set DCO FLL reference = XT2
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // Select DCO range 24MHz operation
UCSCTL2 = FLLD_0+2; // Set DCO Multiplier for 12MHz
__bic_SR_register(SCG0); // Enable the FLL control loop
__delay_cycles(375000);
// Loop until XT1,XT2 & DCO fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL4 = SELA__XT1CLK+SELS__DCOCLK + SELM__DCOCLK; }