2440是system on chip(SOC),芯片上除了CPU还会有其他外设:
- 现在介绍他的时钟:
下面是他的是时钟发生器的框图:
时钟控制逻辑给整个芯片提供三种时钟
FCLK: 用于cpu核
HCLK: 用于AHB总线上的设备,比如cpu核,存储控制器,中断控制器,lcd控制器,dma和usb主机模块等
PCLK: 用于APB总线上的设备,比如iic,pwm定时器,gpio,adc,uart,spi等
俩个总线:
AHB: 主要用于高性能模块,cpu,dma,dsp之间的连接
APB: 主要用于低宽带的周边外设的连接,例如uart,iic等
时钟产生图:
上图是上面三个时钟产生的示意图,主要是有外部晶振产生12MHz的频率(晶振频率很低,主要是为零降低电磁干扰,降低板间布线的要求),经过OM寄存器其作为时钟源,经过PLL(锁相环)倍频产生FCLK,HCLK,PCLK,然后通过分配器传给各个设备。
PLL有俩种,UPLL主要用于USB设备 MPLL用于设置FCLK,HCLK,PCLK设置方法相似
FCLK时钟启动时序如下:
上电时,PLL没被启动,FCLK即等于外部输入的时钟,称为Fin,若要提高系统时钟,则需要软件启动PLL
寄存器设置
现在通过设置寄存器使FCLK=400MHZ HCLK=100MHZ PCLK=50MHZ
- LOCKTIME主要设置locktime的时间长短,这里可以按照芯片手册的默认值来给
- CLKDIVN
控制几个频率的比例
HCLK=FCLK/4, àCLKDIVN[2:1]=10; CAMDIVN[9]默认为0
由于HDIVN非0;CPU总线模式由 fast bus mode 变为 异步模式,这里按照芯片手册提供的程序即可
PCLK=HCLK/2, àCLKDIVN[0] = 1
- MPLLCON
设置锁相环
设置寄存器MPLLCON
芯片手册里列举的几个常见的PLL设置
我们的输入的晶振为12MHZ,FCLK输出为400MHZ
于是MPLLCON = (92<<12)|(1<<4)|(1<<0);
当然也可以根据提供的计算算式算出FCLK
Fin = 12Mhz; m = 92+8=100; p = 1+2=3; s = 1;à输出400Mhz
具体程序如下:
.text
.global _start
_start:
/* 关闭看门狗-WTCON-bit[5]=0 */
ldr r0, =0x53000000
ldr r1, =0
str r1,[r0]
/* 设置MPLL
* 设置锁定时间
* LOCKTIME(0X4C000000)-0XFFFFFFFF
*/
ldr r0, =0x4c000000
ldr r1, =0xffffffff
str r1, [r0]
/* 设置分频比
* CLKDIVN(0X4C000014)-0X5,
* tFCLK:tHCLK:tPCLK = 1:4:8,
*/
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
/* 设置MPLLCON(0x4c000004)-(92<<12)|(1<<4)|(1<<0)
* MPLL = (2*m*Fin)/(p*2^s),
* m = (MDIV+8); p = (PDIV+2); s = SDIV,Fin = 12M
* m = 100, p = 3, s = 1
*/
ldr r0, =0x4c000004
ldr r1, =(92<<12)|(1<<4)|(1<<0)
str r1, [r0]
/* 一旦设置PLL,就锁定locktime,直到pll输出稳定,然后cpu工作于新的fclk频率 */
/* 设置内存:sp栈 */
/* 分辨是nor/nand启动
* 写0到0地址,再读出来
* 如果得到0,表示0地址上的内容被修改了,它对应sdram,这就是nand启动
* 否则就是nor启动;nor启动时,0地址在norflash中,0地址数据这样是改不了的
*/
mov r1, #0
ldr r0,[r1] /* 先用r1保存原来0地址上的数据 */
str r1, [r1]/* 将0写到0地址中 */
ldr r2, [r1]/* 然后将0地址上的数据保存到r2中 */
cmp r1, r2 /* 若相等则修改成功,则是nand启动 */
ldr sp, =0x40000000+4096
moveq sp, #4096 /* 若上面cmp相等则执行下面后面带eq的语句 */
streq r0,[r1] /* eq--相等 */
bl main
halt:
b halt