[轉]MSP430學習心得---時鍾


時鍾初始化和GPIO

概述:

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

1、寫初始化代碼

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

3、主體程序部分

4、觀察LED閃光燈速度

 

MSP430時鍾:

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

(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

 

DCO2

DCO1

DCO0

MOD4

MOD3

MOD2

MOD1

MOD0

 

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

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

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

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

 

XT2OFF

XTS

DIVA1

DIVA0

XT5V

RSEL2

RSEL1

RSEL0

 

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

 

SEM1

SELM0

DIVM1

DIVM0

SELS

DIVS1

DIVS0

DCOR

 

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 <msp430g2231.h>

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 <msp430g2231.h>

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 <msp430g2231.h>

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);                 // 為可見標志延時

}

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 <msp430g2231.h>

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);

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM