主题 : mini2440-SDRAM的困惑 复制链接 | 浏览器收藏 | 打印
一起学习嵌入式
级别: 新手上路
UID: 26240
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-08-05
最后登录: 2012-09-24
楼主  发表于: 2010-09-07 17:14

 mini2440-SDRAM的困惑

        我使用的mini2440开发板,OPENJTAG调试接口,在Eclipse环境下编程,最近调试SDRAM时候总是无法运行。
    举个实例,就是有一段点亮LED的代码,具体内容就是把下载到NAND Flash的一段代码(小于4K)复制到SDRAM中去运行,就是为了测试SDRAM,查看了开发板的芯片资料,配置应该都是对的,但是调试的时候出现了问题。而且如果在跳转到SDRAM的地址处加断点,运行之后,没有出现调试代码,LED也不能闪亮。
    我的SDRAM是H57V2562GTR-75C,配置如下:
.align 4
mem_cfg_val:
    @ 存储控制器13个寄存器的设置值
  .long   0x22011110      @ BWSCON    NANK7未用
    .long   0x00000700      @ BANKCON0
    .long   0x00000700      @ BANKCON1
    .long   0x00000700      @ BANKCON2
    .long   0x00000700      @ BANKCON3
    .long   0x00000700      @ BANKCON4
    .long   0x00000700      @ BANKCON5  0-5默认值
    .long   0x00018005      @ BANKCON6   13行9列
    .long   0x00018005      @ BANKCON7
    .long   0x008C07A3      @ REFRESH   查看了资料了,刷新周期是64ms/8192=7.8125us,R_CNT=2^11+1-12*7.8125=1955,所以应该是0x008c0000+1955=0x008c07a3
    .long   0x000000B1      @ BANKSIZE
    .long   0x00000030      @ MRSRB6      芯片写的2或者3
    .long   0x00000030      @ MRSRB7

引导代码:
@*************************************************************************
@ 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                  @ 返回

makefile:
all: head.S  leds.c
    arm-elf-gcc  -g -c -o head.o head.S
    arm-elf-gcc -g -c -o leds.o leds.c
    arm-elf-ld -g -Ttext 0x30000000 head.o leds.o -o sdram_elf
    arm-elf-objcopy  -O binary  -S sdram_elf sdram.bin
    arm-elf-objdump  -D  -m  arm  sdram_elf > sdram.dis
clean:
    rm -f   sdram.dis sdram.bin sdram_elf *.o
主要就是连接的地址是从0x30000000开始的,也就是才能跳到SDRAM中执行
主程序是没有问题的,应为直接在SRAM中运行是对的……困惑啊,有哪位高手遇到过的,帮忙提点意见啊,这后面NANDFlash 都用到的,特别是代码大于4K啊,先谢啦…………
一起学习嵌入式
级别: 新手上路
UID: 26240
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-08-05
最后登录: 2012-09-24
1楼  发表于: 2010-09-09 13:39
刚刚单步调试了,查看了寄存器的值,发现在把NANDFLASH里的程序拷到SDRAM中的时候,R1的到60的时候就不动了,困惑……
但是呢,我然后又胡乱采取了点措施,我的那个编译器里面要自己加一段Debug命令的
target remote localhost:3333
monitor arm920t cp15 2 0
monitor arm7_9 sw_bkpts enable
load
这个基本是通用的,然后我就随便改成
target remote localhost:3333
monitor arm920t cp15 2 0
monitor arm7_9 sw_bkpts enable
load
monitor resume ox30000000
这样在点击运行,当然还是不对的,但是,我在紧接着再把最后一行删掉,接着再运行,除了奇了,能正常运行了。但是如果这时候停下来,在运行的话,就有不行了……
一起学习嵌入式
级别: 新手上路
UID: 26240
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-08-05
最后登录: 2012-09-24
2楼  发表于: 2010-09-09 13:40
我觉得下面的这个现象可能更有作用。上面的程序的本意是把NANDFLASH里的程序拷到SDRAM中在运行的,但是我现在把Makefile里面的代码段的起始地址还改为0x0,其实也就是不在SDRAM中运行,编译,运行,自然是对的。那么,这时候,我在改回来,还改为在0x30000000,再编译运行,单调,却能够正常运行,看了地址了,确实是在SDRAN中运行的。但是,如果我把开发板断电重启的话,就有不行了,只能重复上面的这过程,才能运行。什么问题啊?
级别: 新手上路
UID: 5171
精华: 0
发帖: 35
金钱: 250 两
威望: 100 点
综合积分: 70 分
注册时间: 2009-04-13
最后登录: 2016-03-30
3楼  发表于: 2010-12-01 20:59
我想你有可能是在线仿真的!  如果这样的你的程序是没有下载到nandflash中的。

可以为通过ivi的A命令  把bin文件烧写到 nandflash中看看    我已经完成拉    但是我还想找点其他类似的程序试一下 所以看到拉你的帖子
级别: 新手上路
UID: 45404
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2011-05-04
最后登录: 2011-05-05
4楼  发表于: 2011-05-05 14:32
楼主,你的问题解决了吗 我现在遇到了与你同样的问题 ,求解!!