|
发表于 2011-3-7 12:03:35
|
显示全部楼层
如果你用IAR的话,我倒是有个模板可以在SDRAM里调试程序,MDK没研究过。
在SDRAM里调程序的思路是,2440从NAND启动,0x0地址被映射为内部SRAM。IAR可以在调试程序之前,可以使用x.mac文件对2440内部关键的几个寄存器初始化,包括总线,时钟,看门狗等等。以下为我的.mac文件配置:
execUserPreload()
{
__writeMemory32(0x00000000,0x53000000,"Memory"); //关看门狗
__writeMemory32(0xffffffff,0x4a000008,"Memory"); //关中断
__writeMemory32(0x000007ff,0x4a00001c,"Memory");
__writeMemory32(0x00000000,0x53000000,"Memory");
__writeMemory32(0x000055aa,0x56000050,"Memory");
__writeMemory32(0x00000007,0x4c000014,"Memory");
__writeMemory32(0x00ffffff,0x4c000000,"Memory");
__writeMemory32(0x00061012,0x4c000004,"Memory");
__writeMemory32(0x00040042,0x4c000008,"Memory");
__writeMemory32(0x22111120,0x48000000,"Memory");
__writeMemory32(0x00002f50,0x48000004,"Memory");
__writeMemory32(0x00000700,0x48000008,"Memory");
__writeMemory32(0x00000700,0x4800000c,"Memory");
__writeMemory32(0x00000700,0x48000010,"Memory");
__writeMemory32(0x00000700,0x48000014,"Memory");
__writeMemory32(0x0007fffc,0x48000018,"Memory");
__writeMemory32(0x00018005,0x4800001c,"Memory");
__writeMemory32(0x00018005,0x48000020,"Memory");
__writeMemory32(0x008e0459,0x48000024,"Memory");
__writeMemory32(0x00000032,0x48000028,"Memory");
__writeMemory32(0x00000030,0x4800002c,"Memory");
__writeMemory32(0x00000030,0x48000030,"Memory");
}
初始化完了之后SDRAM就可以用了,当然,你的程序也需要link到SDRAM的地址,我的目标板是Mini2440,地址是0x30000000。等你的程序被下载到0x30000000之后你就可以开始调试了。最重要的是你的初始化程序一定要在没开中断之前把你的vector table复制到地址0x0去!如果不复制,一旦产生中断你的程序就会跑飞了!还有一个要注意的问题就是,一般初始化文件里面的vector table使用指令
LDR PC,=XXX_Hndlr伪指令,而XXX_Hndlr的入口地址一般以32位数据的形式存在指令之后,下面是某个vector table在IAR的反汇编,所以从0x30000000 到 0x3000003c的内容都必须复制到0x0去,只复制vector table也是有问题的。
ldr pc,=__iar_program_start ;; Reset
TEXT_BASE:
__vector:
0x30000000: 0xe59ff018 LDR pc, _?0 ; ?cstartup
ldr pc,=OS_CPU_ARM_ExceptUndefInstrHndlr
0x30000004: 0xe59ff018 LDR pc, _?1 ; OS_CPU_ARM_ExceptUndefInstrHndlr
ldr pc,=OS_CPU_ARM_ExceptSwiHndlr
0x30000008: 0xe59ff018 LDR pc, _?2 ; OS_CPU_ARM_ExceptSwiHndlr
ldr pc,=OS_CPU_ARM_ExceptPrefetchAbortHndlr
0x3000000c: 0xe59ff018 LDR pc, _?3 ; OS_CPU_ARM_ExceptPrefetchAbortHndlr
ldr pc,=OS_CPU_ARM_ExceptDataAbortHndlr
0x30000010: 0xe59ff018 LDR pc, _?4 ; OS_CPU_ARM_ExceptDataAbortHndlr
ldr pc,=OS_CPU_ARM_ExceptAddrAbortHndlr
0x30000014: 0xe59ff018 LDR pc, _?5 ; OS_CPU_ARM_ExceptAddrAbortHndlr
ldr pc,=OS_CPU_ARM_ExceptIrqHndlr
0x30000018: 0xe59ff018 LDR pc, _?6 ; OS_CPU_ARM_ExceptIrqHndlr
ldr pc,=OS_CPU_ARM_ExceptFiqHndlr
0x3000001c: 0xe59ff018 LDR pc, _?7 ; OS_CPU_ARM_ExceptFiqHndlr
_?0:
0x30000020: 0x30006300 DC32 ?cstartup
_?1:
0x30000024: 0x30004724 DC32 OS_CPU_ARM_ExceptUndefInstrHndlr
_?2:
0x30000028: 0x30004734 DC32 OS_CPU_ARM_ExceptSwiHndlr
_?3:
0x3000002c: 0x30004744 DC32 OS_CPU_ARM_ExceptPrefetchAbortHndlr
_?4:
0x30000030: 0x30004758 DC32 OS_CPU_ARM_ExceptDataAbortHndlr
_?5:
0x30000034: 0x3000476c DC32 OS_CPU_ARM_ExceptAddrAbortHndlr
_?6:
0x30000038: 0x30004780 DC32 OS_CPU_ARM_ExceptIrqHndlr
_?7:
0x3000003c: 0x30004794 DC32 OS_CPU_ARM_ExceptFiqHndlr |
|