s3c2440的时钟详解

s3c2440 cpu的默认工作主频有两种12MHz和16.9344MHz , 也就是我们的晶振的频率 , 但一般12MHz的晶振用的比较多 , Fin就是指我们接的晶振频率 。大家都知道s3c2440上电正常工作后频率是远远大于12MHz和16.9344MHz的 , 我们的s3c2440的cpu正常工作时的频率就是405MHz , 因此这就需要一个电路来提升频率 , 在s3c2440的datasheet中找到了这个电路 , 下面这个就是PLL电路:
由图中可以看出 , Fin进去后 , 经过PLL电路 , 最终输出两个PLL信号频率即MPLL和UPLL , 这两个又是什么呢
UPLL是专用于USB设备的 , MPLL是用于CPU及外围电路的 , 不清楚 , 还是得找s3c2440的datasheet , 下面这就是从datasheet中截取的:
图中给出了各种接口设备使用的时钟信号
UPLL是USB专用 , 这里就不讲了 , 下面重点讲下MPLL , 刚才已经说了MPLL主要用于CPU和外围设备 , 但外围设备和CPU的工作频率并不一样啊 , CPU的工作频率肯定比外设要高 , 这就必然要对MPLL进行处理 , 于是FCLK , HCLK , PCLK就登场了
【s3c2440的时钟详解】首先讲下FCLK , 首先看下datasheet中的介绍:
The Clock control logic in S3C2440A can generate the required clock signals including FCLK for CPU, HCLK for the
AHB bus peripherals, and PCLK for the APB bus peripherals.
相信搞嵌入式的都能看的懂 , FCLK是CPU用的 , HCLK是AHB总线用的 , 比如说SDRAM , PCLK是APB总线用的 , 比如说UART 。这三个我们一个个来讲解 , 首先看FCLK , CPU用的 , 看datasheet中的关于FCLK的时序图 , 我们就会看出一些东东 。
从上面的图中可以看到FCLK在CPU上电后 , 过了一段时间就发生了比较大的变化 , 明显值变大了 , 从上面这个图中我们可以大致看出s3c2440上电启动过程:
1、上电几毫秒后(power由低变高) , 晶振输出稳定 , 此时FCLK=晶振频率 , nRESET信号恢复高电平后 , CPU开始执行指令 。
2、我们可以在程序开头启动MPLL , 在设置MPLL的几个寄存器后 , 需要等待一段时间(Lock Time) , MPLL的输出才稳定 。在这段时间(Lock Time)内 , FCLK停振 , CPU停止工作 。Lock Time的长短由寄存器LOCKTIME设定 。
3、Lock Time之后 , MPLL输出正常 , CPU工作在新的FCLK下 。
现在对FCLK进行总结一下 , FCLK , 在CPU上电后 , 晶振开始正常工作 , 此时FCLK=晶振频率 , 注意此时不存在MPLL , 经过PLL电路后 , 得到MPLL , UPLL 。此时FCLK=MPLL 。
总的来说分频比为FCLK:HCLK:PCLK=1:4:8 , 这个分配标准是由谁定的呢 , 就是我们的CLKDIVN寄存器 , 看下datasheet中的介绍大家就清楚了:
S3C2440使用了三个倍频因子MDIV、PDIV和SDIV来设置倍频 , 通过寄存器MPLLCON&UPLLCON可设置倍频因子 。
MPLLCON的输入输出频率间的关系为
FCLK=MPLL=(2*m*Fin)/(p*2^s)  , 其中m=(MDIV+8), p=(PDIV+2), s=SDIV 。
UPLLCON的输入输出频率间的关系为
UCLK=UPLL=(m * Fin) / (p * 2^s)  , 其中m=(MDIV+8), p=(PDIV+2), s=SDIV 。
手工计算相对复杂些 , 我们可以根据欲得到的主频FCLK大小 , 直接通过查表来获知各倍频因子的设置参数 。

对于12MHz的晶振 , 要想经过PLL电路得到405MHz , 查表得应该设置MDIV、PDIV、SDIV分别为0x7f、2、1 。
那在哪里设置MDIV、PDIV和SDIV这3个值呢 , 还是datasheet:
从上图可以看出 , 我们只需要设置MPLLCON寄存器就可以确定FCLK了 , 再通过CLKDIVN寄存器我们就可以设置FCLK、HCLK、PCLK三者之间的比例了 。
关于时钟设置的还有一个寄存器 , 就是LOCKTIME , 在上面的时序图中可以看到它的身影 , datasheet中介绍:
前面说过 , MPLL启动后需要等待一段时间(Lock Time) , 使得其输出稳定 。位[31:16]用于UPLL , 位[15:0]用于MPLL 。使用确省值0x00ffffff即可 。
讲到这里 , 相信大家对s3c2440的时钟配置应该都明白了吧 。


    推荐阅读