新闻中心

EEPW首页>嵌入式系统>设计应用> MSP430F5529 番外(二)纠正XT1配置错误

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

作者: 时间:2016-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起振。*/
#include< msp430.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

本文引用地址: //m.amcfsurvey.com/article/201611/322795.htm

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

默认值请看下表:



评论


技术专区

关闭