本文從電路級(jí)的角度講解了430的三種時(shí)鐘源的來(lái)源及內(nèi)部分頻使用過程,有助于深入了解常見單片機(jī)片上系統(tǒng)時(shí)鐘的基本構(gòu)造。如果是初學(xué)者,建議不著急看這部分內(nèi)容,根據(jù)例程照寫即可,先學(xué)功能,熟練后在學(xué)原理。
本文主要內(nèi)容,來(lái)源于官方MSP430x2xx Family User’s Guide文檔Basic Clock Module章節(jié)。
MSP430的時(shí)鐘
MSP430有四種時(shí)鐘源和三種時(shí)鐘,分別介紹:
時(shí)鐘源
是不是有點(diǎn)懵,怎么這么多,其實(shí)他們各有特點(diǎn),我們一般選擇其中一種或者兩種來(lái)使用,一般不會(huì)全用到他們。這四種模式,LFXT1CLK和XT2CLK記住都是要外界晶振的,很多新手代碼配置使用這兩種時(shí)鐘但是電路不接晶振,后果就是CPU不能運(yùn)行,感覺代碼沒往下走,仿真器調(diào)試也走不動(dòng),LFXT1CLK接的是低頻晶振(你接個(gè)上MHz高頻的也可以,不超過范圍就可以),XT2CLK接的是高頻晶振,在高級(jí)一些的430上的接法一般如下:

圓柱形的就是低頻晶振,橢圓形的就是高頻的。在Launchpad上,位置在這里:

看到?jīng)],這兩個(gè)位置是重疊的,引腳也連在一起,說(shuō)明只能二選一,而且新買的板子開箱是沒有幫你焊接晶振的,所以這也是為什么很多人代碼跑不起來(lái)的原因,箱子里自帶的一個(gè)小袋子里有個(gè)很小的金黃色晶振,可以自己焊上(引腳很細(xì),不會(huì)焊接的同學(xué)考驗(yàn)?zāi)銈儎?dòng)手能力的時(shí)候來(lái)了)。

DCOCLK和VLOCLK是內(nèi)部振蕩電路產(chǎn)生的時(shí)鐘,所以不需要外接晶振。學(xué)過模擬電路的會(huì)知道RC電路可以產(chǎn)生振蕩,振蕩的頻率跟所用的電阻和電容有關(guān)。而材料的電阻和電容一般情況下會(huì)有"溫漂",溫度變化會(huì)導(dǎo)致電阻和電容變化。所以,這兩種時(shí)鐘跟前面兩種相比最大的特點(diǎn)就是不穩(wěn)定,夏天和冬天出來(lái)的頻率值可能就差很多,或者用手摸一下,把單片機(jī)摸熱,頻率就漂了。如果你需要產(chǎn)生精準(zhǔn)的定時(shí)、波形頻率或者CPU頻率,請(qǐng)使用晶振。(有些特殊場(chǎng)景下,還有恒溫晶振,也就是說(shuō)晶振也有溫漂,只不過比較小而已,工業(yè)軍工場(chǎng)景要求更嚴(yán)苛,恒溫晶振內(nèi)部有恒溫電路保持晶振溫度不變來(lái)減小這種偏差,不過430這種level的芯片一般用不上,F(xiàn)PGA用的多)。另外,VLOCLK是固定的,DCOCLK可以通過調(diào)節(jié)內(nèi)部直流電壓控制產(chǎn)生的頻率。
時(shí)鐘類型
MSP430上有三種時(shí)鐘,輔助時(shí)鐘ACLK(Auxillary Clock),系統(tǒng)主時(shí)鐘MCLK(Main Clock),子系統(tǒng)時(shí)鐘SMCLK(Sub-System Clock)。他們的來(lái)源無(wú)外乎從上面幾種時(shí)鐘源里選擇,區(qū)別主要在于用途不同,ACLK一般用于低速的外設(shè),比如低速的定時(shí)器、串口等;MCLK可以理解為主要用在CPU運(yùn)行上,當(dāng)然也可以輸送給一些高速外設(shè)使用;SMCLK則是專門給高速外設(shè)準(zhǔn)備的了,比如高速的定時(shí)器(這里不是說(shuō)有高低速兩個(gè)定時(shí)器,而是定時(shí)器工作在高速時(shí)鐘還是低速時(shí)鐘),SPI接口等。
如果這種解釋還不清晰,畫個(gè)圖就明白了:

可以看到TI限制了ACLK只能從低頻的兩個(gè)時(shí)鐘源里面選擇,MCLK和SMCLK的可以隨便選擇。實(shí)際電路中肯定不是這里直接用線連接這么簡(jiǎn)單,中間有一坨電路主要有兩個(gè)功能:1、實(shí)現(xiàn)圖中箭頭所示的選擇功能。2、分頻。具體要講就要上電路圖了,推薦看之前有了解一些基本的數(shù)字電路知識(shí)(了解下圖中那個(gè)梯形的復(fù)用器就行了,就是個(gè)選擇開關(guān))。

講電路之前,簡(jiǎn)單介紹下復(fù)用器的基本知識(shí),不然不知道下面圖里面是什么,以及寫代碼那一大堆的XXX = BIT0在干啥。截一個(gè)復(fù)用器如下:

這玩意其實(shí)就是一個(gè)開關(guān),上面有兩個(gè)輸入,這里用的寄存器SELMx表示,我們知道二進(jìn)制兩位可以表示4種情況00 01 10 11,看到?jīng)],它有四個(gè)輸入引線,一個(gè)輸出,每種數(shù)字就代表把一種數(shù)據(jù)接到輸出去,SELMx就是這個(gè)起決定作用的東西。所以,我們編程看到文檔里面對(duì)于寄存器經(jīng)常是這么介紹的:

弄個(gè)8位或者32位寄存器的表格,然后列表告訴你某種功能怎么配,初學(xué)者不用了解原理,按照表格弄就可以了。稍微深入一點(diǎn)的就會(huì)知道,這就是在折騰上面那一坨選擇開關(guān),把電路組成我們想要的功能。
時(shí)鐘產(chǎn)生
好,言歸正傳,看看四種時(shí)鐘:
選擇與分頻
信號(hào)是怎么從晶振開始形成的將完了,第二個(gè)功能就是選擇和分頻。看到三個(gè)梯形沒有,分別是LFXT1Sx、SELMx、SELS控制,這幾個(gè)就控制ACLK、MCLK、SMCLK選啥,看過上面復(fù)用器的介紹應(yīng)該就能看明白。選好后,進(jìn)入Divider分頻,這就是分頻器,可以吧比如8M的時(shí)鐘分成4M或者2M或者1M等(也可以不分頻)。分頻器的內(nèi)部實(shí)現(xiàn)是觸發(fā)器,這個(gè)學(xué)過數(shù)字電路的就知道,立個(gè)flag,后面專門開個(gè)分類講數(shù)字電路。最后在過個(gè)SCG1控制的開關(guān)就OK了,SCG0可以控制直流源不產(chǎn)生直流電壓,在不使用DCO的時(shí)候用到。(有人問用SCG1不選DCO不就搞定了,這當(dāng)然是為了低功耗呀,源頭不產(chǎn)生直流就能減小系統(tǒng)的電流消耗,430的低功耗是需要軟件設(shè)計(jì)的,不是天生硬件就低功耗,軟件隨便折騰)。
好,到這里時(shí)鐘樹就講完了。430比51的要復(fù)雜,51的內(nèi)部就是起振和12分頻電路,但是比ARM又要簡(jiǎn)單。但是這三種基本原理是一模一樣的,下面是STM32的時(shí)鐘圖,可以看懂嗎?

代碼實(shí)現(xiàn)
理解了上面的電路之后,代碼就是小意思了,找下官方G2553的code example
打開\MSP430G2xx3_Code_Examples\C\msp430g2xx3_clks.c,可以看到官方寫的一個(gè)時(shí)鐘使用例程如下:

示例程序的使用方法都會(huì)寫在注釋里,外界32kHz時(shí)鐘晶振要焊接,然后P1.0輸出ACLK,P1.4輸出SMCLK,P1.1輸出MCLK/10。C代碼如下:
#include <msp430.h>int main(void){ WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer P1DIR |= BIT0 + BIT1 + BIT4; // P1.0,1 and P1.4 outputs P1SEL |= BIT0 + BIT4; // P1.0,4 ACLK, SMCLK output while(1) { P1OUT |= BIT1; // P1.1 = 1 P1OUT &= ~BIT1; // P1.1 = 0 }}
糾正官方的錯(cuò)誤,P1.1是采用在代碼里面死循環(huán)反轉(zhuǎn)引腳電壓實(shí)現(xiàn)的,所以肯定也不是MCLK/10這個(gè)頻率,具體多少大家可以用板子自己測(cè)試一下(可能需要示波器或者頻率計(jì)或者邏輯分析儀觀察)。我手上板子沒有晶振,所以用PROTEUS簡(jiǎn)單新建了一個(gè)仿真工程如下:

用虛擬示波器觀察波形如圖:

仿真軟件的實(shí)時(shí)性是不可靠的,但是也可以簡(jiǎn)單的看到P1.4明顯不是P1.1的頻率的10倍。因?yàn)榉抡孳浖膯栴},32.768kHZ的晶振不起振,所以ACLK的那跟黃色波形看不到效果。