1、在MSP430單片機(jī)中一共有三個時鐘源: 一個LFXT1CLK,為低速/高速晶振源,通常接32.768khz,也可以接(400khz~8Mhz); 一個為XT2CLK,外接標(biāo)準(zhǔn)高速晶振,通常是接8Mhz,也可以接(400khz~8Mhz); 還有一個叫DCOCLK,為內(nèi)部晶振,有RC震蕩回路構(gòu)成。 2、在MSP430單片機(jī)內(nèi)部一共有三個時鐘系統(tǒng): 一個為ACLK,通常由LFXT1CLK作為時鐘源,可以通過軟件控制改時鐘的分頻系數(shù)樹; 一個為MCLK(Main CLK)一聽就知道是主時鐘單元,為系統(tǒng)內(nèi)核提供時鐘,它可以通過軟件從三個時鐘源選擇; 還有一個為SMCLK,稱作輔助主時鐘,也是可以由軟件選擇時鐘源。 Basic Clock Module Registers(基礎(chǔ)時鐘寄存器) DCO control register Basic clock system control 1 Basic clock system control 2 Basic clock system control 3 SFR interrupt enable register 1 SFR interrupt flag register 1 3、MSP430的時鐘設(shè)置包括3個寄存器,DCOCTL、BCSCTL1、BCSCTL2 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的場合保持默認(rèn)初始值就行了。 BCSCTL1,Basic Clock System Control 1,地址為57H,初始值為84H XT2OFF XTS DIVA1 DIVA0 XT5V RSEL2 RSEL1 RSEL0 RSEL0~RSEL2: 選擇某個內(nèi)部電阻以決定標(biāo)稱頻率.0最低,7最高。 RSEL0~RSEL2: 選擇某個內(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對應(yīng)SMCLK的分頻因子為1,2,4,8 SELS: 選擇SMCLK的時鐘源, 0:DCOCLK; 1:XT2CLK/LFXTCLK. DIVM0~1: 選擇MCLK的分頻因子, DIVM=0,1,2,3對應(yīng)分頻因子為1,2,4,8. SELM0~1: 選擇MCLK的時鐘源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK 我用的時候一般都把SMCLK與MCLK的時鐘源選擇為XT2。 其它: 1. LFXT1: 一次有效的PUC信號將使OSCOFF復(fù)位,允許LFXT1工作,如果LFXT1信號沒有用作SMCLK或MCLK,可軟件置OSCOFF關(guān)閉LFXT1. 2. XT2: XT2產(chǎn)生XT2CLK時鐘信號,如果XT2CLK信號沒有用作時鐘MCLK和SMCLK,可以通過置XT2OFF關(guān)閉XT2,PUC信號后置XT2OFF,即XT2的關(guān)閉的。 3. DCO振蕩器:振蕩器失效時,DCO振蕩器會自動被選做MCLK的時鐘源。如果DCO信號沒有用作SMCLK和MCLK時鐘信號時,可置SCG0位關(guān)閉DCO直流發(fā)生器。 4. 在PUC信號后,由DCOCLK作MCLK的時鐘信號,根據(jù)需要可將MCLK的時鐘源另外設(shè)置為LFXT1或XT2,設(shè)置順序如下: (1)清OSCOFF/XT2 (2)清OFIFG (3)延時等待至少50uS (4)再次檢查OFIFG,如果仍置位,則重復(fù)(1)-(4)步,直到OFIFG=0為止。 (5)設(shè)置BCSCTL2的相應(yīng)SELM。 實例分析: 1、CPU運行在VLO時鐘下: 這是最慢的時鐘,在約12千赫茲下運行。因此,我們將通過可視化的LED閃爍的紅色慢慢地在約每3秒鐘率。 我們可以讓時鐘系統(tǒng)默認(rèn)這種狀態(tài),設(shè)置專門來操作VLO。我們將不使用任何ALCK外設(shè)時鐘在此實驗室工作, 但你應(yīng)該認(rèn)識到,ACLK來自VLO時鐘。 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; 關(guān)閉看門狗定時器 P1DIR = 0x40; 配置輸出 P1OUT = 0; 關(guān)閉LED BCSCTL3 |= LFXT1S_2; IFG1 &= ~OFIFG; 清除OSCFault 標(biāo)志 __bis_SR_register(SCG1 + SCG0); 關(guān)閉 DCO BCSCTL2 |= SELM_3 + DIVM_3; while(1) { P1OUT = 0x40; 開啟LED _delay_cycles(100); P1OUT = 0; 關(guān)閉 LED _delay_cycles(5000); } } 3、CPU運行在晶振(32768Hz)和DCO時鐘下: 最慢的頻率,我們可以運行DCO約在1MHz(這也是默認(rèn)速度)。 因此,我們將開始切換MCLK到DCO下。在大多數(shù)系統(tǒng)中,你會希望ACLK上運行的VLO或32768赫茲晶振。 由于ACLK在我們目前的代碼是在晶體上運行,我們會打開DCO計算。 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; 關(guān)閉看門狗定時器 if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) { while(1); 掛起 } BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; 設(shè)置DCO模式 P1DIR = 0x41; 和P1.6配置輸出 P1OUT = 0x01; 開啟 BCSCTL3 |= LFXT1S_0; while(IFG1 & OFIFG) { IFG1 &= ~OFIFG; 清除OSCFault 標(biāo)志 _delay_cycles(100000); 為可見標(biāo)志延時 } P1OUT = 0; 關(guān)閉 // __bis_SR_register(SCG1 + SCG0); 關(guān)閉DCO BCSCTL2 |= SELM_0 + DIVM_3; while(1) { P1OUT = 0x40; 開啟 _delay_cycles(100); P1OUT = 0; 關(guān)閉 _delay_cycles(5000); } } |