在msp430中時(shí)鐘源有低頻振蕩器,高頻振蕩器和數(shù)控振蕩器,時(shí)鐘有主時(shí)鐘,子系統(tǒng)時(shí)鐘,和輔助系統(tǒng)時(shí)鐘,怎么配置時(shí)鐘才能選擇我所需要的時(shí)鐘源啊?
首先,MSP430不像51只有有一個(gè)外部晶振作為時(shí)鐘源,MSP430又有3到4個(gè)時(shí)鐘源!外部可接兩個(gè)晶振,一個(gè)高頻晶振XT2CLK(0.4M~16M),一個(gè)低平晶振LFXT1CLK(32768HZ)。。內(nèi)部有一個(gè)數(shù)字振蕩器DCO。MSP430中規(guī)定了3種時(shí)鐘信號(hào):ACLK,MACLK,SMCLK。ACLK(輔助時(shí)鐘信號(hào)),LFXT1CLK是該時(shí)鐘信號(hào)的時(shí)鐘源,ACLK主要用作一些低頻模塊。MACLK(主時(shí)鐘信號(hào)),XT2CLK,LFXT1CLK,DCO都可以是該時(shí)鐘信號(hào)的時(shí)鐘源,MACLK主要給CPU和系統(tǒng)提供時(shí)鐘信號(hào)。SMCLK(子時(shí)鐘信號(hào)),XT2CLK,LFXT1CLK,DCO都可以是該時(shí)鐘信號(hào)的時(shí)鐘源,SMCLK主要用作一些低頻模塊??吹竭@里,看到有點(diǎn)亂了,別著急,慢慢理清思路。下面的圖片幫大家理解一下
MSP430的基本時(shí)鐘源有3個(gè): LFXT1CLK, XT2CLK, DCOCLK ; -
其中: LFXT1CLK:可以用低頻鐘表晶體、標(biāo)準(zhǔn)晶體、陶瓷諧振器或外接時(shí)鐘源工作。 -
XT2CLK:可以用標(biāo)準(zhǔn)晶體、陶瓷諧振器或外接450khz~8mhz的時(shí)鐘源工作。 -
DCOCLK:它是內(nèi)部數(shù)字控制RC振蕩器,可以調(diào)節(jié)。
MSP430的3種時(shí)鐘信號(hào)是: ACLK, MCLK, SMCLK;
其中: ACLK(輔助系統(tǒng)時(shí)鐘):可選時(shí)鐘源LFXT1CLK(只能是外部時(shí)鐘源),且一般為32768hz手表晶體)。
-MCLK(主時(shí)鐘):可選LFXT1CLK,XT2CLK, DCOCLK 三種時(shí)鐘源。用于CPU和系統(tǒng)。 -
SMCLK(子時(shí)鐘):可選LFXT1CLK,XT2CLK, DCOCLK 三種時(shí)鐘源。用于外圍器件。
?。∟otice:-LFXT1CLK when XT2 oscillator not present on-chip.)
ACLK和MCLK的區(qū)別:ACLK一般用于低速外設(shè) -
SMCLK主要用于高速外圍模塊
上電默認(rèn)是內(nèi)部800K的RC振蕩器,
下面給出了切換LFXT和XT2作為系統(tǒng)時(shí)鐘的例子:
切換為L(zhǎng)FXT:
do
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i 》 0; i--);
}
while ((IFG1 & OFIFG));
BCSCTL2 |= SELM_3;//選擇鐘表時(shí)鐘
切換為XT2:
BCSCTL1&=~XT2OFF;//啟動(dòng)XT2時(shí)鐘
do
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i 》 0; i--);
}
while ((IFG1 & OFIFG));
BCSCTL2 |= SELM_2;
BCSCTL2 |= SELS;//選擇XT2時(shí)鐘
下面對(duì)與時(shí)鐘源有關(guān)的寄存器進(jìn)行分析
1:DCOCTL
DCOX(BIT7~BIT5):這三位與下面提到的RSELX共同來決定DCO的頻率范圍。RSELX選擇的是大范圍,DCOX選擇的是小范圍。例如RSELX先將范圍限定在1000~2000,DCOX則決定1000~2000之間的某個(gè)范圍。MOD(BIT4~BIT0):這5位不重要,可以不管他
2:BCSCTL1
XT2OFF(bit7):改為置1的話關(guān)閉高頻晶振。
XTS(bit6):LFXT1CLK模式選擇,置1的話選擇外部接高頻晶振,置0的話這接32768HZ的晶振。
DIVX(bit5~bit4):ACLk分頻。ACLK可以經(jīng)1/2/4/8/分頻后供給相應(yīng)模塊。RSELX:前面已經(jīng)提到,與DCOX同來決定DCO的頻率范圍。
3:BCSCTL2
SELMX(BIT7~BIT6):MCLK時(shí)鐘來源選擇位。00:選擇DCO作為MCLK的時(shí)鐘源。01:選擇DCO作為MCLK的時(shí)鐘源。10:選擇高頻晶振作為MCLK的時(shí)鐘源。11:選擇低頻晶振作為MCLK的時(shí)鐘源。DIVMX(BIT5~BIT4):MCLk分頻。
SELS(BIT3):SCLK時(shí)鐘源選擇位。0:選擇DCO作為SCLK的時(shí)鐘源.1:選擇高頻晶振作為SCLK的時(shí)鐘源,若高頻晶振不存在,則選擇低頻晶振作為SCLK的時(shí)鐘源。
DIVSX:SCLK分頻。
DCOR:該位不重要
? ? ? ? ?4:BCSCTL3
XT2SX(BIT7~BIT6):高頻晶振頻率范圍選擇。00:0.4M~1M.01:1M~3M.10:3~16M.LFXT1SX(BIT5~BIT4):低頻晶振范圍選擇。
XCAPX:當(dāng)XTS=0時(shí),LFX1CLK選擇的是低頻模式時(shí),需要用改為選擇內(nèi)部電容來幫助晶振起振。00:1pf01:6pf10:10pf11:12pf.
當(dāng)XTS=1時(shí),LFX1CLK選擇高頻模式,需要要外部接電容來起振,所以XCAPX必須置0.
XT2OF:當(dāng)高頻晶振被選擇后卻沒工作,改為會(huì)被置1.LFXT1OF:當(dāng)?shù)皖l晶振被選擇后卻沒工作,該為被置1.5:IFG1
OFIFG:晶振被選擇后卻沒工作,改為被置1
XT2OF:當(dāng)高頻晶振被選擇后卻沒工作,改為會(huì)被置1.LFXT1OF:當(dāng)?shù)皖l晶振被選擇后卻沒工作,該為被置1.5:IFG1
OFIFG:晶振被選擇后卻沒工作,改為被置1
MSP430單片機(jī)復(fù)位后默認(rèn)使用DCO作為時(shí)鐘源,因此,如果想用外部晶振作為時(shí)鐘源需要對(duì)相關(guān)寄存器設(shè)置。下面舉例說明。
#include《msp430x14x.h》
#defineuintunsignedint
voidmain(){uinta;
WDTCTL=WDTHOLD+WDTPW;//關(guān)閉看門狗
BCSCTL1&=~XT2OFF;//首先打開外部晶體振蕩器。也就是將XT2OFF清零。
//置一用或,清零用于。
do{
IFG1&=~OFIFG;//清除晶體振蕩器失效標(biāo)志OFIFG標(biāo)志for(a=0xff;a》0;a--);//等待50us,等待晶體振蕩器正常工作}
while((IFG1&OFIFG));//當(dāng)OFIFG等于0的時(shí)候結(jié)束,說明晶體振蕩器正//常工作了
while(1){
//這里就可以寫用戶的程序指令了。}}
MSP430F149 時(shí)鐘源選擇
#include《msp430x14x.h》//#defineExterior_8MHz
0x55
//MCLK和SMCLK選擇外部8M高頻晶振
#defineu8unsignedchar#defineu16unsignedshort#defineu32unsignedlong
voidDelay_ms(u16Time)//軟件ms延時(shí),1MHz頻率下{
#ifdefExterior_8MHzu16i,j,z;
for(i=0;i《Time;i++)for(j=0;j《10;j++)for(z=0;z《158;z++);
#elseu16i,j;
for(i=0;i《Time;i++)for(j=0;j《200;j++);
#endif}
voidDelay_us(u16Time)//軟件us延時(shí),1MHz頻率下{
u16i;
for(i=0;i《Time;i++){
_NOP();_NOP();}}
voidSystem_Clock_Init(void)//系統(tǒng)時(shí)鐘源配置{
#ifdefExterior_8MHz
/*------選擇系統(tǒng)主時(shí)鐘為8MHz-------*/u8z;
BCSCTL1&=~XT2OFF;//打開XT2高頻晶體振蕩器do{
IFG1&=~OFIFG;//清除晶振失敗標(biāo)志for(z=0xFF;z》0;z--);//等待8MHz晶體起振}
while((IFG1&OFIFG));//晶振失效標(biāo)志仍然存在?BCSCTL2|=SELM_2+SELS;//MCLK和SMCLK選擇高頻晶振
#else
/*------選擇系統(tǒng)主時(shí)鐘為DCO1MHz-------*/DCOCTL=0x00;
BCSCTL1&=~0x07;//清零DCOx,MODx,RSELx位
DCOCTL|=DCO2+DCO1+MOD2+MOD1+MOD0;//DCO=6,MOD=7BCSCTL1|=RSEL2;//RSEL=4#endif
}
voidmain(void){
WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗System_Clock_Init();
P4DIR=BIT0+BIT1+BIT2+BIT3;//P4.0,P4.1,P4.2,P4.3設(shè)置輸出while(1){
P4OUT&=~(BIT0+BIT1+BIT2+BIT3);Delay_ms(5);
P4OUT|=BIT0+BIT1+BIT2+BIT3;Delay_ms(5);}}
評(píng)論
查看更多