S3C2440-时钟计算

S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL。MPLL用于CPU及其他外围器件,UPLL用于USB。

S3C2440A 中的时钟控制逻辑可以产生必须的时钟信号,包括CPU 的FCLK,AHB 总线外设的HCLK 以及

APB 总线外设的PCLK。S3C2440A 包含两个锁相环(PLL):一个提供给FCLK、HCLK 和PCLK,另一个专用于

USB 模块(48MHz)。时钟控制逻辑可以不使用PLL来减慢时钟,并且可以由软件连接或断开各外设模块的时钟,

从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等。

源文档 <http://www.hudong.com/wiki/MPLL>

你可能感兴趣的:(计算)