k60 mcg模塊概述


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種不同的工作模式下的輸出時鐘的表述如下圖所示:

其中需要特別說明的是:

  1. FLL_R is the reference divider selected by the C1[FRDIV] bits, PLL_R is the reference divider selected by C5[PRDIV0] bits;
  2. 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){};//等待切換完畢。 

  參考地址:http://blog.csdn.net/hcx25909/article/details/7338432


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章