2440框架图中,不仅有CPU,而且有很多外设,其中外设分为两部分,一部分是AHB总线,一部分是APB总线
cpu工作与FCLK,最大工作频率400MHZ
AHB总线工作于HCLK,最大工作频率136MHZ
APB总线工作与PCLK,最大工作频率68MHZ
从图中看出,时钟源有两个分别是外部晶振和引脚,通过OM[3:2]来选择,模式选择如下图
12MHZ晶振通过MPLL锁相环得到FLCK,CPU直接使用FCLK,FCLK通过PDIV分频得到PCLK提供给APB总线上的设备使用,
FCLK通过HDIV分频得到HCLK提供给AHB总线上使用
12MHZ晶振也会经过UPLL锁相环提供给USB使用
参考设置值如下,我们选择MDIV=92, PDIV = 1, SDIV=1即可设置FCLK = 400MHZ:
MPLLCON = (92 << 12) | (1 << 4) | (1 << 0);
首先要设置bit[2:1]为10,这时HCLK=FCLK/4=100MHZ,但是需要CAMDIVN[9]=0(默认值就是0)
设置bit[0]为1,这时PCLK=HCLK/2=50MHZ
bit[3]取默认值
.text
.global _start
_start:
/* 1.关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
/* 2.设置时钟 */
/* 2.1 设置LOCKTIME(0x4C000000)=0xFFFFFFFF */
ldr r0, =0x4C000000
ldr r1, =0xFFFFFFFF
str r1, [r0]
/* 2.2 设置CLKDIVN(0x4C000014) = 0x5 FCLK : HCLK : PCLK = 400m : 100m : 50m*/
ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0]
/* 2.3 设置CPU处于异步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 /* #R1_nF:OR:R1_iA */
mcr p15,0,r0,c1,c0,0
/* 2.4 设置MPLLCON(0x4C000004)=(92<<12) | (1 << 4) | (1 << 0)
* m = MDIV + 8 = 100
* p = PDIV + 2 = 3
* s = SDIV = 1
* Mpll = (2 * m * Fin) / (p * 2 ^ s)
* = (2 * 100 * 12) / (3 * 2 ^ 1) = 400MHZ
*/
ldr r0, =0x4C000004
ldr r1, =(92<<12) | (1 << 4) | (1 << 0)
str r1, [r0]
/* 3.设置栈
* 自动分辨NOR启动或者NAND启动
* 向0地址写入0,在读出来,如果写入则是NAND,否则是NOR
*/
ldr r0, =0
ldr r1, [r0] /* 读出原来的值备份 */
str r0, [r0] /* 向0地址写入0 */
ldr r2, [r0] /* 再次读出来 */
cmp r1, r2
ldr sp, =0x40000000 + 4096 /* nor启动 */
moveq sp, #4096 /* nand启动 */
streq r1, [r0] /* 恢复原来的值 */
bl main
halt:
b halt