文章目录
示例代码下载
- 由时钟树分析,时钟源通过选择器接入给
MPLL
(Main PLL)与UPLL
(USB PLL) - 经过MPLL得到
FCLK
提供给CPU[ARM920T] - FCLK分别通过HDIVN与PDIVN分频得到
HCLK
与PCLK
- HCLK接入给AHB总线,再给各种高速设备(Nand Flash、内存控制器、中断控制器…)
- PCLK接入给APB总线,再给各种低速设别(I2C、PWM、GPIO、UART…)
1.时钟源最大值
2.时钟源
2.1 两种时钟源
- 1.晶振
- 2.外部引脚时钟输入
2.2 选择时钟源
-
通过改变OM[3:2]引脚来选择时钟源
-
JZ2440 OM[3:2]接入GND,则主时钟源与USB时钟源都选择外部晶振
3.上电时钟分析
-
- 复位等待, 等待电源稳定,复位芯片才输出高电平
- 2.根据OM[3:2]的值,FCLK=晶振
- 3.PLL锁存OM[3:2]的值
- 4.设置PLL(Lock Time中 CPU停止)
- 5.PLL工作
- 6.FCLK=PLL输出新的时钟,CPU运行
4.编程控制时钟速度
-
主要通过设置
MPLLCON
与CLKDIVN
两个寄存器来控制时钟速度 -
外设时钟使能寄存器
CLKCON
,可以使得功耗更低(低功耗) -
编程目标:FCLK=400MHz、HCLK=100MHz、PCLK=50MHz
4.1 时钟计算公式
4.2 MPLLCON寄存器
- PDIV=1,SDIV=1,由公式可得MDIV=92
/* 设置MPLLCON(0x4C000004) = (92<<12) | (1<<4) | (1<<0)
* m = MDIV+8 = 92+8 =100
* p = PDIV+2 = 1+2 =3
* s = SDIV = 1
* FLCK = (2*m*Fin)/(p*(2^s)) = (2*100*12M)/(3*2^1) = 400M
*/
ldr r0, =0x4C000004
ldr r1, =(92<<12) | (1<<4) | (1<<0)
str r1,[r0]
//一旦设置PLL,就会锁定LOCK TIME直到PLL输出稳定,然后CPU工作
4.3 CLKDIVN寄存器
- 目标:FCLK=400M、FCLK=100M、PCLK=50M
- 则HDIVN设置为10(因为CAMDIVN默认值为0,所以无需关注),PDIVN设置为1
/* CLKDIVN(0x4C000014) = 0x05,fFCLK:fHCLK:fPCLK = 8:4:1 */
ldr r0, =0x4C000014
mov r1, #0x05
str r1,[r0]
5.注意事项
- 设置异步模式
- 如果HDIVN不是0,需要设置为异步模式,否则CPU会使用HCLK
- #R1_nF:OR:R1_iA = 0xC0000000
5.1 注释
- MRC指令将协处理器的寄存器中数值传送到ARM处理器的寄存器中
- MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中
- c:co-process 协处理器、r:寄存器
- 汇编版本
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
- C版本
__asm{
mrc p15, 0, r1, c1, c0, 0 /* 读取CP15 C1寄存器 */
orr r1, r1, #0xc0000000 /* 设置CPU总线模式 */
mcr p15, 0, r1, c1, c0, 0 /* 写回CP15 C1寄存器 */
}
6.S3C2440默认时钟频率
- 由芯片手册可知MPLLCON默认初始值为:
- MDIV = 0x96 = 150
- PDIV = 0x03
- SDIV = 0
即:
- m = MDIV+8 = 158
- p = PDIV+2 = 5
- s = SDIV = 0
可以推出:Fclk = (2 * m * Fin)/(p*(2^s)) = (2 * 158 * 12M)/(5 * 2^0) = 379.2M