新聞中心

        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

        本文引用地址:http://www.104case.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的,所以用或賦值的話會出錯。

        默認值請看下表:



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 绍兴市| 兰溪市| 江永县| 彝良县| 武隆县| 塔河县| 从江县| 墨脱县| 桐乡市| 公安县| 库尔勒市| 永泰县| 新安县| 济源市| 涪陵区| 双流县| 万源市| 辰溪县| 平顶山市| 阳谷县| 营口市| 昭觉县| 邵阳县| 大丰市| 阜平县| 河间市| 广南县| 兴国县| 甘肃省| 泗洪县| 哈巴河县| 华蓥市| 包头市| 林州市| 左贡县| 通榆县| 同江市| 庄浪县| 吉木乃县| 无为县| 德惠市|