MSP430F5529 番外(二)纠正XT1配置错误

错误更正说明:
在第三章讲UCS时钟系统的时候,实验二是将MCLKACLK配置为XT1F5529XT132.768KHZ
当时的程序如下:
#include
void  main( void ){
    P1SEL |= BIT0;
    P1DIR |= BIT0; // 测量 ACLK
    P2SEL |= BIT2;
    P2DIR |= BIT2; // 测量 SMCLK
    P7SEL |= BIT7;
    P7DIR |= BIT7; // 测量 MCLK
    P5SEL |= BIT4|BIT5;  // 配置为 XT1 功能 , 电路板上晶振接于这两脚
    UCSCTL6 |= XCAP_3;  // 配置电容为 12pF
    UCSCTL6 &= ~XT1OFF;  // 使能 XT1
while (SFRIFG1 & OFIFG)    // 如果有时钟错误 {
   UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG); // 清除 3 种时钟错误标志
   SFRIFG1&=~(OFIFG); // 清除时钟错误标志位 }
UCSCTL4&=(UCSCTL4&(~(SELA_7|SELM_7)))|SELA_0|SELM_0;
// SMCLK MCLK 时钟源配置为 XT1
}
 
当时由于手里没有频率计,并没有测输出。
昨天实际测了一下,发现该程序存在问题: 实际测量MCLK为876KHZ左右,ACLK虽然是32.768KHZ,但我感觉还是内部的REFO。
 
解答如下:这是官方的例程

ACLK = SMCLK = MCLK =XT1 =32768

int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

P1DIR |= BIT0; // ACLK set out to pins
P1SEL |= BIT0;
P2DIR |= BIT2; // SMCLK set out to pins
P2SEL |= BIT2;
P7DIR |= BIT7; // MCLK set out to pins
P7SEL |= BIT7;

P5SEL |= BIT4+BIT5; // Select XT1

UCSCTL6 &= ~(XT1OFF); // XT1 On
UCSCTL6 |= XCAP_3; // Internal load cap
UCSCTL3 = 0; // FLL Reference Clock = XT1

// Loop until XT1,XT2 & DCO stabilizes - In this case loop until XT1 and DCo settle
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag

UCSCTL6 &= ~(XT1DRIVE_3); // Xtal is now stable, reduce drive strength

UCSCTL4 = SELA_0 + SELS_0 + SELM_0; // SMCLK = MCLK = ACLK = LFTX1 

}

注意划红线的语句,要用等号赋值。因为默认 SELS 和SELM的值是不为0的,所以用或赋值的话会出错。

默认值请看下表:MSP430F5529 番外(二)纠正XT1配置错误_第1张图片

你可能感兴趣的:(XT1配置)