首先S3C2440内部有三个时钟 

     FCLK:主频时钟--主要做为芯片的内核时钟

     HCLK: 总线时钟--主要是作为LCD,USB,DMA时钟信号

     PCLK: 接口时钟--主要是作为串口,GPIO,SPI,ADC等接口时钟信号

 

    2440通过设置引脚OM2和OM3来选择时钟源Fin(外部晶振或外部时钟源),时钟源信号Fin通过2440芯片内部的产生FCLK和HCLK、PCLK时钟信号,这3大时钟信号像动脉一样带动整个芯片的工作。

  

这三个时钟一般成比例关系,通常设置为1:4:8,1:3:6的分频关系,也就说如果主频FLCK是400MHz,按照1:4:8的设置,那么HLCK是100MHz,PLCK是50MHz。

 

说完2440的时钟信号后,下面就是如何设置相应的寄存器来实现我们想要的频率。

2440集成有2个锁相环(MPLL&UPLL),可对输入的Fin=12MHz的晶振频率进行倍频。S3C2440使用了三个倍频因子MDIV、PDIV和SDIV来设置倍频,通过寄存器MPLLCON&UPLLCON可设置倍频因子。其中MPLLCON寄存器用于设置处理器内核时钟(主频FCLK),其输入输出频率间的关系为

 

      FCLK=MPLL=(2*m*Fin)/(p*2^s) ,其中m=(MDIV+8), p=(PDIV+2), s=SDIV。

      例如:我们想产生400m的FLCK,而晶振输入是12M,代入上面的公式,可以计算出MDIV、PDIV、SDIV的值,大概是127,2,1。一般来说手册上有个表,可以直接查找得到三个倍频因子的大小。

 

 

      UPLLCON寄存器用于产生48MHz或96MHz,提供USB时钟(UCLK),其输入输出频率间的关系为

      UCLK=UPLL=(m * Fin) / (p * 2^s) ,其中m=(MDIV+8), p=(PDIV+2), s=SDIV。

      三个倍频因子的大小同样可以通过查表得到。

      注意:当你要设置MPLLCON和UPLLCON,要先设置UPLLCON,然后再设置MPLLCON。

 

      设置好锁相环寄存器后,我们还要设置时钟分频控制器CLKDIVN,之前我们说的3大时钟的关系可以通过设置该寄存器来实现。

 

 

      在编写程序设置时钟的步骤是:

      1、设置UPLLCON寄存器(如果需要)

      2、设置MPLLCON寄存器

      3、设置时钟分频控制器CLKDIVN

      4、设置时钟控制寄存器CLKCON(如果需要),这个寄存器主要是打开和关闭外设时钟,以达到降低系统功耗的目的。

 

 

 

关于S3C2440时钟设置的理解

1)FLCK、HCLK和PCLK的关系

S3C2440有三个时钟FLCK、HCLK和PCLK

手册上说P7-8写到:

FCLK is used by ARM920T,内核时钟,主频。

HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD controller, the DMA and USB host block. 也就是总线时钟,包括USB时钟。

PCLK is used for APB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMC interface,ADC, UART, GPIO, RTC and SPI.即IO接口时钟,例如串口的时钟设置就是从PCLK来的;

那么这三个时钟是什么关系呢?

这三个时钟通常设置为1:4:8,1:3:6的分频关系,也就说如果主频FLCK是400MHz,按照1:4:8的设置,那么HLCK是100MHz,PLCK是50MHz

寄存器CLKDIVN表明并设置了这三个时钟的关系

如果CLKDIVN设置为0x5,那么比例即为1:4:8,前提是CAMDIVN[9]为0.

 

2)输入时钟FIN与主频FCLK的关系

现代的CPU基本上都使用了比主频低的多的时钟输入,在CPU内部使用锁相环进行倍频。对于S3C2440,常用的输入时钟FIN有两种:12MHz和16.9344MHz,那么CPU是如何将FIN倍频为FCLK的呢?

S3C2440使用了三个倍频因子MDIV、PDIV和SDIV来设置将FIN倍频为MPLL,也就是FCLK

MPLL=(2*m*FIN)/(p*2^s) where m=(MDIV+8), p=(PDIV+2), s=SDIV

寄存器MPLLCON就是用来设置倍频因子的

 

理论上,你可以通过设置该寄存器来实现不同的频率,然而,由于实际存在的各种约束关系,设置一个适当的频率并不容易,手册上列出了一些常用频率的表格,

 

例如,假设输入时钟FIN=16.9344M,MDIV=110, PDIV=3, SDIV=1,

利用上面的公式,FCLK=2*16.9344*(110+8)/((2+3)*2)=399.65

 

3)关于USB时钟

S3C2440有两个锁相环,一个主锁相环MPLL提供给FCLK的,另外一个UPLL是提供给USB时钟(48MHz)的,与MPLL一样,UPLL的产生也是通过UPLLCON寄存器设置分频因子得到,计算公式稍有不同:

UPLL=(m*FIN)/(p*2^s) where m=(MDIV+8), p=(PDIV+2), s=SDIV,同样,可以通过查表得到一个合适的值。

最后值得一提的是,在CLKDIVN的第三位DIVN_UPLL用来设置USB时钟UCLK和UPLL的关系,如果UPLL已经是48Mhz了,那么这一位应该设置为0,表示1:1的关系,否则是1:2的关系

 

4)最后,给出我的BCNG2440开发板的时钟设置

FIN=16.9344

MDIV:110 HDIV:3 SDIV:1,比例为1:4:8

CLKDIVN: 5

因此,FCLK=399.65MHZ  HCLK=99.91MHZ PCLK=49.95MHZ

posted on 2012-05-15 15:14  风行雪舞  阅读(1125)  评论(0编辑  收藏  举报
无觅相关文章插件,快速提升流量