C语言设置SDRAM的惯用方法

/* SDRAM regisers */

#define    MEM_CTL_BASE               0x48000000    // BWSCON的地址

#define    SDRAM_BASE                0x30000000     // SDRAM的起始地址

 

/* SDRAM 13个寄存器的值 */

/* 定义了一个数组,把13个寄存器的设置值存到一个数组里面 */

unsigned long  const      mem_cfg_val[]={   // 注意unsigned long  const   的含义

                            0x22111110,                //BWSCON

                                               0x00000700,              //BANKCON0

                                               0x00000700,              //BANKCON1

                                               0x00000700,              //BANKCON2

                                               0x00000700,              //BANKCON3   

                                               0x00000700,              //BANKCON4

                                               0x00000700,              //BANKCON5

                                               0x00018005,              //BANKCON6

                                               0x00018005,              //BANKCON7

                                               0x008e07a3,              //REFRESH

                                               0x000000b2,              //BANKSIZE

                                               0x00000030,              //MRSRB6

                                               0x00000030,              //MRSRB7

                                                };

 

 

/* 设置控制SDRAM13个寄存器 */

/* for循环总共13次,刚好对13个寄存器赋值完毕 */

void memsetup()

{

         int    i = 0;

         unsigned long *p = (unsigned long *)MEM_CTL_BASE;

         for(; i < 13; i++)

                   p[i] = mem_cfg_val[i];

}

 

 

ARM 汇编语言设置SDRAM的惯用方法

@******************************************************************************

@ Filehead.s

@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

@******************************************************************************      

 

.equ           MEM_CTL_BASE,                0x48000000

.equ           SDRAM_BASE,                     0x30000000

 

.text

 

.global _start

 

_start:

             bl       disable_watch_dog

             bl       memsetup

             bl       copy_steppingstone_to_sdram

             ldr      pc,    =set_sp                                @跳到SDRAM中继续执行

 

halt_loop:

             b        halt_loop

 

memsetup:

         @ initialize the static memory

         @ set memory control registers

 

         mov     r1,       #MEM_CTL_BASE

         adrl  r2, mem_cfg_val               @ adrl用于搬运地址

         mov    r3, #0x0                     @ r3清零(自己加上的一条指令)

         add     r3,       r1, #52                @ 52 == 4*13

1:     

  ldr r4,    [r2], #4

         str     r4,    [r1], #4

         cmp r1,    r3

         bne  1b                            @每次递增4个字节,共循环13次(设置13个寄存器)

 

         mov  pc,   lr

posted on 2011-10-03 12:13  深蓝工作室  阅读(707)  评论(0编辑  收藏  举报