2011-11-05 58 views
0

我用下面的程序來配置我的MSP430的時鐘(MSP430G2231)微控制器後:MSP430的時鐘問題重置

void configure_clock(void) { 
if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) { // Checks the clock constants 
     while(TRUE); // If callibration constants are erased, TRAP! 
    } 

    BCSCTL1 |= CALBC1_1MHZ; // Sets DCO range 
    DCOCTL |= CALDCO_1MHZ; // Set DCO step and modulation 

    BCSCTL1 &= ~(XTS | XT2OFF); // Disables XT2 and sets low frequency mode 
    BCSCTL3 |= (LFXT1S_0 | XCAP_3); // Selects LFXT1 crystal with 12,5pF 

    do { 
     IFG1 &= ~OFIFG; 
     __delay_cycles(1000); 
    } while (IFG1 & OFIFG); // Waits until crystal stabilizes 

    BCSCTL2 |= (SELM_2 | SELS); // Selects SMCLK and MCLK from LFXT1CLK 
} 

的問題是,在第一次運行代碼(只是單片機上電後)一切按預期工作,我得到32768 kHz時鐘。但是,如果我按下電路板上的重置按鈕(MSP430 Launchpad),時鐘似乎不能正常工作,代碼執行速度會很慢(如10次左右)。關於時鐘配置的任何想法?

謝謝!

佩爾

回答

0

唯一的東西,我可以用你的代碼提示如下。不管他們是否解決了你的問題,我不知道第一次運行是好的,但重置後它不是很奇怪。您是否在其他地方訪問時鐘配置?你打電話重置什麼代碼?

您總是使用位操作來將值包含或排除到寄存器中。你應該從一個已知的值開始,然後從那裏調整位,否則你可能會包含來自之前狀態的位。例如,而不是:

BCSCTL1 |= CALBC1_1MHZ; 
BCSCTL1 &= ~(XTS | XT2OFF); 

你可以做這樣的事情把它設置爲一個確切值:

BCSCTL1 = XT2OFF | (CALBC1_1MHZ & 0x0F); 

另一個建議是,XT2OFF是爲了關閉XT2被設置。你正在清理這個位,所以還在繼續。這與您的評論有衝突,因此可能是錯誤。

+0

謝謝,我會嘗試你的建議,並讓你知道他們是否工作... –

1

首先你可以看看電源電壓。如果在啓動過程中出現一些尖峯,那麼DCO將無法工作。在這種情況下,請儘量在將值對齊到BCSCTL1之前使用延遲。

__delay_cycles(10000); 
    BCSCTL1 = CALBC1_1MHZ; // Sets DCO range 

這將確保啓動峯值被抑制。

下一個嫌疑人會在你的目標板上解耦。我的意思是VCC上的電容器以及復位中使用的電容器。 TI建議1nF-2nF用於復位線,0.1uF用於VCC。但是,如果您使用LaunchPad作爲平臺,那麼這應該不成問題。

此外,校準值分配使用賦值運算符而不是邏輯運算符。由於其他值爲0是默認值。

BCSCTL1 = CALBC1_1MHZ;    // Set DCO 
    DCOCTL = CALDCO_1MHZ; 

如果您打算運行XT2,它不適用於G2231。它的LFXT1直接。 你不需要32.768KHz晶體的顯式初始化工作。 當你開機時它才起作用。因此不需要額外的初始化步驟。

爲了找到更好的幫助,請查看slac463a瞭解與時鐘設置相關的軟件示例。