微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MSP430F5529 番外(二)纠正XT1配置错误

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

时间:11-28 来源:互联网 点击:
错误更正说明:

在第三章讲UCS时钟系统的时候,实验二是将MCLK和ACLK配置为XT1(F5529的XT1为32.768KHZ)

当时的程序如下:

/*1.配置IO口5.4和5.5为XT1功能。*/

/*2.配置XCAP为XCAP_3,即12PF的电容。*/

/*3.清除XT1OFF标志位。*/

/*4.等待XT1起振。*/

#includemsp430.h>

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

/*下面是很重要的一步:*/

/* XT1刚刚起振的时候可能有错误,导致时钟错误标志位置位,必须先清零*/

/*OFIFG即Osc Fault Flag,位于SFRIFG1中*/

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的,所以用或赋值的话会出错。

默认值请看下表:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top