最近開始學習MSP430系列一款新CPU,F5529。按照之前學430的方法,我開始了解他的時鐘部分,我參照TI官方例程學習,其中有段程序讓我在實驗室困惑了很久,這句注釋如下:
ACLK=n/a, MCLK=SMCLK=BRCLK=default DCO=1.048576 MHZ
都知道 msp430的時鐘系統靈活多變,他的USC模塊有三個時鐘(MCLK,SMCLK,ACLK)和五個時鐘源(XT1CLK,VLO,REFOCLK,DCO,XT2)
PUC之后,UCS模塊的默認配置如下:
1. XTI為LF模式,作為XT1CLK的時鐘源。XT1CLK作為ACLK.
2. DCOCLKDIV作為MCLK
3. DCOCLKDIV作為SMCLK
4. FLL模塊使能,XTI作為FLL基準時鐘FLLREFCLK
5. XIN,XOUT管腳為普通I/O
6. XT2IN,XT2OUT腳為普通I/O
讓我困惑的是后半句,MCLK=SMCLK=BRCLK=defaultDCO=1.048576 MHZ
首先我不太清楚1.045M是怎么來的,后來在5/6系列的Family User’s Guide中找到了相關解釋
As previously stated,FLL operation with XT1 is selected by default. If the crystal pins (XIN, XOUT)are
shared withgeneral-purpose I/Os, XT1 will remain disabled until the PSEL bits associatedwith the crystal
pins are set. If XIN andXOUT are not shared with general-purpose I/O, XT1 is enabled. When a 32,768
Hz crystal is used forXT1CLK, the fault control logic immediately causes ACLK to be sourced by the
REFOCLK, because XT1 isnot stable immediately (see Section5.2.12). Once crystal startup is obtained
and settled, the FLL stabilizes MCLK and SMCLK to1.048576 MHz and fDCO = 2.097152 MHz.
這段英文前半段解釋了FLL和XT1上電后默認狀態。關鍵在后句,說一段晶振啟動比穩定,ACLK將取自外部的32.768KHZ晶振,FLL將使MCLK和SMCLK穩定為1.048576M和fDCO = 2.097152 MHz.
我想1.048576M應該取自這個地方,但是此處的fDCO = 2.097152 MHz.
出不多是1.048576M的兩倍,為什么說MCLK=SMCLK=BRCLK=default DCO=1.048576 MHZ,于是我將這句話粘貼去百度,結果大部分是照搬TI官方的例程,對著注釋也沒太關注。
經過自己的摸索,發現其實是這樣的;剛才在說PUC后的默認狀態是MCLK,SMCLK都是取自DCODIV的,而DCODIV從字面上看是DCO的分頻,而坐幾分頻是由UCSCTL2中的FLLD決定的,該位的默認狀態是001,即2分頻。所以應該是MCLK=SMCLK=DCODIV=DCO/2.所以說TI官網的那個注釋嚴格來說是不對的。
那DCO的默認頻率是多少呢?上面的2.097152M又是怎么來的。我覺得網友們普遍提到DCO的默認值是1.048576M的說法是不夠準確的,應該是通過使用DCO產生的MCLK和SMCLK是1.048576M,而不是DCO本身,DCO的默認值應該翻倍。這里有出現了一個要關注的東西FLL,4,5系列內有FLL,這是1,2系列所沒有的,所以即便不外接晶振,只是用內部DCO也可獲得很穩定的頻率,那FLL與DCO的產生有什么關系呢?我從5/6系列的Family User’s Guide截了一個圖(可惜不能顯示),看到DCOCLK和DCOCLKDIV從FLL模塊輸出,通過用戶手冊,我理解到DCO的產生途徑有兩種:
第一種就是直接配置UCSCTL0和UCSCTL1寄存器中的DCORSELx,DCOx,MODx來設置。其中DCORSELx負責DCO頻率范圍的選擇,DCOx負責頻率階梯的選擇,MODx負責混合兩個DCO頻率。由于1系列單片機內部沒有FLL因此DCO的頻率不太精確,從5/6系列的Family User’s Guide看到這種方式設置DCO頻率有一個很大的范圍。
第二種就是通過FLL自動調節DCO。根據手冊中公式
fDCOCLK = D × (N + 1) × (fFLLREFCLK ÷ n)
fDCOCLKDIV = (N + 1) × (fFLLREFCLK ÷n)
這里的D是FLLD,N是FLLN,他們都是UCSCTL2中的位,n由UCSCTL3中的FLLREFDIV決定,默認狀態下D取2,N去31,n 取1。
7. 那FLLREFCLK又怎么確定呢?本文上面提到 FLL模塊使能,XTI作為FLL基準時鐘FLLREFCLK
此外手冊中對REFO也作了介紹:內部參考時鐘可以在沒有外部晶振,對成本有很敏感的場合得到很好的應用,內部參考時鐘可以會產生一個很穩定的頻率,其典型值為32.768K,他也可作為FLLREFCLK,這樣外部低頻晶振和REFO可以為系統提供靈活多變的時鐘
PUC后,XT1不能作為FLLREFCLK的時鐘源,個人認為FLLREFCLK會選擇REFO。那我就來驗證下自己的是否正確。(默認D=2,N=31,n=1, FLLREFCLK=32.768K)
fDCOCLK = D × (N + 1) × (fFLLREFCLK ÷ n)
fDCOCLKDIV = (N + 1) × (fFLLREFCLK ÷n)
2*(31+1)*32768=2.097152M與用戶指南中默認一致。
|