S3C2440是一个SOC(System On Chip),它支持多种外设。其芯片手册第1章的BLOCK DIAGRAM
图就对所支持的外设进行了列举:markdown
能够把该图分为上中下三部分:异步
在参考手册的特性里介绍了这3个时钟的最高工做频率:性能
Fclk最高400MHz
Hclk最高136MHz
Pclk最高68MHzspa
而这3种频率的时钟是如何获得的呢?咱们能够找到芯片手册第7章的Clock Generator Block Diagram
图:3d
该图可简化为下图:code
其中PLL表示锁相环,DIVN表示分频器。orm
MPLL输出频率为FCLK,它会直接供给CPU;同时经过HDIV分频器获得HCLK,供给AHB总线;经过PDIV分频器获得PCLK,供给APB总线。ip
AHB总线将时钟分发给Nand控制器、内存控制器,中断控制器。
APB总线将时钟分发给I2C、I2S等慢速设备。内存
这时,咱们能够清楚的知道:it
S3C2440时钟源能够采用OSC(晶振),也能够采用EXTCLK(外接时钟源),由OM[3:2]决定。
当设备上电时,时钟源经过OM[3:2]两个pin脚来决定,可选值以下:
咱们查看JZ2440的电路图,发现OM[3:2]两个引脚直接接地,代表主时钟源和USB时钟源都是来自晶振。
JZ2440电路图,也明确显示了板载晶振为12M。
至此,咱们已肯定输入时钟为12MHZ,后续只须要设置P[5:0]、M[7:0]、S[1:0]寄存器,决定MPLL/UPLL的输出频率。
开机复位时序图,流程以下:
经过设置MDIV=92
,PDIV=1
,SDIV=1
,使得MPLL输出400MHz。而后经过配置CLKDIVN
寄存器,使FCLK=400MHz
,HCLK=100MHz
,PLCK=50MHz
。
start.S
.text
.global _start
_start:
/* 关闭看门狗 */
ldr r0, =0x53000000
mov r1, #0x0
str r1, [r0]
// LOCKTIME(0x4C000000) = 0xFFFFFFFF
ldr r0, =0x4C000000
ldr r1, =0xFFFFFFFF
str r1, [r0]
// 设置CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8
// 让FCLK : HCLK : PCLK = 400m : 100m : 50m
ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0]
/* 设置CPU工做于异步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
/* 设置FCLK工做在400M
* MPLLCON(0x4C000004) = (92<<12)|(1<<4)|(1<<0)
* 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]
/* 一旦设置PLL, 就会锁定lock time直到PLL输出稳定
* 而后CPU工做于新的频率FCLK
*/
ldr sp, =0x40000000+4096 /* NOR启动 */
/*调用main*/
bl main
halt:
b halt
复制代码