msp時(shí)鐘設(shè)置程序
吐槽一下MSP430需要明白的東西:
在430中,一個(gè)時(shí)鐘周期 = MCLK晶振的倒數(shù)。如果MCLK是8M,則一個(gè)時(shí)鐘周期為1/8us;
一個(gè)機(jī)器周期 = 一個(gè)時(shí)鐘周期,即430每個(gè)動(dòng)作都能完成一個(gè)基本操作;
一個(gè)指令周期 = 1~6個(gè)機(jī)器周期,具體根據(jù)具體指令而定。
另:指令長(zhǎng)度,只是一個(gè)存儲(chǔ)單位與時(shí)間沒有必然關(guān)系。
MSP430根據(jù)型號(hào)的不同最多可以選擇使用3個(gè)振蕩器。我們可以根據(jù)需要選擇合適的振蕩頻率,并可以在不需要時(shí)隨時(shí)關(guān)閉振蕩器,以節(jié)省功耗。這3個(gè)振蕩器分別為:
(1)DCO 數(shù)控RC振蕩器。它在芯片內(nèi)部,不用時(shí)可以關(guān)閉。DCO的振蕩頻率會(huì)受周圍環(huán)境溫度和MSP430工作電壓的影響,且同一型號(hào)的芯片所產(chǎn)生的頻率也不相同。但DCO的調(diào)節(jié)功能可以改善它的性能,他的調(diào)節(jié)分為以下3個(gè)步驟
a:選擇BCSCTL1.RSELx確定時(shí)鐘的標(biāo)稱頻率;
b:選擇DCOCTL.DCOx在標(biāo)稱頻率基礎(chǔ)上分段粗調(diào);
c:選擇DCOCTL.MODx的值進(jìn)行細(xì)調(diào)。
(2)LFXT1 接低頻振蕩器。典型為接32768HZ的時(shí)鐘振蕩器,此時(shí)振蕩器不需要接負(fù)載電容。也可以接450KHZ~8MHZ的標(biāo)準(zhǔn)晶體振蕩器,此時(shí)需要接負(fù)載電容。
(3)XT2 接450KHZ~8MHZ的標(biāo)準(zhǔn)晶體振蕩器。此時(shí)需要接負(fù)載電容,不用時(shí)可以關(guān)閉。
低頻振蕩器主要用來降低能量消耗,如使用電池供電的系統(tǒng),高頻振蕩器用來對(duì)事件做出快速反應(yīng)或者供CPU進(jìn)行大量運(yùn)算。當(dāng)然高端430還有鎖頻環(huán)(FLL)及FLL+等模塊,但是初步不用考慮那么多。
MSP430的3種時(shí)鐘信號(hào):MCLK系統(tǒng)主時(shí)鐘;SMCLK系統(tǒng)子時(shí)鐘;ACLK輔助時(shí)鐘。
(1)MCLK系統(tǒng)主時(shí)鐘。除了CPU運(yùn)算使用此時(shí)鐘以外,外圍模塊也可以使用。MCLK可以選擇任何一個(gè)振蕩器所產(chǎn)生的時(shí)鐘信號(hào)并進(jìn)行1、2、4、8分頻作為其信號(hào)源。
(2)SMCLK系統(tǒng)子時(shí)鐘。供外圍模塊使用。并在使用前可以通過各模塊的寄存器實(shí)現(xiàn)分頻。SMCLK可以選擇任何一個(gè)振蕩器所產(chǎn)生的時(shí)鐘信號(hào)并進(jìn)行1、2、4、8分頻作為其信號(hào)源。
(3)ACLK輔助時(shí)鐘。供外圍模塊使用。并在使用前可以通過各模塊的寄存器實(shí)現(xiàn)分頻。但ACLK只能由LFXT1進(jìn)行1、2、4、8分頻作為信號(hào)源。
PUC復(fù)位后,MCLK和SMCLK的信號(hào)源為DCO,DCO的振蕩頻率默認(rèn)為800KHZ。ACLK的信號(hào)源為L(zhǎng)FXT1。
MSP430內(nèi)部含有晶體振蕩器失效監(jiān)測(cè)電路,監(jiān)測(cè)LFXT1(工作在高頻模式)和XT2輸出的時(shí)鐘信號(hào)。當(dāng)時(shí)鐘信號(hào)丟失50us時(shí),監(jiān)測(cè)電路捕捉到振蕩器失效。如果MCLK信號(hào)來自LFXT1或者XT2,那么MSP430自動(dòng)把MCLK的信號(hào)切換為DCO,這樣可以保證程序繼續(xù)運(yùn)行。但MSP430不對(duì)工作在低頻模式的LFXT1進(jìn)行監(jiān)測(cè)。
看圖:有圖可知,P5.4,P5.5,P5.6的第二功能可以對(duì)外輸出時(shí)鐘時(shí)鐘
示例代碼:
#include
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
DCOCTL = DCO0+DCO1+DCO2;//表示把三位全部置位為1,使內(nèi)部的頻率達(dá)到最大
BCSTL1 =RSEL0+RSEL1+RSEL2;//設(shè)置BCSCTL1
BCSCTL2 "=SELS;//設(shè)置BCSCTL2
P5DIR |=0x70;//設(shè)置P5.5,P5.6,P5.7的輸入輸出
P5SEL |=0x70;
while(1);
}