變更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 留言:
張貼留言