自己写bootloader——mini2440(二、关闭看门狗,初始化始终)

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]

猜你喜欢

转载自www.cnblogs.com/liuyuchun/p/9121682.html