上電復位后,DCO約為800KHz
SP430 系列單片機基礎時鐘主要是由低頻晶體振蕩器,高頻晶體振蕩器,數字控振蕩器(DCO),鎖頻環(FLL)及 FLL+等模塊構成。由于 430 系列單片機中的型號不同而時鐘模塊也將有所不同。雖然不同型號的單片機的時基模塊有所不同,但這些模塊生出來的結果是相同的.在MSP430F13、 14中是有TX2振蕩器的, 而MSP430F11X,F11中是用LFXT1CLK來代替XT2CLK時鐘信號的.在時鐘模塊中有3個(對于F13,F14)時信號源(或 2個時鐘信號源,對于F11X、F11X1):
1-LFXT1CLK: 低頻/高頻時鐘源.由外接晶體振蕩器,而無需外接兩個振蕩電容器常使用的晶體振蕩器是32768HZ。
2-XT2CLK: 高頻時鐘源.由外接晶體振蕩器。需要外接兩個振蕩電容器,較常的晶體振蕩器是 8MHZ。
3-DCOCLK: 數字可控制的 RC 振蕩器。
單片機上電默認是DCO時鐘。因為只要在正常工作電壓內,DOC會提供穩定的時鐘源。
PUC信號之后,DCOCLK被自動選擇MCLK時鐘信號,根據需要,MCLK的時鐘源可以另外設置為LFXT1或者XT2。設置順序如下:
1、復位OscOff
2、清除OFIFG
3、延時等待至少50us
4、再次檢查OFIFG,如果仍然置位,則重復3、4步驟,直到OFIFG=0為止。
MSP430 單片機時鐘模塊提供 3個時鐘信號輸出,以供給片內各部電路使用。
1-ACLK: 輔助時鐘信號.由圖所示,ACLK 是從 FLXT1CLK 信號由 1/2/4/8 分頻器分頻后所得到的.由BCSCTL1 寄存器設置DIVA相應為來決定分頻因子.ACLK可用于提供CPU外圍功能模塊作時鐘信號使用.
2-MCLK: 主時鐘信號.由圖所示,MCLK 是由 3 個時鐘源所提供的。他們分別是LFXT1CLK,XT2CLK(F13、F14,如果是 F11,F11X1 則由 LFXT1CLK 代替),DCO 時鐘源信號提供.MCLK主要用于MCU和相關系統模塊作時鐘使用。同樣可設置相關寄存器來決定分頻因子及相關的設置。
3-SMCLK: 子系統時鐘,SMCLK 是由 2 個時鐘源信號所提供.他們分別是XT2CLK(F13、F14)和DCO,如果是F11、F11X1則由LFXT1CLK代替TX2CLK。同樣可設置相關寄存器來決定分頻因子及相關的設置。
時鐘發生器的原理說明:
問題的提出:1、高頻、以便能對系統硬件請求和事件作出快速響應
2、低頻率,以便將電流消耗降制至最少
3、穩定的頻率,以滿足定時器的應用。
4、低 Q值振蕩器,以保證開始或停止操作沒有延時
MSP430 采用了一個折衷的辦法:就是用一個低頻晶鎮振,將其倍頻在高頻的工作頻率上。一般采用這種技術的實用方法有兩種,一個是說、鎖相環、 一個是鎖頻環,而鎖相環采用模擬的控制容易引起“失鎖”和易引起電容量的改變。而TI 采用的是鎖頻環技術,它采用數字控制器DCO和頻率積分來產 生高頻的運行時鐘頻率。
低功耗設置的技巧問題:
1、LPM4:在振蕩器關閉模式期間,處理機的所有部件工作停止,此時電流消 耗最小。此時只有在系統上電電路檢測到低點電平或任一請求異步響應中斷的外部中斷事件時才會從新工作。因此在設計上應含有可能需要用到的外部中斷才采用這種模式。否則發生不可預料的結果。
2、LPM3:在 DC 發生器關閉期間,只有晶振是活動的。但此時設置的基本時序條件的 DC 發生器的 DC 電流被關閉。由于此電路的高阻設計,使功耗被抑制。注:當從DC關閉到啟動DC0要花一端時間 (ns-us)
3、LPM2:在此期間,晶鎮振和DC發生器是工作的,所以可實現快速啟動。
4、LPM1:在此振蕩器已經工作,所以不存在啟動時間延時問題。
結合上述特點,在寫程序時要綜合考慮低功好耗特性,對外部事件的安排也很重要。必須在功能實現上綜合考慮才能達到你預期的效果。使用 C語言可用如下的語句:_BIS_SR(LMP3_bits)和_BIC_SR(LPM3 bits)
#include <msp430x14x.h>
#include "BoardConfig.h"
void DelayMs(unsigned int ms)
{
unsigned int i;
while(--ms)
{
for(i=110;i>0;--i);
}
}
void main(void)
{
volatile unsigned int i;
BoardConfig(0xb0);
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P5DIR |= 0x10; // P5.4= output direction
P5SEL |= 0x10; // P5.4= MCLK option select
BCSCTL1 &= ~XT2OFF; // XT2= HF XTAL
P2DIR |= 0xff;
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag清振蕩器失效標志
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?用外部時鐘速度會快很多
BCSCTL2 |= SELM_2; // MCLK= XT2 (safe)
for (;;) // Do nothing
{
P2OUT = ~P2OUT;
DelayMs(10000);// 用外部時鐘速度會快很多
}
}