關(guān)于MSP430F449時(shí)鐘
前幾周使用MSP430F449做產(chǎn)品,因?yàn)橹俺晒Φ厥褂眠^(guò)MSP430F149做過(guò)東西,心想449也是一個(gè)模子出來(lái)的換湯不換藥,遂成竹在胸,殊不知,險(xiǎn)些栽了跟頭,就在這個(gè)多時(shí)鐘源的時(shí)鐘模塊上。
本文引用地址:http://m.butianyuan.cn/article/201611/316329.htm449和149的時(shí)鐘模塊的最大區(qū)別在于449的時(shí)鐘包含了可編程FLL模塊,打開(kāi)449的頭文件,連寄存器的名字都和149完全不一樣,一切均以“FLL”開(kāi)頭。少頃,但見(jiàn)其內(nèi)容大同小異,遂把以前的寫(xiě)的149的時(shí)鐘初始化代碼中的寄存器改了名號(hào),直接用在了449上。但是馬上就出現(xiàn)了問(wèn)題:在測(cè)試IFG1中的時(shí)鐘失效標(biāo)志位OFIFG之時(shí),會(huì)不定期地出現(xiàn)OFIFG始終不復(fù)位的情況,程序就這樣在這里止步不前(OFIFG置位表示至少有一個(gè)時(shí)鐘源實(shí)效,如果置之不理,強(qiáng)行運(yùn)行下面的代碼的話(huà),CPU有可能會(huì)強(qiáng)制使用DCO作為MCLK時(shí)鐘源,這樣就會(huì)使定時(shí)操作出現(xiàn)錯(cuò)誤)。我的板子上接了32K的LFXT和8M的XT2,遂懷疑匹配負(fù)載電容有問(wèn)題,因?yàn)榈退?strong>晶體振蕩器LFXT提供了內(nèi)置的匹配電容。但是不管如何搭配內(nèi)部與外部電容,始終不得解。
這之后的某日,我借出恭之便仔細(xì)研讀了449文檔里的時(shí)鐘模塊相關(guān)內(nèi)容,發(fā)現(xiàn)OFIFG竟然是時(shí)鐘模塊控制寄存器FLL_CTL0中XT1OF、XT2OF、LFOF、DCOF這4的狀態(tài)位相或的結(jié)果,頓時(shí)靈光一現(xiàn),遂編寫(xiě)代碼將相關(guān)狀態(tài)位于幾個(gè)管腳上LED關(guān)聯(lián),察看其狀態(tài),結(jié)果令我大吃一驚:我一直認(rèn)為有重大嫌疑的LFXT和XT并沒(méi)有任何問(wèn)題,LFOF與XT2OF都會(huì)在上電后瞬間復(fù)位,而我一直覺(jué)得絕對(duì)不會(huì)有問(wèn)題的DCOF卻一直置位!
接下來(lái),我仔細(xì)查閱了文檔,原來(lái)在SCFI1中有5位設(shè)置了DCO tap數(shù)值,這個(gè)數(shù)值若這個(gè)數(shù)值設(shè)置的過(guò)高或過(guò)低都會(huì)使DCOF置位,從而使OFIFG置位,而PUC后這五位都是復(fù)位的,就是說(shuō),DCO tap值在PUC后被設(shè)置為最低值0,所以有可能會(huì)使DCOF置位。
上網(wǎng)搜了一下,其實(shí)這個(gè)DCO還是蠻強(qiáng)大的,雖說(shuō)其頻率會(huì)受到溫度與電壓的影響,通過(guò)調(diào)整也能到達(dá)相當(dāng)?shù)木?。因?yàn)槲乙呀?jīng)把LFXT和XT都備全了,這個(gè)應(yīng)用也不需要節(jié)電,所以沒(méi)有再太多的研究這個(gè)DCO到底怎么用,在程序里做了個(gè)計(jì)數(shù),把DCO tap所有的可能數(shù)值都試了一下,以保證時(shí)鐘初始化的順利。
我最后時(shí)鐘初始化代碼如下,以供和我遇到同樣問(wèn)題的朋友參考。
/******************************************************/
//初始化系統(tǒng)時(shí)鐘
void SysClkInit(void)
{
unsigned int i;
unsigned char DCOtap = 0x01;
SCFQCTL |= SCFQ_M;
FLL_CTL0 &= XCAP18PF;
_BIS_SR(OSCOFF);
FLL_CTL1 &= ~XT2OFF;
IFG1 &= ~OFIFG; // Clear oscillator fault flag
do
{
IFG1 &= ~OFIFG;
for (i = 5000; i; i--); // Delay
SCFI1 |= ((DCOtap++) & 0x0f) << 3;
} while (IFG1 & OFIFG); // Test osc fault flag
FLL_CTL1 = (SELM1 + SELS); // Select SMCLK source as XT2CLK
return;
}
/******************************************************/
這段代碼已經(jīng)經(jīng)過(guò)反復(fù)測(cè)試,再也沒(méi)有遇到時(shí)鐘初始化通不過(guò)的情況了。
評(píng)論