MCG模塊詳解
MCG模塊簡介
MCG(Multipurpose Clock Generator)稱爲多用途時鐘信號發生器,該模塊爲MCU和芯片內部各個模塊提供時鐘信號。MCG模塊通過對輸入的參考時鐘進行分頻和倍頻處理,可以輸出各種頻率的時鐘信號,並達到超頻運行的目的。輸入的參考時鐘可以來自內部也可以來自外部時鐘或外部晶振。輸入的參考時鐘一般經過分頻後進入FLL(鎖頻環)或PLL(鎖相環)進行倍頻處理,當然也可以不通過FLL或PLL,而直接輸出給各個模塊。FLL是受內部參考時鐘或者外部參考時鐘控制,而PLL是受外部的參考時鐘控制.一般情況下,我們會選擇外部晶振的參考時鐘,分頻後由PLL倍頻的方法來達到超頻運行的目的。
MCG模塊框圖如下:
MCG的核心是一個FLL(鎖頻環)和一個PLL(鎖相環)。FLL和PLL都可以對輸入的參考時鐘倍頻並鎖定後輸出,輸出的時鐘在SIM模塊的控制下提供給CPU和各個模塊。
MCG和相關的模塊之間的關係如下圖所示:
不同的參考時鐘,以及不同的對參考時鐘的處理方式的組合,使得MCG模塊有9種不同的工作模式。9種模式及相互之間的轉換如下圖所示。
MCG模塊在9種不同的工作模式下的輸出時鐘的表述如下圖所示:
其中需要特別說明的是:
- FLL_R is the reference divider selected by the C1[FRDIV] bits, PLL_R is the reference divider selected by C5[PRDIV0] bits;
- F is the FLL factor selected by C4[DRST_DRS] and C4[DMX32] bits, and M is the multiplier selected by C6[VDIV0] bits.
由上表和9種模式的轉換圖,我們可以確定使用50M的外部晶振,MCG輸出100M的代碼思路爲:讓MCG工作在PEE模式下,並通過寄存器設置,使PLL_R爲25,使M值爲50,則可以獲得100M的時鐘輸出.因此從復位後的FEI模式下,經過FEI->FBE->PBE->PEE的狀態跳轉,最終是MCG模塊工作在PEE模式下.
如何切換到各個模塊參見K60的用戶手冊.相關寄存器的配置參見K60的用戶手冊
模式跳轉
FEI轉換到FBE
FEI是系統復位後MCG默認的工作模式,輸出的時鐘MCGOUTCLK來自FLL。FLL的參考時鐘來自內部32K慢速時鐘,FLL倍頻後大約20MHz。在FBE模式下,MCGOUTCLK來自外部參考時鐘,此時,FLL仍正常工作,但是FLL的參考時鐘輸入從內部慢速時鐘切換到外部時鐘。此時FLL產生的時鐘並不輸出。
從FEI到FBE的轉換,主要改變的是MCGOUTCLK的來源從FLL切換到外部晶振,即MCG_C1寄存器的CLKS從00切換到10。同時FLL的參考時鐘也從內部32K慢速時鐘切換到晶振分頻後的時鐘,即MCG_C2寄存器中RANGE、HGO和EREFS都需要設置,而且MCG_C1寄存器中的FRDIV也需要合理設置以保證外部晶振分頻後得到不大於32KHz的參考時鐘提供給FLL。
以4MHz外部晶振爲例,首先設置MCG_C2寄存器,代碼如下:
MCG_C2 = MCG_C2_RANGE(1) | MCG_C2_HGO_MASK | MCG_C2_EREFS_MASK;
MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);
當設置完畢後,需查詢MCG_S中的幾個狀態位以確保狀態切換完成,才能進行後面的操作,查詢狀態位的代碼如下: while (!(MCG_S & MCG_S_OSCINIT_MASK)){} //等待鎖相環初始化結束
while (MCG_S & MCG_S_IREFST_MASK){} //等待時鐘切換到外部參考時鐘
while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT)!= 0x2){} //等待MCGOUTCLK切換到外部時鐘輸出
FBE切換到PBE
PBE模式下,MCGOUTCLK輸出時鐘不變,仍然是外部晶振直接輸出,所以MCG_C1中的CLKS不必改變。但是,在這一步,我們開始啓用PLL工作,並計算好我們需要超頻的倍率。在PBE模式下,PLL雖然已正常工作,PLL的時鐘並不輸出。在這一步,我們只要設置MCG_C5和MCG_C6兩個寄存器。 MCG_C5 = MCG_C5_PRDIV(1);//分頻在2~4MHz之間,分頻後頻率2MHz
MCG_C6 = MCG_C6_PLLS_MASK |MCG_C6_VDIV(26); //選擇PLL,倍頻50倍
這裏我們需要設置好MCGOUTCLK提供給系統核心、總線和FLASH的時鐘分頻,通過SIM模塊的SIM_CLKDIV1來設置,由MCGOUTCLK提供給幾個主要模塊的時鐘分頻比,分別是CORE、BUS、FLEXBUS、FLASH。注意FLASH模塊不可超過25MHz,否則出錯。
SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0)| SIM_CLKDIV1_OUTDIV2(1)
| SIM_CLKDIV1_OUTDIV3(1) |SIM_CLKDIV1_OUTDIV4(3);
//MCG=PLL, core = MCG, bus = MCG/3,FlexBus = MCG/3, Flash clock= MCG/8
如按以上分頻設置,當最終轉換到FEE模式後,則系統核心頻率爲100MHz,BUS和FLEXBUS都爲50MHz,FLASH爲25MHz。
設置完畢後,需查詢標誌位以確保轉換完成。代碼如下
while (!(MCG_S &MCG_S_PLLST_MASK)){}; // 等待切換到PLL
while (!(MCG_S &MCG_S_LOCK_MASK)){}; //等待PLL鎖定頻率
PBE切換到PEE
在上面完成後,PLL輸出的時鐘已經準備完畢,只需要最後通過設置MCG_C1中的CLKS,把MCGOUTCLK的來源從外部晶振切換到PLL時鐘即可。代碼如下 MCG_C1 &= ~MCG_C1_CLKS_MASK;//CLKS=00,PLL輸出
while (((MCG_S & MCG_S_CLKST_MASK)>> MCG_S_CLKST_SHIFT) != 0x3){};//等待切換完畢。