最近在学习S3C2440开发板,学习了时钟系统,在此写写学习笔记首先从开发板的数据手册可以发现,S3C2440上面有两个PLL,都是以晶振作为时钟源的,其中MPLL作为CPU的时钟源,UPLL作为USB的时钟源,而MPLL时钟又分为三个部分,FCLK,HCLK, PCLK。其中FCLK作为CPU时钟源,HCLK作为AHB高速总线时钟源,PCLK为APB低速总线上的外设提供时钟。
从上面的图中可以看到,MPLL由P、M、S三个参数控制,由FCLK经过HDIVN与PDIVN分频得到HCLK与PCLK,时钟结构大概清楚之后进行编程控制,FCLK=400MHZ HCLK=100MHZ PCLK=50MHZ
首先配置寄存器来设置S3C2440的PLL
ldr r0, =0x4C000000
ldr r1, =0xFFFFFFFF //使用默认值设置即可
str r1, [r0]
一旦设置PLL, 就会锁定lock time直到PLL输出稳定
然后CPU工作于新的频率FCLK
接下来按照时钟值来设置它们之间的关系,
从上面这个寄存器中我们可以设置FCLK/HCLK=4 FCLK/PCLK=8,通过设置分频值即可
ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0]
时钟关系已经搭建好,接下来就需要设置MPLL参数值,将输入的12MHZ的时钟倍频到400M的输出频率,通过配置MPLLCON寄存器
要想得到400MHZ的输出频率就按照表中进行配置即可
* m = MDIV+8 = 92+8=100
* p = PDIV+2 = 1+2 = 3
* s = SDIV = 1
* FCLK = 2*m*Fin/(p*2^s) = 2*100*12/(3*2^1)=400M
*/
ldr r0, =0x4C000004
ldr r1, =(92<<12)|(1<<4)|(1<<0)
str r1, [r0]
最后,按照要求设置CPU为异步工作模式
/* 设置CPU工作于异步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0