时钟初始化
- 首先需要选择时钟源的来源,jz2440选择的是00,使用晶振的模式
- 时钟相关的寄存器设置
3.注意事项
- CLKDIVN should be set carefully not to exceed the limit of HCLK and PCLK.
- If HDIVN is not 0, the CPU bus mode has to be changed from the fast bus mode to the asynchronous
bus mode using following instructions(S3C2440 does not support synchronous 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
If HDIVN is not 0 and the CPU bus mode is the fast bus mode, the CPU will operate by the HCLK.
This feature can be used to change the CPU frequency as a half or more without affecting the HCLK and PCLK.
上面是总的步骤,现在一个个详解
1.时钟源的选择
由OM[3:2]引脚来控制选择,参考图片"时钟电路1",可知这两个引脚接地,选择的是00.Main Clock source 和USB Clock Source都是晶振
2.寄存器设置
2.1 LOCKTIME寄存器
从上图可以看出bit'31-16是控制UCLK的lock time的,bit'15-0是控制FCLK(给cpu用的),HCLK(AHB设备用的),PCLK(APB设备用的),那这个lock time是干什么的?
从"Clock Generator Block Diagram"这个图可以看出,晶振输入的时钟(MPLLin),先要经过一个MPLL得到Mpll(应该就是FCLK),这个过程不是瞬间就完成的,需要一定的转换时间.这个就是设置这个的.
这里你可以不设置,因为上电启动默认值是0xffffffff
PS:什么是AHB,什么是APB,具体什么意思可以百度,google,以下截图是cpu手册两个总线具体有什么设备.
2.2 MPLLCON控制分频系数的
晶振的频率要进行扩充,晶振频率采用的是12Mhz,FCLK最高能到400MHZ,起码得扩大30多倍,当然手册上也是提供了计算方法的..
Mpll = (2 * m * Fin) / (p * 2S这是2的s次方)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
举一个实际例子--"时钟参考表格"图里面的
12.0000MHz 400.00 MHz 92(0x5c) 1 1以这个为
例计算频率
m = 92 + 8 = 100
p = 1 + 2 = 3
s = 1
mpll = (210012)/(3*2的一次方), = 400MHz
2.3 UPLLCON是控制usb的,裸板也没有讲要设置
2.4 CLKCON相应外设的时钟使能不使能,按需进行设置
2.5 CLKSLOW
显然MPLL应该是要turn on的
- 2.6 CLKDIVN
设置了FCLK并没有设置HCLK和PCLK啊!这个寄存器就是设置另外两个时钟的!
这里设置HCLK为FCLK的一半:
01 : HCLK = FCLK/2.
PCLK是HCLK的一半:
1: PCLK has the clock same as the HCLK/2.
- 2.7 CAMDIVN这个应该是摄像头的,不用操作
- 最后注意事项说了,如果HDIV不等于0的话,需要切换总线模式
<ARM920T_TRM1_S.pdf>
fast bus mode to the asynchronous
mrc p15,0,r0,c1,c0,0 先把c1寄存器读出来
orr r0,r0,#R1_nF:OR:R1_iA 设置nF,iA两位为1
mcr p15,0,r0,c1,c0,0 写回c1寄存器