1.框架
/* 1. 关看门狗 */ /* 2. 设置时钟 */ /* 3. 初始化SDRAM */ /* 4. 重定位 : 把bootloader本身的代码从flash复制到它的链接地址去 */ /* 5. 执行main */
用到的汇编:
ldr:
mov:
str:
1.关闭看门狗
寄存器:WTCON
第0位:0是Disable
/* 1. 关看门狗 */ ldr r0,=0x53000000 mov r1,#0 str r1,[r0]
2、设置时钟
FCLK为内核时钟,HCLK为总线时钟(包括USB时钟),PCLK为I/O接口时钟(如常用的SPI、I2C、UART的时钟配置都是通过PCLK时钟为基准的)。
MPLLCON的配置是用来确定FCLK频率的.
PLL的计算公式:
MPLL寄存器:
下面是推荐的PLL设置,设置为400MHZ输出
MDIV:0x5c PDIV:1 SDIV:1
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(1<<4)|(1<<0));
ldr r0,=0x4C000004 ldr r1,=S3C2440_MPLL_400MHZ str r1,[r0]
如果HDIVN不是0的话,需要加下面这些代码
/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */ mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */ orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */ mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */
当FCLK得到正确的配置后,这时就需要对HCLK、FCLK进行配置了,即进行预分频操作,该配置过程很见到,只需要对CLKDIVN简单配置一下就OK了。
寄存器:CLKDIVN
FCLK:HCLK:PCLK = 1:4:8
ldr r0,=0x4C000014 mov r1,#0x05 str r1,[r0]
:
2、时钟初始化始总的代码
/* 2. 设置时钟 */ ldr r0, =0x4c000014 // mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1 mov r1, #0x05; // FCLK:HCLK:PCLK=1:4:8 str r1, [r0] /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */ mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */ orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */ mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */ /* MPLLCON = S3C2440_MPLL_400MHZ */ ldr r0, =0x4c000004 ldr r1, =S3C2440_MPLL_400MHZ str r1, [r0]