先看S3C2440的时钟发生模块的框图
从左上开始看,可以看出时钟源有两种分别为 :晶振(通过OSC进入)、外部时钟。
通过设置OM3、OM2的引脚可以设置OM[3:2]的状态,来选择时钟源。具体如何设置如下图。
继续看框图,通过OM的时钟源进入PLL锁相环,通过设置MPLLCON里的P、M、S 的值,可以设置PLL的输出频率(MPLL)。
MPLL直接提供给FCLK, FCLK经过时钟分频控制(CLKDIVN)寄存器,通过HDIVN分频给HCLK,通过PDIVN分频给PCLK。
再看一下启动过程:
以外部时钟源为晶振为例,具体过程为:
1 上电,先复位。
2 FCLK根据OM[3:2]的值, FCLK=晶振。
3 等待晶振发出时钟稳定之后再释放nRESET,PLL锁存PLLOM[3:2]的值。
4 然后软件配置PLL,然后进入lock time,等待配置完成。此时的FCLK无输出,CPU停止。
5 配置完成,lock time 时间到,然后FCLK输出按照新配置的频率,CPU运行。
编程
目的:使FCLK=400MHz,HCLK=100MHz,PLCK=50MHz
使用时钟源为12MHz的晶振
根据前面分析可得:
1.OM[3:2]的状态设置为00,即OM3 、OM2引脚都接地。
2.然后就是设置locktime
3.MPLLCON寄存器的P、M、S
4.时钟分频控制(CLKDIVN)寄存器的HDIVN、PDIVN
用到的特殊寄存器
在数据手册中还有一点需要注意的:
所以,要配置为异步模式。
设置locktime 为默认值0xffffffff。
MPLLCON寄存器的P、M、S的设置为92、1、1。
时钟分频控制(CLKDIVN)寄存器的HDIVN、PDIVN设置为10、1.
只在汇编的起始文件start.S中设置时钟就可以了
代码如下:
.text
.global _start
_start:
/* 关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
/* 设置locktime(0x4C000000)为0xffffffff */
ldr r0, =0x4C000000
ldr r1, =0xffffffff
str r1, [r0]
/* 设置CLKDIVN(0x4C000014)为0x5 */
ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0]
/* 设置异步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
/* 设置PLLCON(0x4C000004)的M、P、S */
ldr r0, =0x4C000004
ldr r1, =(92<<12)|(1<<4)|(1<<0)
str r1, [r0]
ldr sp, =4096 /* nand 启动 */
bl main
halt:
b halt