GNU ARM汇编--(六)s3c2440的时钟控制
不再发感慨了,下面就对s3c2440的时钟做一个说明,然后给出汇编对时钟的控制代码,最后比较一下有时钟控制和没时钟控制下的流水灯的区别.
s3c2440的时钟控制逻辑可以产生3个时钟信号:用于CPU核(ARM920T)的FCLK,用于AHB总线外设(存储控制器中断控制器LCD控制器DMAUSB的主机端)的HCLK和用于APB总线外设(比如WDT IIS I2C PWM timer MMC ADC UART GPIO RTC SPI)的PCLK.s3c2440有两个锁相环,一个是用于FCLK HCLK PCLK的MPLL,一个专用与USB的UPLL.
首先看一下下面的表格:
时钟源可以来自于外部晶振(XTlpll)或者外部时钟(EXTCLK).datasheet中的图7-1显示了时钟的体系框图,这里就不给出了,截出一小部分与上图做个呼应:
这个图就反映了OM[3:2]在XTlpll和EXTCLK之间的选择.
接下来看看TQ2440的原理图是如何处理的:
从原理图可以看出:OM[3:2]为00b,意味着使用晶振来产生MPLL CLK和UPLL CLK.我们的XTIpll接的就是12M的晶振,这时候EXTCLK按照规定是要接高的,对应图如下:
值得注意的是:尽管MPLL在reset后就开始工作了,但是MPLL output只有在软件写有效的设置值到MPLLCON寄存器后才作为系统时钟的.在有效设置之前,外部晶振或者EXTCLK直接用于系统时钟.哪怕是你不想改动MPLLCON寄存器的初始值,你也得将该值写入MPLLCON.
上面的话意味着:如果不进行时钟的设置,那么我的板子就运行在晶振为12M的系统时钟下,这个和s3c2440的400M相去甚远,做流水灯的延时肯定也差数量级的,这个等会就可以看到.
Mpll = (2*m * Fin) / (p * 2^s)
m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
s3c2440支持FCLK HCLK和PCLK之间的分频比的选择.比例由CLKdivN寄存器的HdivN和PdivN决定.可参见下表:
注意:CLKdivN要小心设置,不要超出了HCLK和PCLK的限制.如果HdivN不为0,要用下面的指令,CPU总线模式从Fast Bus Mode变为异步总线模式:
MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
下面开始看看寄存器的设置:
LOCK TIME COUNT REGISTER (LOCKTIME)
这个时间是要保证PLL输出频率稳定的,时序图如下:
这个计数器的设置就是时序图中的lock time,而在寄存器说明中规定要大于300us,那么这个时候根据12M的晶振频率,计算如下:
(1/12M)*N>300us 所以N>3600 所以可以用寄存器的默认值0xffff.
PLL CONTROL REGISTER (MPLLCON & UPLLCON)
MPLL Control Register
Mpll = (2 * m * Fin) / (p * 2S)
m = (Mdiv + 8), p = (Pdiv + 2), s = Sdiv
UPLL Control Register
Upll = (m * Fin) / (p * 2S)
m = (Mdiv + 8), p = (Pdiv + 2), s = Sdiv
PLL Value Selection Guide (MPLLCON)
1. FOUT = 2 * m * Fin / (p*2^S), FVCO = 2 * m * Fin / p where: m=Mdiv+8, p=Pdiv+2, s=Sdiv
2. 600MHz <= FVCO <= 1.2GHz
3. 200MHz <= FCLKOUT <= 600MHz
4. Dont set the P or M value as zero, that is, setting the P=000000, M=00000000 can cause malfunction of
the PLL.
5. The proper range of P and M: 1 <= P <= 62, 1 <= M <= 248
注意:在设置MPLL和UPLL值的时候,要先设置UPLL,再设置MPLL.大约需要内部的7个NOP的延时操作.
在datasheet中给出了一个PLL设置的参考表格.
设置MPLL的Mdiv = 92 Pdiv = 1 Sdiv = 1
Fout = 2*(92 + 8)*12M/(1+2)/2^1 = 400M
设置UPLL的Mdiv = 56 Pdiv = 2 Sdiv = 2
Fout = (56+8)*12M/(2+2)/2^2 = 48M
CLOCK CONTROL REGISTER (CLKCON)
这个寄存器控制各个外设的时钟时能,是与电源管理相关的.
CLOCK SLOW CONTROL (CLKSLOW) REGISTER
这个寄存器也是与电源管理相关的,可以使用默认的初始值.
CLOCK divIDER CONTROL (CLKdivN) REGISTER
这个寄存器设置的是FCLK HCLK PCLK之间的比例:
ARM汇编s3c2440时钟控 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)