1、在MSP430單片機中一共有三個時鐘源: 一個LFXT1CLK,為低速/高速晶振源,通常接32.768khz,也可以接(400khz~8Mhz); 一個為XT2CLK,外接標準高速晶振,通常是接8Mhz,也可以接(400khz~8Mhz); 還有一個叫DCOCLK,為內部晶振,有RC震蕩回路構成。 2、在MSP430單片機內部一共有三個時鐘系統: 一個為ACLK,通常由LFXT1CLK作為時鐘源,可以通過軟件控制改時鐘的分頻系數樹; 一個為MCLK(Main CLK)一聽就知道是主時鐘單元,為系統內核提供時鐘,它可以通過軟件從三個時鐘源選擇; 還有一個為SMCLK,稱作輔助主時鐘,也是可以由軟件選擇時鐘源。 Basic Clock Module Registers(基礎時鐘寄存器) 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的時鐘設置包括3個寄存器,DCOCTL、BCSCTL1、BCSCTL2 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最高。 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 void main(void) { WDTCTL = WDTPW + WDTHOLD; 關閉看門狗定時器 P1DIR = 0x40; 配置輸出 P1OUT = 0; 關閉LED BCSCTL3 |= LFXT1S_2; IFG1 &= ~OFIFG; 清除OSCFault 標志 __bis_SR_register(SCG1 + SCG0); 關閉 DCO BCSCTL2 |= SELM_3 + DIVM_3; 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); 掛起 } BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; 設置DCO模式 P1DIR = 0x41; 和P1.6配置輸出 P1OUT = 0x01; 開啟 BCSCTL3 |= LFXT1S_0; while(IFG1 & OFIFG) { IFG1 &= ~OFIFG; 清除OSCFault 標志 _delay_cycles(100000); 為可見標志延時 } P1OUT = 0; 關閉 // __bis_SR_register(SCG1 + SCG0); 關閉DCO BCSCTL2 |= SELM_0 + DIVM_3; while(1) { P1OUT = 0x40; 開啟 _delay_cycles(100); P1OUT = 0; 關閉 _delay_cycles(5000); } } |