注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

My Unix World

不要迷恋Unix,Unix只是计算世界很小的一部分!

 
 
 

日志

 
 

转载:关于S3C2440时钟设置的理解  

2010-03-06 10:56:23|  分类: develop-arm/ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://xiyong8260.blog.163.com/blog/static/665146212008924103632414/

关于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表明并设置了这三个时钟的关系

   转载:关于S3C2440时钟设置的理解 - liqi xie - My Unix World

如果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就是用来设置倍频因子的

   转载:关于S3C2440时钟设置的理解 - liqi xie - My Unix World

 

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

   转载:关于S3C2440时钟设置的理解 - liqi xie - My Unix World

 

例如,假设输入时钟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

----以下是一个值得看看的网友留言:-------------------------------------

实际CLKCON寄存器的设置也很关键,它控制着HCLK、PCLK是否送到AC97、Camera、LCD、UART0等模块,如果 对应的模块时钟使能关掉,对对应模块的寄存器不能读写,例如我们项目中曾在romInit.s中把LCDCON的初始值设置为0x0043d00,带来的 问题是以后无法写入LCD模块所对应的寄存器。

这实际也解决了一个一直困扰我的问题,由于未做过芯片,一直困惑CPU内部的特殊寄存器例 如LCDCON*、UCON*等到底放在那里?直到今天晚上同事XH帮助我悟出了这一问题的所在。以前一直认为是CPU内部开辟一块线性区域存放这些特殊 寄存器的值。但从CLKCON和以前调试FPGA的体会来看,这些寄存器放置在对应的功能块中,通过地址中的高位部分译码来选中模块,再对地位译码选中模 块中的寄存器。

调试过FPGA的都会有体会,FPGA一般在时钟的上升沿或下降沿工作,完成逻辑处理,每个功能块占据芯片版图的一部分。 同样对于ARM芯片如S3C2440也是一样,ARM920T核占芯片的一部分面积,各功能块如USB、LCD等也分别占用部分面积,各模块对应的寄存器 实际就是以晶体管的形式存在于自身模块所占的芯片面积内部。

------------------------------------------------------------------------------

转自:http://xiyong8260.blog.163.com/blog/static/665146212008924103632414/

文章后面还有一些很好的留言。

  评论这张
 
阅读(248)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017