S3C2440的主时钟源来自外部晶振(XTIPLL)或外部时钟(EXTCLK)。S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL。MPLL用于CPU及其他外围器件,UPLL用于USB。
【1】MPLL, 用于产生FCLK, HCLK, PCLK三种频率, 这三种频率分别有不同的用途:
FCLK是CPU提供的时钟信号。
HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 等。
从S3C2440的DataSheet里可以看到,S3C2440最大支持400MHz的主频,但是这并不意味着一定工作在400MHz下面,可以通过设定MPLL, UPLL寄存器来设定CPU的工作频率。
PCLK是为APB总线提供的时钟信号,Advanced Peripherals Bus,主要用于低速外设,比如看门狗,UART控制器, IIS, I2C, SDI/MMC, GPIO,RTC and SPI等。
【2】UPLL,专门用于驱动USB host/Device。并且驱动USB host/Device的频率必须为48MHz。
如果要设置MPLL和UPLL,要注意它们的先后顺序,MPLL和UPLL的设定是有前后顺序的,必须先设定UPLL,然后才能设定MPLL,而且中间需要大约7个空指令(NOP)的间隔。
S3C2410 CPU默认的工作主频为12MHz,使用PLL电路可以产生更高的主频供CPU及外围器件使用。
通过MPLL会产生三个部分的时钟频率:FCLK、HCLK、PLCK。FCLK用于CPU核,HCLK用于AHB总线的设备(比如SDRAM),PCLK用于APB总线的设备(比如UART)。从时钟结构图中可以查看到使用不同时钟频率的硬件。
Figure 7-1. Clock Generator Block Diagram
![ARM9的时钟 - LazyPIg - Be Myself](http://blogimg.chinaunix.net/blog/upfile2/080201090734.jpg)
(注:这里要注意从图中看出,Uart使用的是PCLK,后面Uart实验会用到)
下面介绍MPLL的启动流程:
(注:下面内容部分直接摘录自《s3c2410完全开发流程》,Clock部分写了非常好)
S3c2410 datasheet 224页“Figure 7-4. Power-On Reset Sequence”展示了上电后MPLL启动的过程
请跟随FCLK的图像了解启动过程:
1、上电几毫秒后,晶振输出稳定,FCLK=晶振频率,nRESET信号恢复高电平后,
CPU开始执行指令。
2、我们可以在程序开头启动MPLL,在设置MPLL的几个寄存器后,需要等待一段时间(Lock Time),MPLL的输出才稳定。在这段时间(Lock Time)内,FCLK停振,CPU停止工作。Lock Time的长短由寄存器LOCKTIME设定。
3、Lock Time之后,MPLL输出正常,CPU工作在新的FCLK下。
设置S3c2410的时钟频率就是设置MPLL的几个寄存器:
1、LOCKTIME:设为0x00ffffff
前面说过,MPLL启动后需要等待一段时间(Lock Time),使得其输出稳定。位[23:12]用于UPLL,位[11:0]用于MPLL。使用确省值0x00ffffff即可。
2、CLKDIVN:用来设置FCLK:HCLK:PCLK的比例关系,默认为1:1:1
这里值设为0x03,即FCLK:HCLK:PCLK=1:2:4
CLKDIVN不同的设置及对应的时钟比例关系如下图:
3、MPLLCON:设为(0x5c << 12)|(0x04 << 4)|(0x00),即0x5c0040
对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV。有如下计算公式:
MPLL(FCLK) = (m * Fin)/(p * 2^s)
其中: m = MDIV + 8, p = PDIV + 2
Fin 即默认输入的时钟频率12MHz。MPLLCON设为0x5c0040,可以计算出FCLK=200MHz,再由CLKDIVN的设置可知:HCLK=100MHz,PCLK=50MHz。
通常我们将如上时钟初始化的过程写成clock_init函数供其他函数调用,代码如下:
void clock_init(void)
{
/*init clock*/
rLOCKTIME = 0xFFFFFF;
/*设置FCLK:HCLK:PCLK=1:2:4,这样假设处理器主频为200M,则HCLK为100M,PCLK为50M。ARM920T内核使用FCLK, 内存控制器,LCD控制器等使用HCLK,看门狗、串口等使用PCLK*/
rCLKDIVN = 0x3;
/* 设置时钟频率为202.7M*/
rMPLLCON = 0x5c0040;
}
|