感觉可能地址有问题,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