新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > msp430g2231基礎(chǔ)定時(shí)器設(shè)置

msp430g2231基礎(chǔ)定時(shí)器設(shè)置

作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
本實(shí)驗(yàn)的目的是了解用于執(zhí)行對(duì)MSP430 Value Line設(shè)備的初始化過程的步驟。在這個(gè)練習(xí)中,您將編寫初始化代碼,并運(yùn)行該設(shè)備使用各種時(shí)鐘資源。

1、寫初始化代碼

本文引用地址:http://m.butianyuan.cn/article/201611/316486.htm

2、運(yùn)行CPU的MCLK的來源方式:VLO 、32768晶體、DCO

3、主體程序部分

4、觀察LED閃光燈速度

MSP430時(shí)鐘:

1、在MSP430單片機(jī)中一共有三個(gè)時(shí)鐘源:

一個(gè)LFXT1CLK,為低速/高速晶振源,通常接32.768khz,也可以接(400khz~8Mhz);

一個(gè)為XT2CLK,外接標(biāo)準(zhǔn)高速晶振,通常是接8Mhz,也可以接(400khz~8Mhz);

還有一個(gè)叫DCOCLK,為內(nèi)部晶振,有RC震蕩回路構(gòu)成。

2、在MSP430單片機(jī)內(nèi)部一共有三個(gè)時(shí)鐘系統(tǒng) :

一個(gè)為ACLK,通常由LFXT1CLK作為時(shí)鐘源,可以通過軟件控制改時(shí)鐘的分頻系數(shù)樹;

一個(gè)為MCLK(Main CLK)一聽就知道是主時(shí)鐘單元,為系統(tǒng)內(nèi)核提供時(shí)鐘,它可以通過軟件從三個(gè)時(shí)鐘源選擇;

還有一個(gè)為SMCLK,稱作輔助主時(shí)鐘,也是可以由軟件選擇時(shí)鐘源。

Basic Clock Module Registers(基礎(chǔ)時(shí)鐘寄存器)

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的時(shí)鐘設(shè)置包括3個(gè)寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3

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

DCO2

DCO1

DCO0

MOD4

MOD3

MOD2

MOD1

MOD0

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

MOD0~MOD4: Modulation Bit,頻率的微調(diào)。

一般不需要DCO的場(chǎng)合保持默認(rèn)初始值就行了。

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

XT2OFF

XTS

DIVA1

DIVA0

XT5V

RSEL2

RSEL1

RSEL0

RSEL0~RSEL2: 選擇某個(gè)內(nèi)部電阻以決定標(biāo)稱頻率.0最低,7最高。

XT5V: 1.

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

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

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

正常情況下把XT2OFF復(fù)位就可以了.

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

SEM1

SELM0

DIVM1

DIVM0

SELS

DIVS1

DIVS0

DCOR

DCOR: Enable External Resistor. 0,選擇內(nèi)部電阻;1,選擇外部電阻

DIVS0~DIVS1: DIVS=0,1,2,3對(duì)應(yīng)SMCLK的分頻因子為1,2,4,8

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

DIVM0~1: 選擇MCLK的分頻因子, DIVM=0,1,2,3對(duì)應(yīng)分頻因子為1,2,4,8.

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

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

其它:

1. LFXT1: 一次有效的PUC信號(hào)將使OSCOFF復(fù)位,允許LFXT1工作,如果LFXT1信號(hào)沒有用作SMCLK或MCLK,可軟件置OSCOFF關(guān)閉LFXT1.

2. XT2: XT2產(chǎn)生XT2CLK時(shí)鐘信號(hào),如果XT2CLK信號(hào)沒有用作時(shí)鐘MCLK和SMCLK,可以通過置XT2OFF關(guān)閉XT2,PUC信號(hào)后置XT2OFF,即XT2的關(guān)閉的。

3. DCO振蕩器:振蕩器失效時(shí),DCO振蕩器會(huì)自動(dòng)被選做MCLK的時(shí)鐘源。如果DCO信號(hào)沒有用作SMCLK和MCLK時(shí)鐘信號(hào)時(shí),可置SCG0位關(guān)閉DCO直流發(fā)生器。

4. 在PUC信號(hào)后,由DCOCLK作MCLK的時(shí)鐘信號(hào),根據(jù)需要可將MCLK的時(shí)鐘源另外設(shè)置為LFXT1或XT2,設(shè)置順序如下:

(1)清OSCOFF/XT2

(2)清OFIFG

(3)延時(shí)等待至少50uS

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

(5)設(shè)置BCSCTL2的相應(yīng)SELM。

實(shí)例分析

1、CPU運(yùn)行在VLO時(shí)鐘下:

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

#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門狗定時(shí)器

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

P1OUT = 0; // 關(guān)閉LED

BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

IFG1&= ~OFIFG; // 清除OSCFault 標(biāo)志

__bis_SR_register(SCG1 + SCG0); // 關(guān)閉 DCO

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

while(1)

{

P1OUT = 0x40; // 開啟LED

_delay_cycles(100);

P1OUT = 0; // 關(guān)閉 LED

_delay_cycles(5000);

}

}

2、CPU運(yùn)行在晶振(32768Hz)時(shí)鐘下:

晶體頻率為32768赫茲,約3倍的VLO。如果我們?cè)谇懊娴拇a中使用晶振,指示燈應(yīng)閃爍大約每秒一次。你知道為什么32768赫茲是一個(gè)標(biāo)準(zhǔn)?這是因?yàn)檫@個(gè)數(shù)字是2的15次方,因此很容易用簡單的數(shù)字計(jì)數(shù)電路,以每秒一次獲得率 ——手表和其他時(shí)間時(shí)基。認(rèn)識(shí)到ACLK來自外部晶振時(shí)鐘。

#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門狗定時(shí)器

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

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

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

while(IFG1&OFIFG)

{

IFG1&= ~OFIFG; // 清除 OSCFault 標(biāo)志

_delay_cycles(100000); // 為可見的標(biāo)志延時(shí)

}

P1OUT = 0; // 關(guān)閉P1

__bis_SR_register(SCG1 + SCG0); // 關(guān)閉 DCO

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

while(1)

{

P1OUT = 0x40; // 開啟 LED

_delay_cycles(100);

P1OUT = 0; / / 關(guān)閉LED

_delay_cycles(5000);

}

}

3、CPU運(yùn)行在晶振(32768Hz)和DCO時(shí)鐘下:

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

#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門狗定時(shí)器

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

{

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

}

BCSCTL1 = CALBC1_1MHZ; // Set range

DCOCTL = CALDCO_1MHZ; //設(shè)置DCO模式

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

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

BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz

while(IFG1&OFIFG)

{

IFG1&= ~OFIFG; // 清除OSCFault 標(biāo)志

_delay_cycles(100000); // 為可見標(biāo)志延時(shí)

}

P1OUT = 0; // P1.6 關(guān)閉

// __bis_SR_register(SCG1 + SCG0); // 關(guān)閉DCO

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

while(1)

{

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

_delay_cycles(100);

P1OUT = 0; / / P1.6 關(guān)閉

_delay_cycles(5000);

}

}

4、CPU運(yùn)行在DCO時(shí)鐘下:

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

#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門狗定時(shí)器

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

{

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

}

BCSCTL1 = CALBC1_1MHZ; // Set range

DCOCTL = CALDCO_1MHZ; // 設(shè)置DCO模式

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

P1OUT = 0; // P1關(guān)閉

BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

IFG1&= ~OFIFG; // 清除 OSCFault 標(biāo)志

//__bis_SR_register(SCG1 + SCG0); // 關(guān)閉DCO

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

while(1)

{

P1OUT = 0x40; // P1.6 關(guān)閉

_delay_cycles(100);

P1OUT = 0; // P1.6 開啟

_delay_cycles(5000);

}

}

以下將會(huì)分析上面4個(gè)例子的代碼細(xì)微差別:

首先讓我們看一下msp430x20x2.h這個(gè)文件中的內(nèi)容,由于頭文件信息量很大這里就只簡單說明和以上四個(gè)代碼有關(guān)的部分,其余請(qǐng)大家自行閱讀。

一、WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門狗定時(shí)器(例1、2、3、4)

頭文件中的相關(guān)說明如下:

/************************************************************

* WATCHDOG TIMER

************************************************************/

#define __MSP430_HAS_WDT__ /* Definition to show that Module is available */

SFR_16BIT(WDTCTL); /* Watchdog Timer Control */

/* The bit names have been prefixed with "WDT" */

#define WDTIS0 (0x0001)

#define WDTIS1 (0x0002)

#define WDTSSEL (0x0004)

#define WDTCNTCL (0x0008)

#define WDTTMSEL (0x0010)

#define WDTNMI (0x0020)

#define WDTNMIES (0x0040)

#define WDTHOLD (0x0080)

#define WDTPW (0x5A00)

這個(gè)指令設(shè)置密碼(WDTPW)和停止位定時(shí)器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的輔助下完成。

舉例如下:

A、間隔時(shí)間由Bit0-2位編碼:

1、看門狗的時(shí)鐘由FSMCLK(假設(shè)為1MHz)

#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */

#define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) /* 8ms " */

#define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) /* 0.5ms " */

#define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */

2、看門狗的時(shí)鐘由FACLK(假設(shè)為32KHz)

#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) /* 1000ms " */

#define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */

#define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */

B、看門狗模式——在過期時(shí)間后重啟:

1、看門狗的時(shí)鐘由FSMCLK(假設(shè)為1MHz)

#define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */

#define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms " */

#define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms " */

#define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */

2、看門狗的時(shí)鐘由FACLK(假設(shè)為32KHz)

#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms " */

#define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */

#define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */

#define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */

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

P1OUT = 0; // P1關(guān)閉 (例1、2、3、4)

其中DIR 和P1OUT分別配置IO口的方向和輸出值,這里不在贅述,請(qǐng)參考手冊(cè)。

三、BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO (例1和例4)

BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz (例2和例3)

/************************************************************

* Basic Clock Module

************************************************************/

#define __MSP430_HAS_BC2__

/* Definition to show that Module is available */

SFR_8BIT(DCOCTL); /* DCO Clock Frequency Control */

SFR_8BIT(BCSCTL1); /* Basic Clock System Control 1 */

SFR_8BIT(BCSCTL2); /* Basic Clock System Control 2 */

SFR_8BIT(BCSCTL3); /* Basic Clock System Control 3 */

#define MOD0 (0x01) /* Modulation Bit 0 */

#define MOD1 (0x02) /* Modulation Bit 1 */

#define MOD2 (0x04) /* Modulation Bit 2 */

#define MOD3 (0x08) /* Modulation Bit 3 */

#define MOD4 (0x10) /* Modulation Bit 4 */

#define DCO0 (0x20) /* DCO Select Bit 0 */

#define DCO1 (0x40) /* DCO Select Bit 1 */

#define DCO2 (0x80) /* DCO Select Bit 2 */

#define LFXT1OF (0x01)

/* Low/high Frequency Oscillator Fault Flag */

#define XT2OF (0x02)

/* High frequency oscillator 2 fault flag */

#define XCAP0 (0x04) /* XIN/XOUT Cap 0 */

#define XCAP1 (0x08) /* XIN/XOUT Cap 1 */

#define LFXT1S0 (0x10) /* Mode 0 for LFXT1 (XTS = 0) */

#define LFXT1S1 (0x20) /* Mode 1 for LFXT1 (XTS = 0) */

#define XT2S0 (0x40) /* Mode 0 for XT2 */

#define XT2S1 (0x80) /* Mode 1 for XT2 */

#define XCAP_0 (0x00) /* XIN/XOUT Cap : 0 pF */

#define XCAP_1 (0x04) /* XIN/XOUT Cap : 6 pF */

#define XCAP_2 (0x08) /* XIN/XOUT Cap : 10 pF */

#define XCAP_3 (0x0C) /* XIN/XOUT Cap : 12.5 pF */

#define LFXT1S_0 (0x00)

/* Mode 0 for LFXT1 : Normal operation */

#define LFXT1S_1 (0x10) /* Mode 1 for LFXT1 : Reserved */

#define LFXT1S_2 (0x20) /* Mode 2 for LFXT1 : VLO */

#define LFXT1S_3 (0x30)

/* Mode 3 for LFXT1 : Digital input signal */

#define XT2S_0 (0x00) /* Mode 0 for XT2 : 0.4 - 1 MHz */

#define XT2S_1 (0x40) /* Mode 1 for XT2 : 1 - 4 MHz */

#define XT2S_2 (0x80) /* Mode 2 for XT2 : 2 - 16 MHz */

#define XT2S_3 (0xC0)

/* Mode 3 for XT2 : Digital input signal */

四、__bis_SR_register(SCG1 + SCG0); // 關(guān)閉 DCO

__bis_SR_register()是在intrinsics.h這個(gè)頭文件中定義了,實(shí)現(xiàn)的功能是將SR中的位置零。

關(guān)于頭文件中的代碼作用

#ifdef __cplusplus

extern "C"

{

#endif

#ifdef __cplusplus

}

#endif /* extern "C" */

一般用于將C++代碼以標(biāo)準(zhǔn)C形式輸出(即以C的形式被調(diào)用),這是因?yàn)镃++雖然常被認(rèn)為是C的超集,但是C++的編譯器還是與C的編譯器不同的。C中調(diào)用C++中的代碼這樣定義會(huì)是安全的。

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

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

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

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

MSP430中有如下定義:

#define RSEL0 (0x01) /* Range Select Bit 0 */

#define RSEL1 (0x02) /* Range Select Bit 1 */

#define RSEL2 (0x04) /* Range Select Bit 2 */

#define RSEL3 (0x08) /* Range Select Bit 3 */

#define DIVA0 (0x10) /* ACLK Divider 0 */

#define DIVA1 (0x20) /* ACLK Divider 1 */

#define XTS (0x40)

/* LFXTCLK 0:Low Freq. / 1: High Freq. */

#define XT2OFF (0x80) /* Enable XT2CLK */

#define DIVA_0 (0x00) /* ACLK Divider 0: /1 */

#define DIVA_1 (0x10) /* ACLK Divider 1: /2 */

#define DIVA_2 (0x20) /* ACLK Divider 2: /4 */

#define DIVA_3 (0x30) /* ACLK Divider 3: /8 */

#define DIVS0 (0x02) /* SMCLK Divider 0 */

#define DIVS1 (0x04) /* SMCLK Divider 1 */

#define SELS (0x08)

/* SMCLK Source Select 0:DCOCLK / 1:XT2CLK/LFXTCLK */

#define DIVM0 (0x10) /* MCLK Divider 0 */

#define DIVM1 (0x20) /* MCLK Divider 1 */

#define SELM0 (0x40) /* MCLK Source Select 0 */

#define SELM1 (0x80) /* MCLK Source Select 1 */

#define DIVS_0 (0x00) /* SMCLK Divider 0: /1 */

#define DIVS_1 (0x02) /* SMCLK Divider 1: /2 */

#define DIVS_2 (0x04) /* SMCLK Divider 2: /4 */

#define DIVS_3 (0x06) /* SMCLK Divider 3: /8 */

#define DIVM_0 (0x00) /* MCLK Divider 0: /1 */

#define DIVM_1 (0x10) /* MCLK Divider 1: /2 */

#define DIVM_2 (0x20) /* MCLK Divider 2: /4 */

#define DIVM_3 (0x30) /* MCLK Divider 3: /8 */

#define SELM_0 (0x00) /* MCLK Source Select 0: DCOCLK */

#define SELM_1 (0x40) /* MCLK Source Select 1: DCOCLK */

#define SELM_2 (0x80)

/* MCLK Source Select 2: XT2CLK/LFXTCLK */

#define SELM_3 (0xC0)

/* MCLK Source Select 3: LFXTCLK */

六、BCSCTL1 = CALBC1_1MHZ; //設(shè)置值 (例3、4)

#ifndef __DisableCalData

SFR_8BIT(CALDCO_16MHZ); /* DCOCTL Calibration Data for 16MHz */

SFR_8BIT(CALBC1_16MHZ); /* BCSCTL1 Calibration Data for 16MHz */

SFR_8BIT(CALDCO_12MHZ); /* DCOCTL Calibration Data for 12MHz */

SFR_8BIT(CALBC1_12MHZ); /* BCSCTL1 Calibration Data for 12MHz */

SFR_8BIT(CALDCO_8MHZ); /* DCOCTL Calibration Data for 8MHz */

SFR_8BIT(CALBC1_8MHZ); /* BCSCTL1 Calibration Data for 8MHz */

SFR_8BIT(CALDCO_1MHZ); /* DCOCTL Calibration Data for 1MHz */

SFR_8BIT(CALBC1_1MHZ); /* BCSCTL1 Calibration Data for 1MHz */

#endif /* #ifndef __DisableCalData */

關(guān)于SFR_8BIT的相關(guān)說明:

External references resolved by a device-specific linker command file

(外部引用解決的特定于設(shè)備的連接器命令文件)

#define SFR_8BIT(address) extern volatile unsigned char address

#define SFR_16BIT(address) extern volatile unsigned int address

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

{

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

} (例3、例4)

請(qǐng)注意這里的陷阱。它可以清除內(nèi)存段信息。

八、IFG1&= ~OFIFG; // 清除OSCFault 標(biāo)志 (例1、例4)

時(shí)鐘系統(tǒng)將強(qiáng)制使用的MCLK作為其源的DCO在一個(gè)時(shí)鐘故障的存在。因此,我們必須清除故障標(biāo)志。

FG1中斷標(biāo)志寄存器是1。寄存器中的位域是唯一的振蕩器故障中斷標(biāo)志 - OFIFG。

九、while(IFG1&OFIFG)

{

IFG1&= ~OFIFG; // 清除OSCFault 標(biāo)志

_delay_cycles(100000); // 為可見標(biāo)志延時(shí)

} (例2、例3)

在上面的代碼我們把OSCFault標(biāo)志繼續(xù)做我們的任務(wù),由于時(shí)鐘系統(tǒng)將默認(rèn)為VLO?,F(xiàn)在,我們希望確保該標(biāo)志保持清零,這意味著晶體是啟動(dòng)并運(yùn)行著的。

如果該故障標(biāo)志是明確的,我們就退出循環(huán)。我們需要等待清算后的標(biāo)志,直到我們?cè)俅螠y(cè)試50微秒。該_delay_cycles(100000)。我們需要它是那么長的時(shí)間,所以我們可以看到在代碼開頭的LED燈。否則,它會(huì)這么快,我們的光將無法看到它。

配置:

BCSCTL1

BCSCTL2

BCSCTL3

DCOCTL

IFG1

VLO(12KHz)

SELM_3 + DIVM_3

LFXT1S_2

32768KHz

SELM_3 + DIVM_3

LFXT1S_0

While

晶振、DCO

SELM_0+ DIVM_3

LFXT1S_0

While

DCO

CALBC1_1MHZ

SELM_0+ DIVM_3

LFXT1S_2

CALDCO_1MHZ

結(jié)果:

ACLK

MCLK

LFXT1

VLO(12KHz)

VLO

VLO/8

VLO

32768Hz

32768Hz

32768Hz/8

32768Hz

晶振、DCO

32768Hz

DCO

32768Hz

DCO

VLO

DCO/8

VLO

首先申明一下我也是才剛剛開始接觸MSP430的片子,算是和大家一起學(xué)習(xí)吧,很多地方也不是很清楚??傊M蠹液煤皿w會(huì)一下MSP430的頭文件(名為:msp430x20x2.h),如果文章中有錯(cuò)誤的話希望大家發(fā)郵件給我。純屬菜鳥入門級(jí)別文檔,只是簡單的分析了一下MSP430的時(shí)鐘配置問題,對(duì)于一個(gè)單片機(jī)系統(tǒng)而言時(shí)鐘可謂是重中之重,可能剛?cè)腴T多是采用51系列的片子(不包括C8051f系列)所以對(duì)時(shí)鐘也就沒有過多的接觸,只是涉及速度以及延時(shí)程序的時(shí)候才會(huì)去關(guān)心。其實(shí)芯片越是高端越是對(duì)時(shí)鐘有很高的要求,不管是PIC、AVR還是C8051F這些8位的片子,在32位的領(lǐng)域更是這樣,像我所熟悉的Cortex-M3系列包括STM32f103、Stellaris、NXP都是這樣,片子內(nèi)部的時(shí)鐘都是相當(dāng)?shù)膹?fù)雜。

最后在來嘮叨幾句,記得以前玩51的時(shí)候那個(gè)頭文件真是小兒科,只有寄存器的定義還有一些位操作。程序?qū)懫饋硐喈?dāng)?shù)穆闊?,很多東西都需要去記憶或者干脆去看文檔,所以那個(gè)時(shí)候還特地寫了一個(gè)驅(qū)動(dòng)庫(效仿STM32f103給STC12C5A60S2寫的,取名為Easy Hw OS,其實(shí)還是很方便的直接調(diào)用函數(shù)就可以啦),看到430的頭文件才豁然開朗,這樣做好,雖然沒有驅(qū)動(dòng)庫方便但是很靈活也不需要去記憶那些寄存器的,真的很不錯(cuò)。喜歡上了430為文以記之。



評(píng)論


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

關(guān)閉