新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > MSP430F5529 番外(二)糾正XT1配置錯誤

MSP430F5529 番外(二)糾正XT1配置錯誤

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
錯誤更正說明:
在第三章講UCS時鐘系統(tǒng)的時候,實驗二是將MCLK和ACLK配置為XT1(F5529的XT1為32.768KHZ)
當(dāng)時的程序如下:
/*1.配置IO口5.4和5.5為XT1功能。*/
/*2.配置XCAP為XCAP_3,即12PF的電容。*/
/*3.清除XT1OFF標(biāo)志位。*/
/*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剛剛起振的時候可能有錯誤,導(dǎo)致時鐘錯誤標(biāo)志位置位,必須先清零*/
/*OFIFG即Osc Fault Flag,位于SFRIFG1中*/
while(SFRIFG1 & OFIFG) //如果有時鐘錯誤{
UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG);//清除3種時鐘錯誤標(biāo)志
SFRIFG1&=~(OFIFG);//清除時鐘錯誤標(biāo)志位}
UCSCTL4&=(UCSCTL4&(~(SELA_7|SELM_7)))|SELA_0|SELM_0;
//將SMCLK和MCLK時鐘源配置為XT1
}
當(dāng)時由于手里沒有頻率計,并沒有測輸出。
昨天實際測了一下,發(fā)現(xiàn)該程序存在問題:實際測量MCLK為876KHZ左右,ACLK雖然是32.768KHZ,但我感覺還是內(nèi)部的REFO。
解答如下:這是官方的例程

ACLK = SMCLK = MCLK =XT1 =32768

本文引用地址:http://m.butianyuan.cn/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

}

注意劃紅線的語句,要用等號賦值。因為默認(rèn) SELS 和SELM的值是不為0的,所以用或賦值的話會出錯。

默認(rèn)值請看下表:



關(guān)鍵詞: MSP430F5529XT1配置錯

評論


技術(shù)專區(qū)

關(guān)閉