kinetis时钟模块MCG详解
MCG模塊詳解
一、MCG模塊簡介
? ? ? ? ?MCG成為多用途時(shí)鐘信號發(fā)生器,該模塊為MCU和芯片內(nèi)部各個(gè)模塊提供時(shí)鐘信號。MCG模塊通過對輸入的參考時(shí)鐘進(jìn)行分頻和倍頻處理,可以輸出各種頻率的時(shí)鐘信號,并達(dá)到超頻運(yùn)行的目的。輸入的參考時(shí)鐘可以來自內(nèi)部也可以來自外部時(shí)鐘或外部晶振。輸入的參考時(shí)鐘一般經(jīng)過分頻后進(jìn)入FLL(鎖頻環(huán))或PLL(鎖相環(huán))進(jìn)行倍頻處理,當(dāng)然也可以不通過FLL或PLL,而直接輸出給各個(gè)模塊。一般情況下,我們會選擇外部晶振的參考時(shí)鐘,分頻后由PLL倍頻的方法來達(dá)到超頻運(yùn)行的目的。
? ? ? ? ?MCG模塊框圖如圖1.1所示。
圖1.1 MCG模塊框圖
? ? ? ? MCG的核心是一個(gè)FLL(鎖頻環(huán))和一個(gè)PLL(鎖相環(huán))。FLL和PLL都可以對輸入的參考時(shí)鐘倍頻并鎖定后輸出,輸出的時(shí)鐘在SIM模塊的控制下提供給CPU和各個(gè)模塊。鎖頻環(huán)FLL的核心是一個(gè)DCO(數(shù)字控制振蕩器),鎖相環(huán)PLL的核心是一個(gè)VCO(電壓控制振蕩器)。如圖1.2所示。
? ? ? ? 注意:MCG模塊可輸出多個(gè)時(shí)鐘,比如MCGFFCLK、MCGPLLCLK、MCGOUTCLK等,詳見圖1.1。這些時(shí)鐘可以為其它模塊提供更多的時(shí)鐘選擇。在這些時(shí)鐘中,最主要的是MCGOUTCLK。這個(gè)時(shí)鐘是核心時(shí)鐘、總線時(shí)鐘、FLASH時(shí)鐘的時(shí)鐘來源。我們要實(shí)現(xiàn)PLL超頻最終得到的也是MCGOUTCLK。
圖1.2 MCG模塊
? ? ? ? 不同的參考時(shí)鐘,以及不同的對參考時(shí)鐘的處理方式的組合,使得MCG模塊有9種不同的工作模式。9種模式及相互之間的轉(zhuǎn)換如圖1.3所示。
圖1.3 MCG模塊的工作模式及相互轉(zhuǎn)換
? ? ? ? 這9種模式我們未必都用到,一般情況下,我們都會使用PEE模式,PEE模式是選擇外部晶振經(jīng)過PLL倍頻后輸出時(shí)鐘,可以達(dá)到較高的時(shí)鐘頻率。而上電復(fù)位后,MCG工作在FEI模式下。我們必須通過設(shè)置相關(guān)的寄存器,實(shí)現(xiàn)FEI到FBE的轉(zhuǎn)換,再由FBE轉(zhuǎn)換到PBE,最后再轉(zhuǎn)換到PEE。下面我們就介紹一下我們用到的幾種模式及在轉(zhuǎn)換過程中用到的寄存器。
二、相關(guān)寄存器
1. MCG控制寄存器1(MCG_C1)
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Read | CLKS | FRDIV | IREFS | IRCLKEN | IREFSTEN | |||
| Write | ||||||||
| Reset | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
圖1.4 MCG_C1寄存器
CLKS:時(shí)鐘源選擇。該位用于選擇MCG的輸出時(shí)鐘MCGOUTCLK從何而來。在MCG的模式轉(zhuǎn)換過程中,每一步都牽涉到CLKS的設(shè)置。注意,每次改變CLKS,輸出的時(shí)鐘并不是馬上發(fā)生變化,而是有一個(gè)過程,必需查詢相關(guān)的標(biāo)志位以確保轉(zhuǎn)換完成才能進(jìn)行下一步設(shè)置,需查詢的相關(guān)標(biāo)志位在MCG_S寄存器中,有關(guān)該寄存器的內(nèi)容稍后介紹。
圖1.5 CLKS選擇輸出時(shí)鐘
CLKS選擇時(shí)鐘如表1.1所示
| CLKS | 描述 |
| 00 | 選擇PLL或FLL輸出 |
| 01 | 選擇內(nèi)部參考時(shí)鐘 |
| 10 | 選擇外部參考時(shí)鐘 |
| 11 | 保留,缺省為00 |
表1.1CLKS選擇輸出時(shí)鐘
FRDIV:鎖頻環(huán)FLL外部參考分頻。當(dāng)FLL的輸入?yún)⒖紩r(shí)鐘來自外部晶振時(shí),可通過設(shè)置FRDIV對這個(gè)來自晶振的參考時(shí)鐘分頻。分頻后的時(shí)鐘可以提供給FLL再倍頻,并且這個(gè)時(shí)鐘也可以提供給MCGFFCLK輸出。對于有些模塊,比如FTM,MCGFFCLK也是可供選擇的一個(gè)時(shí)鐘選項(xiàng)。FRDIV的分頻系數(shù)和外部晶振的頻率范圍有關(guān),頻率范圍在MCG_C2寄存器中的RANGE設(shè)置。
RANGE=0,分頻比=2^FRDIV(FRDIV<=7),如果外部晶振RANGE!=0,則分頻比=2^(FRDIV+5)。
注意:分頻后提供給FLL倍頻的參考時(shí)鐘不得超過32K。
IREFS:FLL參考時(shí)鐘源選擇。FLL對輸入的參考時(shí)鐘倍頻,而這個(gè)參考時(shí)鐘可以來自芯片自帶的內(nèi)部慢速參考時(shí)鐘,速率為32k,也可以來自外部晶振經(jīng)由FRDIV設(shè)置的分頻比分頻后的時(shí)鐘。選擇哪一個(gè)輸入到FLL由IREFS設(shè)置。
IREFS=0:選擇外部時(shí)鐘;
IREFS=1: 選擇內(nèi)部慢速參考時(shí)鐘源。
注意,上電復(fù)位時(shí),IREFS默認(rèn)為1,即FLL對32K內(nèi)部慢速時(shí)鐘倍頻后輸出。
IRCLKEN、IREFSTEN:前面提到,MCG模塊有多個(gè)時(shí)鐘輸出,其中一個(gè)就是MCGIRCLK,這個(gè)時(shí)鐘來自于芯片內(nèi)部自帶的參考時(shí)鐘,這個(gè)時(shí)鐘也可以提供給某些模塊作為時(shí)鐘選項(xiàng)。IRCLKEN和IREFSTEN就是和這個(gè)時(shí)鐘有關(guān)。如圖1.6所示。如需要這個(gè)時(shí)鐘,可設(shè)置IRCLKEN=1,如希望在停止模式下,該時(shí)鐘也可以使用,則可設(shè)置IREFSTEN=1。在超頻過程中,這兩位可暫時(shí)忽略。
圖1.6 MCGIRCLK輸出設(shè)置
2. MCG控制寄存器2(MCG_C2)
圖1.7 MCG_C2寄存器
RANGE:晶振頻率范圍選擇,用于為使用的外部晶振選擇頻率范圍,具體如表1.2所示
| RANGE | 描述 |
| 00 | 為晶振選擇低頻范圍1K~32K |
| 01 | 為晶振選擇高頻范3M~8M |
| 1X | 為晶振選擇甚高頻范圍8M~32M |
表1.2 RANGE選擇
注意:一般情況下,如果使用32K晶振,則可選擇RANGE=00,如晶振頻率為3~32MHz,則可選擇RANGE=01,如果使用更高頻率的晶振,則可選擇RANGE=1X。
HGO:高增益振蕩器選擇
HGO=0:設(shè)置晶振為低功耗操作;
HGO=1:設(shè)置晶振為高增益操作。
EREFS:外部參考選擇。來自外部的時(shí)鐘信號可以是外部直接輸入的時(shí)鐘脈沖,或來自晶體振蕩器,可通過EREFS選擇。
EREFS=0:外部參考時(shí)鐘;
EREFS=1:外部振蕩器。
注意:一般情況下,我們使用都是外部晶振,該位置1即可。
LP:低功耗選擇,用于選擇在bypass等模式下,FLL和PLL是否工作,主要出于省電考慮,超頻過程中,該位可暫不考慮,默認(rèn)即可。
IRCS:內(nèi)部參考時(shí)鐘選擇。如果我們選擇把芯片自帶的內(nèi)部時(shí)鐘作為MCGOUTCLK輸出,即設(shè)置MCG_C1寄存器中的CLKS=01,則有兩個(gè)選擇,一個(gè)是32K的慢速時(shí)鐘,一個(gè)是2M的快速時(shí)鐘,由IRCS選擇。在PLL超頻過程中,該位可忽略。
IRCS=0:選擇慢速內(nèi)部參考時(shí)鐘;
IRCS=1:選擇快速內(nèi)部參考時(shí)鐘。
3. ?MCG控制寄存器5(MCG_C5)
圖1.8 MCG_C5寄存器
PLLCLKEN:PLL時(shí)鐘使能。MCGPLLCLK也是MCG模塊輸出的一個(gè)時(shí)鐘選項(xiàng)。如果要使能這個(gè)時(shí)鐘輸出,則設(shè)置PLLCKEN=1即可。PLLCLKEN和我們要超頻輸出的MCGOUTCLK無關(guān),在PLL超頻過程中可忽略。如果使用MCGPLLCLK的話,需要注意,置位PLLCLKEN之前,PRDIV需要設(shè)置合適的分頻系數(shù)以產(chǎn)生2~4M的PLL參考時(shí)鐘,置位PLLCLKEN將使能外部振蕩器。每次置位PLLCLKEN使能PLL時(shí)鐘,并且外部振蕩器作為參考時(shí)鐘,都需要檢查OSCINIT位。
PLLSTEN:設(shè)置stop模式下,PLL是否使能。PLL超頻過程中,該位可忽略。
PRDIV:PLL外部參考時(shí)鐘分頻。我們選擇外部晶振作為參考時(shí)鐘輸入到PLL時(shí),需要先分頻到2~4MHz的范圍內(nèi)才可以由PLL倍頻后輸出。PRDIV就是設(shè)置對外部時(shí)鐘的分頻系數(shù)。
分頻系數(shù)=PRDIV+1,注意PRDIV<=24。
注意:通過設(shè)置PRDIV,結(jié)果頻率應(yīng)在2M~4M范圍內(nèi),當(dāng)PLL使能,即將PLLCLKEN置1后,在鎖相環(huán)PLL未鎖定頻率之前,不可改變PRDIV的值。
4. MCG控制寄存器6(MCG_C6)
圖1.9 MCG_C6寄存器
LOLIE:當(dāng)時(shí)鐘失去鎖定時(shí),是否發(fā)生中斷請求。
LOLIE=0:禁止中斷請求;
LOLIE=1:允許中斷請求。
PLLS:PLL選擇,選擇PLL還是FLL作為MCG的時(shí)鐘源。當(dāng)CLKS[1:0]=00時(shí),我們可以選擇MCGOUTCLK來自PLL或者FLL。到底是PLL還是FLL則由PLLS指定。
PLLS=0:選擇FLL;??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
PLLS=1:選擇PLL,設(shè)置PLLS之前,需要設(shè)置合適的PRDIV以產(chǎn)生2~4M的參考時(shí)鐘。
CME:時(shí)鐘監(jiān)控使能,設(shè)置當(dāng)失去外部時(shí)鐘時(shí),是否產(chǎn)生中斷。
VDIV:PLL壓控振蕩器倍頻系數(shù),VDIV決定參考時(shí)鐘的倍數(shù)。當(dāng)我們最終選擇PLL倍頻后輸出到MCGOUTCLK時(shí),需要設(shè)置VDIV得到我們需要的時(shí)鐘頻率。
倍數(shù)=VDIV+24,且VDIV<=31。
注意:PLL最大55倍頻,參考時(shí)鐘最大4MHz,也就是PLL超頻最高到220MHz。
5. MCG狀態(tài)寄存器(MCG_S)
這個(gè)寄存器中包含反映MCG狀態(tài)的標(biāo)志位,供程序查詢。在MCG的模式轉(zhuǎn)換過程中,我們必須查詢該寄存器中的某些標(biāo)志位以確保轉(zhuǎn)換完成。
1.10 MCG_S寄存器
LOLS:該位反映鎖相環(huán)的鎖定狀態(tài),失鎖時(shí)置????????? 1,寫1清除,該位置1時(shí),由MCG_CR6中的LOLIE決定是否產(chǎn)生中斷。
LOCK:該位置1表示鎖相環(huán)已經(jīng)鎖定。在鎖定過程中,MGC的PLL時(shí)鐘被禁止輸出,直到LOCK置位。LOCK置位后,任何改變PRDIV或VDIV的操作都會清除LOCK位直到再次鎖定頻率。
PLLST:該位指示,PLLS的時(shí)鐘源是來自FLL時(shí)鐘還是PLL時(shí)鐘。當(dāng)我們改變PLLS在PLL和FLL時(shí)鐘之間切換時(shí),時(shí)鐘輸出的變化需要查詢該位以確保切換完成。
PLLST=0:FLL時(shí)鐘;
PLLST=1:PLL時(shí)鐘。
IREFST:FLL內(nèi)部參考時(shí)鐘狀態(tài)。當(dāng)我們改變IREF,對FLL的參考時(shí)鐘的來源切換時(shí),需要查詢該位以確保切換完成才可進(jìn)行下一步。
IREFST=0:FLL參考時(shí)鐘來自外部;
IREFST=1:FLL參考時(shí)鐘來自內(nèi)部。
CLKST:指示當(dāng)前的時(shí)鐘模式。當(dāng)我們改變CLKS,改變MCGOUTCLK的時(shí)鐘來源時(shí),需要查詢該位以確保切換完成才可進(jìn)行下一步。
CLKST=00:選擇FLL輸出;
CLKST=01:選擇內(nèi)部參考時(shí)鐘;
CLKST=10:選擇外部參考時(shí)鐘;
CLKST=11:選擇PLL輸出。
OSCINT:晶振初始化狀態(tài),該位置1表示晶振完成初始化。
IRCST:內(nèi)部參考時(shí)鐘狀態(tài)。如改變IRCS,則須查詢該位,該位和PLL超頻無關(guān)。
IRCST=0:選擇慢速內(nèi)部時(shí)鐘,32K;
IRCST=1:選擇快速內(nèi)部時(shí)鐘,2M。
MCG模塊和PLL超頻有關(guān)的寄存器都已經(jīng)列出來,還有些寄存器和PLL超頻無關(guān),不做詳細(xì)介紹,如想進(jìn)一步了解可參考數(shù)據(jù)手冊,K10P100M100SF2RM.pdf第24章。
模式轉(zhuǎn)換
如圖1.3所示,我們必須通過設(shè)置相關(guān)的寄存器,實(shí)現(xiàn)FEI到FBE的轉(zhuǎn)換,再由FBE轉(zhuǎn)換到PBE,最后再轉(zhuǎn)換到PEE。
1. FEI轉(zhuǎn)換到FBE
FEI模式下,時(shí)鐘的產(chǎn)生如圖1.11所示。FEI是系統(tǒng)復(fù)位后MCG默認(rèn)的工作模式,輸出的時(shí)鐘MCGOUTCLK來自FLL。FLL的參考時(shí)鐘來自內(nèi)部32K慢速時(shí)鐘,FLL倍頻后大約20MHz。
圖1.11 FEI模式下時(shí)鐘產(chǎn)生流程
? ? ? ? FBE模式下,時(shí)鐘的產(chǎn)生如圖1.12所示。在FBE模式下,MCGOUTCLK來自外部參考時(shí)鐘,此時(shí),FLL仍正常工作,但是FLL的參考時(shí)鐘輸入從內(nèi)部慢速時(shí)鐘切換到外部時(shí)鐘。此時(shí)FLL產(chǎn)生的時(shí)鐘并不輸出。
圖1.12 FBE模式下時(shí)鐘產(chǎn)生流程
? ? ? ? 從FEI到FBE的轉(zhuǎn)換,主要改變的是MCGOUTCLK的來源從FLL切換到外部晶振,即MCG_C1寄存器的CLKS從00切換到10。同時(shí)FLL的參考時(shí)鐘也從內(nèi)部32K慢速時(shí)鐘切換到晶振分頻后的時(shí)鐘,即MCG_C2寄存器中RANGE、HGO和EREFS都需要設(shè)置,而且MCG_C1寄存器中的FRDIV也需要合理設(shè)置以保證外部晶振分頻后得到不大于32KHz的參考時(shí)鐘提供給FLL。
? ? ? ? 以4MHz外部晶振為例,首先設(shè)置MCG_C2寄存器,代碼如下:
MCG_C2 = MCG_C2_RANGE(1) | MCG_C2_HGO_MASK | MCG_C2_EREFS_MASK;? ? ? ? 使用4MHz晶振,RANGE設(shè)置為1;HGO置1,選擇高增益;EREFS置1,選擇外部晶振。在這段代碼中,大量采用系統(tǒng)自帶的宏定義,具體和查詢頭文件MK10X256VMD100.h。使用系統(tǒng)自帶的宏定義可防止自己計(jì)算二進(jìn)制出錯(cuò),當(dāng)然,也可以不使用,宏定義,而直接定義:
MCG_C2=0X1C;? ? ? ?接下來設(shè)置,MCG_C1寄存器,代碼如下:
MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);? ? ? ? CLKS設(shè)為10,選擇外部參考時(shí)鐘輸出到MCGOUTCLK;FRDIV置為3,對4MHz晶振256分頻。注意分頻后的時(shí)鐘只需要小于32KHz即可,由于FBE只是過渡狀態(tài),所以不必詳細(xì)計(jì)算。同樣,上面的代碼我們也使用了系統(tǒng)自帶的宏定義。
? ? ? ? 當(dāng)設(shè)置完畢后,需查詢MCG_S中的幾個(gè)狀態(tài)位以確保狀態(tài)切換完成,才能進(jìn)行后面的操作,查詢狀態(tài)位的代碼如下:
while (!(MCG_S & MCG_S_OSCINIT_MASK)){} //等待鎖相環(huán)初始化結(jié)束 while (MCG_S & MCG_S_IREFST_MASK){} //等待時(shí)鐘切換到外部參考時(shí)鐘 while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT)!= 0x2){} //等待MCGOUTCLK切換到外部時(shí)鐘輸出2. FBE切換到PBE
? ? ? ?PBE模式下,MCGOUTCLK輸出時(shí)鐘不變,仍然是外部晶振直接輸出,所以MCG_C1中的CLKS不必改變。也就是PBE下的時(shí)鐘產(chǎn)生和圖1.2是一樣的。但是,在這一步,我們開始啟用PLL工作,并計(jì)算好我們需要超頻的倍率。在PBE模式下,PLL雖然已正常工作,PLL的時(shí)鐘并不輸出。在這一步,我們只要設(shè)置MCG_C5和MCG_C6兩個(gè)寄存器。
MCG_C5 = MCG_C5_PRDIV(1);//分頻在2~4MHz之間,分頻后頻率2MHz MCG_C6 = MCG_C6_PLLS_MASK |MCG_C6_VDIV(26); //選擇PLL,倍頻50倍? ? ? ? 這里我們需要設(shè)置好MCGOUTCLK提供給系統(tǒng)核心、總線和FLASH的時(shí)鐘分頻,通過SIM模塊的SIM_CLKDIV1來設(shè)置,由MCGOUTCLK提供給幾個(gè)主要模塊的時(shí)鐘分頻比,分別是CORE、BUS、FLEXBUS、FLASH。注意FLASH模塊不可超過25MHz,否則出錯(cuò)。
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? ? ? ? 如按以上分頻設(shè)置,當(dāng)最終轉(zhuǎn)換到FEE模式后,則系統(tǒng)核心頻率為100MHz,BUS和FLEXBUS都為50MHz,FLASH為25MHz。
? ? ? ? 設(shè)置完畢后,需查詢標(biāo)志位以確保轉(zhuǎn)換完成。代碼如下:
while (!(MCG_S &MCG_S_PLLST_MASK)){}; // 等待切換到PLL while (!(MCG_S &MCG_S_LOCK_MASK)){}; //等待PLL鎖定頻率3. PBE切換到PEE
? ? ? ? ?在上面完成后,PLL輸出的時(shí)鐘已經(jīng)準(zhǔn)備完畢,只需要最后通過設(shè)置MCG_C1中的CLKS,把MCGOUTCLK的來源從外部晶振切換到PLL時(shí)鐘即可。代碼如下:
MCG_C1 &= ~MCG_C1_CLKS_MASK;//CLKS=00,PLL輸出 while (((MCG_S & MCG_S_CLKST_MASK)>> MCG_S_CLKST_SHIFT) != 0x3){};//等待切換完畢。總結(jié)
以上是生活随笔為你收集整理的kinetis时钟模块MCG详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rman全备时,配置项如何设置?
- 下一篇: mongodb报错 An error o