FCLK是CPU提供的時鐘信號。
HCLK是為AHB匯流排提供的時鐘信號, Advanced High-performance Bus,主要用於高速外設,比如記憶體控制器,中斷控制器,LCD控制器, DMA 等。
從S3C2440的DATASHEET里可以看到,S3C2440最大支持400MHz的主頻,但是這並不意味著一定工作在400MHz下面,可以通過設定MPLL, UPLL暫存器來設定CPU的工作頻率。
儘管在CPU上電(power-on)或者復位(reset)後,MPLL就開始進入工作狀態,但是此時MPLL的輸出(Mpll)並不作為系統的時鐘,而是直接使用外部信號EXTCLK或者外部時鐘晶振作為系統時鐘。直到軟體初始化MPLL暫存器(rMPLLCON),寫入了有效的值過後,系統才開始使用MPLL的輸出(Mpll)作為系統時鐘。雖然很多時候我們不必重新設定MPLL暫存器(rMPLLCON)新的值,但是為了使系統使用其輸出作為時鐘信號,在軟體初始化系統部分,還是要向rMPLLCON寫入一個有效的舊的值。這樣子才使系統處於正確的工作狀態。
關於MPLL的計算方法
1.U32mpll_val=0;
mpll_val=(92<<12)|(1<<4)|(1);
算得mpll_val的二進制:01011100000000010001
注意:(92<<12)中的92為十進制數,轉換為二進制為0x5C。
2.ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3);
代入1算得:ChangeMPllValue(0x5C,1,1);
3.找到ChangeMPllValue子函式
voidChangeMPllValue(intmdiv,intpdiv,intsdiv)
{
rMPLLCON=(mdiv<<12)|(pdiv<<4)|sdiv;
}
4.調用子函式,得到rMPLLCON二進制為:01011100000000010001
5.根據S3C2440A官方datasheet:
PLLCONBitDeion
MDIV[19:12]Maindividercontrol
PDIV[9:4]Pre-dividercontrol
SDIV[1;0]Postdividercontrol
以及MPLLControlRegister
Mpll=(2*m*Fin)/(p*2s)
m=(MDIV+8)p=(PDIV+2)s=SDIV
因rMPLLCON二進制為:01011100000000010001,所以
m=(MDIV+8)=([19:12]+8)=92+8=100
p=(PDIV+2)=([9:4]+2)=1+2=3
s=SDIV=[1:0]=1
Mpll=(2*m*Fin)/(p*2s)=(2*100*12)/(3*2)=400M
PCLK是為APB匯流排提供的時鐘信號,Advanced Peripherals Bus,主要用於低速外設,比如看門狗,UART控制器, IIS, I2C, SDI/MMC, GPIO,RTC and SPI等。