MSP430F5529 番外(二)纠正XT1配置错误
在第三章讲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的,所以用或赋值的话会出错。
默认值请看下表:
MSP430F5529XT1配置错 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)