主题 : mini2440的SDRAM初始化问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 54264
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2011-08-27
最后登录: 2012-08-30
楼主  发表于: 2011-08-27 13:29

 mini2440的SDRAM初始化问题

大家好,我按照韦东山的书上的代码初始化SDRAM的代码编译后,先从nor flash启动,然后用supervivi的d命令下载程序到0x30000000地址运行,但是从运行结果看好像都没进入到main函数,马上又回到了supervivi的主菜单。下边是我的程序,请大家帮忙看看:
@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@*************************************************************************      

.equ        MEM_CTL_BASE,       0x48000000
.equ        SDRAM_BASE,         0x30000000

.text
.global _start
_start:
    bl  disable_watch_dog               @ 关闭WATCHDOG,否则CPU会不断重启
    bl  memsetup                        @ 设置存储控制器
    bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中
    ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行
on_sdram:
    ldr sp, =0x34000000                 @ 设置堆栈
    bl  main
halt_loop:
    b   halt_loop

disable_watch_dog:
    @ 往WATCHDOG寄存器写0即可
    mov r1,     #0x53000000
    mov r2,     #0x0
    str r2,     [r1]
    mov pc,     lr      @ 返回

copy_steppingstone_to_sdram:
    @ 将Steppingstone的4K数据全部复制到SDRAM中去
    @ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
    
    mov r1, #0
    ldr r2, =SDRAM_BASE
    mov r3, #4*1024
1:  
    ldr r4, [r1],#4     @ 从Steppingstone读取4字节的数据,并让源地址加4
    str r4, [r2],#4     @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
    cmp r1, r3          @ 判断是否完成:源地址等于Steppingstone的未地址?
    bne 1b              @ 若没有复制完,继续
    mov pc,     lr      @ 返回

memsetup:
    @ 设置存储控制器以便使用SDRAM等外设

    mov r1,     #MEM_CTL_BASE       @ 存储控制器的13个寄存器的开始地址
    adrl    r2, mem_cfg_val         @ 这13个值的起始存储地址
    add r3,     r1, #52             @ 13*4 = 54
1:  
    ldr r4,     [r2], #4            @ 读取设置值,并让r2加4
    str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4
    cmp r1,     r3                  @ 判断是否设置完所有13个寄存器
    bne 1b                          @ 若没有写成,继续
    mov pc,     lr                  @ 返回


.align 4
mem_cfg_val:
    @ 存储控制器13个寄存器的设置值
    .long   0x22011110      @ BWSCON
    .long   0x00000700      @ BANKCON0
    .long   0x00000700      @ BANKCON1
    .long   0x00000700      @ BANKCON2
    .long   0x00000700      @ BANKCON3  
    .long   0x00000700      @ BANKCON4
    .long   0x00000700      @ BANKCON5
    .long   0x00018005      @ BANKCON6
    .long   0x00018005      @ BANKCON7
    .long   0x008C07A3      @ REFRESH
    .long   0x000000B1      @ BANKSIZE
    .long   0x00000030      @ MRSRB6
    .long   0x00000030      @ MRSRB7

//led.c 让LED按计数方式点亮
#define    GPBCON        (*(volatile unsigned long *)0x56000010)
#define    GPBDAT        (*(volatile unsigned long *)0x56000014)

#define    GPB5_out    (1<<(5*2))
#define    GPB6_out    (1<<(6*2))
#define    GPB7_out    (1<<(7*2))
#define    GPB8_out    (1<<(8*2))

void  wait(unsigned long dly)
{
    for(; dly > 0; dly--);
}

int main(void)
{
    unsigned long i = 0;
    
    GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out;        // 将LED1-4对应的GPB5/6/7/8四个引脚设为输出

    while(1){
        wait(30000);
        GPBDAT = (~(i<<5));         // 根据i的值,点亮LED1-4
        if(++i == 16)
            i = 0;
    }

    return 0;
}

//makefile 文件

sdram.bin : head.S  leds.c
    arm-linux-gcc  -c -o head.o head.S
    arm-linux-gcc -c -o leds.o leds.c
    arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf
    arm-linux-objcopy -O binary -S sdram_elf sdram.bin
    arm-linux-objdump -D -m arm  sdram_elf > sdram.dis
clean:
    rm -f   sdram.dis sdram.bin sdram_elf *.o
大家帮忙看看问题出在什么地方,谢谢。
级别: 新手上路
UID: 60696
精华: 0
发帖: 26
金钱: 130 两
威望: 26 点
综合积分: 52 分
注册时间: 2011-12-14
最后登录: 2012-02-05
1楼  发表于: 2012-01-18 09:07
这个应该是下载到nand flansh中去运行的啊,不然你从norflash启动的话,还要这个干吗啊
级别: 新手上路
UID: 63263
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2012-02-16
最后登录: 2012-05-29
2楼  发表于: 2012-02-19 11:33
感觉可能地址有问题,bootlaoder一般分两个阶段的,第二个阶段的话,在sdram中运行,你把程序下载到0x30000000,就会与surpvivi冲突吧。具体你说的不详细,我也不知道问题在哪里。你可以用程序改下,在ads中运行。
这是我以前改的,你可以试试:
;*************************************************************************
; File:head.S
; 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
;*************************************************************************      



    area init,code,readonly
    code32
    import main
    import |Image$$RW$$Base|
MEM_CTL_BASE    equ             0x48000000
SDRAM_BASE    equ                 0x30000000
ENTRY    
    
    bl  disable_watch_dog               ; 关闭WATCHDOG,否则CPU会不断重启
    bl  memsetup                        ; 设置存储控制器
    bl  copy_steppingstone_to_sdram     ; 复制代码到SDRAM中
    ;ldr pc, =on_sdram                   ; 跳到SDRAM中继续执行
      ldr pc ,=|Image$$RW$$Base|
;on_sdram
    ldr sp, =0x34000000                 ; 设置堆栈
    bl  main
halt_loop
     b   halt_loop

disable_watch_dog
    ; 往WATCHDOG寄存器写0即可
    mov r1,     #0x53000000
    mov r2,     #0x0
    str r2,     [r1]
    mov pc,     lr      ; 返回

copy_steppingstone_to_sdram
    ; 将Steppingstone的4K数据全部复制到SDRAM中去
    ; Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
    
    mov r1, #0
    ldr r2, =SDRAM_BASE
    mov r3, #4*1024
hhh  
    ldr r4, [r1],#4     ; 从Steppingstone读取4字节的数据,并让源地址加4
    str r4, [r2],#4     ; 将此4字节的数据复制到SDRAM中,并让目地地址加4
    cmp r1, r3          ; 判断是否完成:源地址等于Steppingstone的未地址?
    bne hhh              ; 若没有复制完,继续
    mov pc,     lr      ; 返回

memsetup
    ; 设置存储控制器以便使用SDRAM等外设

    mov r1,     #MEM_CTL_BASE       ; 存储控制器的13个寄存器的开始地址
    adrl    r2, mem_cfg_val         ; 这13个值的起始存储地址
    add r3,     r1, #52             ; 13*4 = 54
ff  
    ldr r4,     [r2], #4            ; 读取设置值,并让r2加4
    str r4,     [r1], #4            ; 将此值写入寄存器,并让r1加4
    cmp r1,     r3                  ; 判断是否设置完所有13个寄存器
    bne ff                          ; 若没有写成,继续
    mov pc,     lr                  ; 返回



mem_cfg_val  dcd  0x22011110     ; BWSCON
      dcd 0x00000700      ; BANKCON0
       dcd 0x00000700      ; BANKCON1
    dcd 0x00000700     ; BANKCON2
      dcd 0x00000700      ; BANKCON3  
      dcd 0x00000700     ; BANKCON4
      dcd 0x00000700      ; BANKCON5
       dcd 0x00018005      ; BANKCON6
     dcd 0x00018005     ; BANKCON7
     dcd  0x008C07A3      ; REFRESH
    dcd   0x000000B1   ; BANKSIZE
     dcd 0x00000030      ; MRSRB6
    dcd 0x00000030      ; MRSRB7
    END