2011年5月5日 星期四

CGU, Clock Generation Unit , 2


變更CPU clock

圖1


在前一篇,更換clock source中,跳過了 SYSTEM PLL,這個區塊.
因為這部分要講的比較多一點.



下圖是取自LPC1343的 UM,所以也提到 USB PLL區塊與SYSTEM PLL區塊.

圖2


上圖是 SYSTEM PLL 區塊圖示,
而變更 CPU Clock ,要講的就是 改變CPU的工作時脈.
需要修改的只有一個 register ,

SYSPLLCTRL
裡面分為 MSEL 以及 PSEL
圖3

如何做到控制 MSEL,PSEL ,得到想要的工作頻率.
關係式如下


FCLKOUT = M*FCLKIN = ( FCCO )/( 2*P )

圖4

有了關係式後依造上圖4 步驟可推得我們需要寫入的 MSEL , PSEL 數值.

步驟1.
首先  FCLKIN 對我們來說,由圖1 可知道, 經由前一篇 SYSPLLCLKSEL 可選擇,不是 IRC就是外部的 system oscillator .以LPCXpresso而言,兩者都為  12MHz.

假設以  case 'c' : 為例 ,
設定  SYSPLLCLKSEL 為 system oscillator (1) ,因此 FCLKIN = 12MHz
目標CPU工作頻率為 FCLKOUT = 48MHz

步驟2.
由關係式前半段

FCLKOUT = M*FLCKIN
==> 48(MHz) = M*12(MHz)
==> M =48/12 = 4

M = MSEL+1
==> MSEL = 4-1 = 3

步驟3,4.
關係式前半段決定後,那後半段作什麼用?
FCCO/( 2*P ) , FCC0又哪得來?

解答在圖5 ,需要透過 關係式後半段,求一個 P值,使得 FCCO落在限定範圍內 ( 156 to 320 MHz )
圖5

所以 FCCO ( 156~320 ) = FCLKOUT * 2 * P = 48 * 2 * P
==>   P = ( 156~320 )/ 96
==>   P = 1.625~3.3333   
==>   P = 2 or 3 ( P為1,2,4,8 )
==>   P = 2  , FCCO = 192
對照圖3, PSEL = 1

SYSPLLCLKSEL = 1 , System oscillator


LPC_SYSCON->SYSPLLCLKSEL = 1; //System oscillator
LPC_SYSCON->SYSPLLCLKUEN = 1;
LPC_SYSCON->SYSPLLCLKUEN = 0;
LPC_SYSCON->SYSPLLCLKUEN = 1;
while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));




LPC_SYSCON->SYSPLLCTRL = (PSEL<<5) | MSEL;

注意這邊控制流程,修改SYSPLLCTRL時,PLL需要先關閉,再作修改.



LPC_SYSCON->PDRUNCFG |= (1<<7); /* Power down the PLL */
LPC_SYSCON->SYSPLLCTRL = (1<<5) | 3; // 48Mhz

LPC_SYSCON->PDRUNCFG &= ~(1 << 7); /* Power-up SYSPLL */ while (!(LPC_SYSCON->SYSPLLSTAT & 0x01)); /* Wait Until PLL Locked */



MAINCLKSEL = 3 , sys_pllclkout



/* Switch MAINCLKSEL to Sys PLL clock out */
LPC_SYSCON->MAINCLKSEL = 3;
LPC_SYSCON->MAINCLKUEN = 0;
LPC_SYSCON->MAINCLKUEN = 1;
while (!(LPC_SYSCON->MAINCLKUEN & 0x01));



下圖是固定FCLKIN 為 12MHz的時候,針對幾個FCLKOUT, MSEL,PSEL可填的數值.





0 留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...