ADS 设置RO=0<br />参考vivi里<br /> bl init_nand ;初始化NAND Flash<br /> ;将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中<br /> ;nand_read_ll函数需要3个参数:<br /> ldr r0, =0x30000000 ;1. 目标地址=0x30000000,这是SDRAM的起始地址<br /> <br /> mov r1, #0 ;2. 源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处<br /> mov r2, #1024*8 ;3. 复制长度= 1024(bytes),对于本实验的main.c,这是足够了<br /> bl nand_read_ll ;调用C函数nand_read_ll<br /><br /> ldr sp, =0x34000000 ;设置堆栈<br /> ;ldr lr, =halt_loop ;设置返回地址<br /> ;ldr pc, =0x1dc;Main ;b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转 <br /> ldr r0,=on_the_ram ;get the address of label on_the_ram<br /> ldr r1,=0x30000000 ;load the startup code ram base adderss after the copy<br /> add r0,r0,r1 ;add it together to get the jump address<br /> mov pc,r0 ;load it to pc,jump to ram<br /> <br /> ldr pc, =setup_stack<br />setup_stack<br /> ldr sp, =0x33ffffff<br /> bl Main<br /> <br /> <br /> <br />on_the_ram<br /><br />...<br />....<br />RW,RZ的搬运<br />然后我用SJF2410烧到NANDFLASH里<br />上电运行LED,按键程序正常。但是用AXD仿真时,<br />到这步就有点异常了;<br />mov pc,r0 ;load it to pc,jump to ram<br />;r0 等于0x3000 0000+未执行的偏移量<br /><br />具体现象是:<br />。。。<br />[0xea000002] dcd 0xea000002 ....<br />[0xe5930054] dcd 0xe5930054 T...<br />[0xe3800040] dcd 0xe3800040 @...<br />[0xe5830054] dcd 0xe5830054 T...<br />[0xe5930054] dcd 0xe5930054 T...<br />[0xe3100008] dcd 0xe3100008 ....<br />[0x1a000003] dcd 0x1a000003 ....<br />[0xe5930054] dcd 0xe5930054 T...<br />[0xe3c00080] dcd 0xe3c00080 ....<br />[0xe5830054] dcd 0xe5830054 T...<br />[0xea000002] dcd 0xea000002 ....<br />[0xe5930054] dcd 0xe5930054 T...<br />。。。<br />PC在这些区域循环执行,但看不见代码。倒比较像我程序里的while(1)循环。<br />
|