S3C2440在默认情况下,整个系统全靠一个12MHz的外部晶振提供频率来工作运行的,也就是说CPU、内存、UART、ADC等所有需要用到时钟频率的硬件都工作在12MHz下,但是通过查阅芯片手册我们知道CPU时钟最高可为400MHZ,那么怎么设置时钟让芯片工作在更高的时钟频率下呢?首先我们来看一下S3C2440的时钟框架。
由图可知S3C2440可以通过XTIpll、XTOpll引脚外接晶振(通常为12MHZ),也可以通过EXTCLK外接时钟,我们一般选择外接晶振。我们接入的时钟才12M,而CPU时钟却可以高达400M,锁相环(PLL)就是用来倍频时钟的,2440有MPLL和UPLL这两个时钟锁相环,MPLL倍频后的时钟主要用于CPU和各种外设,而UPLL倍频后的时钟主要用于USB。我们可以通过OM[3:2]来控制这两个锁相环的时钟源,因为通常我们是外接晶振,所以把OM3和OM2这两个引脚接到GND。
MPLL倍频后的时钟为FCLK,而FCLK经过分频又得到HCLK(挂载一些高速外设)和PCLK(挂载低速外设),我们可以把MDIV、PDIV、SDIV分别配置为92(0X5C),1,1,也就是把(92<<12)|(1<<4)|(1<<0)写到0X4C000004地址得到400M的FCLK。
补充关于下图的知识,一般我们系统上电后电压不稳定,我们可通过外围电路实现把nRESET拉低一段时间后再拉高,此时系统开始工作,FCLK还只是外接的晶振的频率,OM[3:2]引脚电平锁存后,PLL开始工作,经过一段锁存时间后,FCLK变为稳定的倍频时钟用于系统工作,锁存时间可通过设置LOCKTIME来改变,默认是设置为0XFFFFFFFF,一般我们不对其进行修改。
假如我们想通过400M的FCLK得到100M的HCLK和50M的PCLK,查阅下表我们知道可以往0X4C000014写入0x5。
但是这里我们需要注意一点:如果HDIV设置为非0,CPU的总线模式要进行改变,默认情况下FCLK = HCLK,CPU工作在fast bus mode快速总线模式下,HDIV设置为非0后, FCLK与HCLK不再相等,要将CPU改为asynchronous bus mod异步总线模式,可以通过下面的嵌入汇编代码实现:
mrc p15,0,r0,c1,c0,0orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iAmcr p15,0,r0,c1,c0,0