新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430學習心得---時鐘

        MSP430學習心得---時鐘

        作者: 時間:2017-01-06 來源:網絡 收藏

          初始化和GPIO

        本文引用地址:http://www.104case.com/article/201701/342564.htm

          概述:

          本實驗的目的是了解用于執行對 Value Line設備的初始化過程的步驟。在這個練習中,您將編寫初始化代碼,并運行該設備使用各種資源。

          1、寫初始化代碼

          2、運行CPU的MCLK的來源方式:VLO 、32768晶體、DCO

          3、主體程序部分

          4、觀察LED閃光燈速度

          

          1、在單片機中一共有三個或四個時鐘源:

          (1)LFXT1CLK,為低速/高速晶振源,通常接32.768kHz,也可以接(400kHz~16Mhz);

          (2)XT2CLK,可選高頻振蕩器,外接標準高速晶振,通常是接8Mhz,也可以接(400kHz~16Mhz);

          (3)DCOCLK,數控振蕩器,為內部晶振,由RC震蕩回路構成;

          (4)VLOCLK,內部低頻振蕩器,12kHz標準振蕩器。

          2、在MSP430單片機內部一共有三個時鐘系統:

          (1)ACLK,Auxiliary Clock,輔助時鐘,通常由LFXT1CLK或VLOCLK作為時鐘源,可以通過軟件控制更改時鐘的分頻系數;

          (2)MCLK,Master Clock,系統主時鐘單元,為系統內核提供時鐘,它可以通過軟件從四個時鐘源選擇;

          (3)SMCLK,Sub-Main Clock,系統子時鐘,也是可以由軟件選擇時鐘源。

          Basic Clock Module Registers(基礎時鐘寄存器)

          DCO control register DCOCTL

          Basic clock system control 1 BCSCTL1

          Basic clock system control 2 BCSCTL2

          Basic clock system control 3 BCSCTL3

          SFR interrupt enable register 1 IE1

          SFR interrupt flag register 1 IFG1

          3、MSP430的時鐘設置包括3個寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3

          DCOCTL,DCO控制寄存器,地址為56H,初始值為60H

          DCO2DCO1DCO0MOD4MOD3MOD2MOD1MOD0

          DCO0~DCO2: DCO Select Bit,定義了8種頻率之一,而頻率由注入直流發生器的電流定義。

          MOD0~MOD4: Modulation Bit,頻率的微調。

          一般不需要DCO的場合保持默認初始值就行了。

          BCSCTL1,Basic Clock System Control 1,地址為57H,初始值為84H

          XT2OFFXTSDIVA1DIVA0XT5VRSEL2RSEL1RSEL0

          RSEL0~RSEL2: 選擇某個內部電阻以決定標稱頻率.0最低,7最高。

          XT5V: 1.

          DIVA0~DIVA1:選擇ACLK的分頻系數。DIVA=0,1,2,3,ACLK的分頻系數分別是1,2,4,8;

          XTS: 選擇LFXT1工作在低頻晶體模式(XTS=0)還是高頻晶體模式(XTS=1)。

          XT2OFF: 控制XT2振蕩器的開啟(XT2OFF=0)與關閉(XT2OFF=1)。

          正常情況下把XT2OFF復位就可以了.

          BCSCTL2,Basic Clock System Control 2,地址為58H,初始值為00H

          SEM1SELM0DIVM1DIVM0SELSDIVS1DIVS0DCOR

          DCOR: Enable External Resistor. 0,選擇內部電阻;1,選擇外部電阻

          DIVS0~DIVS1: DIVS=0,1,2,3對應SMCLK的分頻因子為1,2,4,8

          SELS: 選擇SMCLK的時鐘源, 0:DCOCLK; 1:XT2CLK/LFXTCLK.

          DIVM0~1: 選擇MCLK的分頻因子, DIVM=0,1,2,3對應分頻因子為1,2,4,8.

          SELM0~1: 選擇MCLK的時鐘源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK

          我用的時候一般都把SMCLK與MCLK的時鐘源選擇為XT2。

          其它:

          1. LFXT1: 一次有效的PUC信號將使OSCOFF復位,允許LFXT1工作,如果LFXT1信號沒有用作SMCLK或MCLK,可軟件置OSCOFF關閉LFXT1.

          2. XT2: XT2產生XT2CLK時鐘信號,如果XT2CLK信號沒有用作時鐘MCLK和SMCLK,可以通過置XT2OFF關閉XT2,PUC信號后置XT2OFF,即XT2的關閉的。

          3. DCO振蕩器:振蕩器失效時,DCO振蕩器會自動被選做MCLK的時鐘源。如果DCO信號沒有用作SMCLK和MCLK時鐘信號時,可置SCG0位關閉DCO直流發生器。

          4. 在PUC信號后,由DCOCLK作MCLK的時鐘信號,根據需要可將MCLK的時鐘源另外設置為LFXT1或XT2,設置順序如下:

          (1)清OSCOFF/XT2

          (2)清OFIFG

          (3)延時等待至少50uS

          (4)再次檢查OFIFG,如果仍置位,則重復(1)-(4)步,直到OFIFG=0為止。

          (5)設置BCSCTL2的相應SELM。

          實例分析

          1、CPU運行在VLO時鐘下:

          這是最慢的時鐘,在約12千赫茲下運行。因此,我們將通過可視化的LED閃爍的紅色慢慢地在約每3秒鐘率。我們可以讓時鐘系統默認這種狀態,設置專門來操作VLO。我們將不使用任何ALCK外設時鐘在此實驗室工作,但你應該認識到,ACLK來自VLO時鐘。

          #include

          void main(void)

          {

          WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器

          P1DIR = 0x40; // P1.6 配置輸出

          P1OUT = 0; // 關閉LED

          BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

          IFG1 &= ~OFIFG; // 清除OSCFault 標志

          __bis_SR_register(SCG1 + SCG0); // 關閉 DCO

          BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = VLO/8

          while(1)

          {

          P1OUT = 0x40; // 開啟LED

          _delay_cycles(100);

          P1OUT = 0; // 關閉 LED

          _delay_cycles(5000);

          }

          }

          2、CPU運行在晶振(32768Hz)時鐘下:

          晶體頻率為32768赫茲,約3倍的VLO。如果我們在前面的代碼中使用晶振,指示燈應閃爍大約每秒一次。你知道為什么32768赫茲是一個標準?這是因為這個數字是2的15次方,因此很容易用簡單的數字計數電路,以每秒一次獲得率 ——手表和其他時間時基。認識到ACLK來自外部晶振時鐘。

          #include

          void main(void)

          {

          WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器

          P1DIR = 0x41; // P1.0 和P1.6配置輸出

          P1OUT = 0x01; // 開啟P1.0

          BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz 晶振

          while(IFG1 & OFIFG)

          {

          IFG1 &= ~OFIFG; // 清除 OSCFault 標志

          _delay_cycles(100000); // 為可見的標志延時

          }

          P1OUT = 0; // 關閉P1

          __bis_SR_register(SCG1 + SCG0); // 關閉 DCO

          BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = 32768/8

          while(1)

          {

          P1OUT = 0x40; // 開啟 LED

          _delay_cycles(100);

          P1OUT = 0; / / 關閉LED

          _delay_cycles(5000);

          }

          }

          3、CPU運行在晶振(32768Hz)和DCO時鐘下:

          最慢的頻率,我們可以運行DCO約在1MHz(這也是默認速度)。因此,我們將開始切換MCLK到DCO下。在大多數系統中,你會希望ACLK上運行的VLO或32768赫茲晶振。由于ACLK在我們目前的代碼是在晶體上運行,我們會打開DCO計算。

          #include

          void main(void)

          {

          WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器

          if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)

          {

          while(1); // If cal const erased, 掛起

          }

          BCSCTL1 = CALBC1_1MHZ; // Set range

          DCOCTL = CALDCO_1MHZ; //設置DCO模式

          P1DIR = 0x41; // P1.0 和P1.6配置輸出

          P1OUT = 0x01; // P1.0 開啟

          BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz

          while(IFG1 & OFIFG)

          {

          IFG1 &= ~OFIFG; // 清除OSCFault 標志

          _delay_cycles(100000); // 為可見標志延時

          _delay_cycles(100000); // 為可見標志延時

          }

          P1OUT = 0; // P1.6 關閉

          // __bis_SR_register(SCG1 + SCG0); // 關閉DCO

          BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO

          while(1)

          {

          P1OUT = 0x40; // P1.6 開啟

          _delay_cycles(100);

          P1OUT = 0; / / P1.6 關閉

          _delay_cycles(5000);

          }

          }

          4、CPU運行在DCO時鐘下:

          最慢的頻率,我們可以運行DCO約在1MHz(這也是默認速度)。因此,我們將開始切換MCLK到DCO下。在大多數系統中,你會希望在VLO或者是晶振下運行ACLK。由于ACLK在我們目前的代碼是在VLO上運行,我們會打開DCO運行。

          #include

          void main(void)

          {

          WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器

          if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)

          {

          while(1); // If cal const erased,掛起

          }

          BCSCTL1 = CALBC1_1MHZ; // Set range

          DCOCTL = CALDCO_1MHZ; // 設置DCO模式

          P1DIR = 0x40; // P1.6 配置輸出

          P1OUT = 0; // P1關閉

          BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

          IFG1 &= ~OFIFG; // 清除 OSCFault 標志

          //__bis_SR_register(SCG1 + SCG0); // 關閉DCO

          BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO/8

          while(1)

          {

          P1OUT = 0x40; // P1.6 關閉

          _delay_cycles(100);

          P1OUT = 0; // P1.6 開啟

          _delay_cycles(5000);

          }

          }



        關鍵詞: MSP430 時鐘

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 志丹县| 汝城县| 金乡县| 柳河县| 龙南县| 门头沟区| 旺苍县| 廊坊市| 安远县| 格尔木市| 郸城县| 临夏市| 密云县| 商都县| 临海市| 桐城市| 田阳县| 金沙县| 昌宁县| 甘谷县| 兴仁县| 驻马店市| 沭阳县| 永清县| 涟水县| 大化| 福贡县| 兰考县| 辽阳市| 宝鸡市| 福安市| 两当县| 全椒县| 洛川县| 平乡县| 浏阳市| 南木林县| 大石桥市| 莱阳市| 苏尼特左旗| 额尔古纳市|