弄了几天,终于吧ADS原来的一个LED小程序移植到KEIL ARM里面,并且搞掂可以在SDRAM中调试了。首先说说硬件平台,ARM是三星的S3C2410,SDRAM是HY57V561620BT*2,64M容量,标准的SDRAM片选接在nGSC6,故地址空间在0x30000000~0x33ffffff。软件平台是Keil ARM就是Realview MDK V3.40中国评估版,另外我也试过V3.20,但是不直接用wiggler JTAG来调试,所以就直接上3.40版本的RVMDK了,JTAG用H-JTAGV9.1,很快H-JTAG就可以支持NAND FLASH的烧写了,twentyone加油!下面详细介绍如何设置RVMDK。
安装RVMDK后,我这里用了本来ADS工程带的start.s启动代码,下次再试试用keil向导带的S3C2410.s启动代码,把其它C程序文件添加到keil工程中,设置工程属性option for target,在target页中,Xtal设置的晶振频率只在软件仿真中有用,实际硬件调试,还是要设置MPLLCON寄存器实现,关键是设置Read/Only Memory Areas与Read/Write Memory Areas,如下图设置,这里是跟SDRAM的地址对应才行。如果是软件仿真,就在下面on-chip的IROM1与IRAM1前打钩,Startup钩上。
另外是Linker页的设置,把Use Memory Layout form Target Dialog的小钩去掉,在R/O base与R/W base设置,另外我这里使用了分散加载文件Scatter,在Scatter file中添加,misc controls中要设置--entry入口地址0x30000000与SDRAM地址对应,输入
--info totals --entry 0x30000000 --scatter .outputstart.sct --info sizes
.outputstart.sct 注意替换自己编写的scatter文件的目录路径。如果是软件仿真,则
R/O base与R/W base设置为0x00000000 与0x00002000,misc control内容改为
--info totals --entry 0x00000000 --scatter .outputstart.sct --info sizes
加载的scatter文件内容也要做修改,下面有介绍。
另外 重新编写.sct加载文件,不然会出现
Error: L6218E: Undefined symbol Image$$RW$$Limit 这样的错误,说没定义RW段,
重新编写的.sct加载文件
LR_IROM1 0x30000000 0x00002000 { ; load region size_region
RO +0 { ; load address = execution address
*.o (RESET, +First) ;(RESET, +First)的含义是把RESET段的内容编译后放在0x00000000位置
;*(InRoot$$Sections)
.ANY (+RO)
}
RW 0x30002000 0x00002000 { ; RW data
.ANY (+RW +ZI)
}
ZI +0 { ; ZI data
.ANY (+ZI)
}
} 如果是软件仿真,则改为如下,在0x0地址开始调试
LR_IROM1 0x00000000 0x00002000 { ; load region size_region
RO +0 { ; load address = execution address
*.o (RESET, +First) ;(RESET, +First)的含义是把RESET段的内容编译后放在0x00000000位置
;*(InRoot$$Sections)
.ANY (+RO)
}
RW 0x00002000 0x00002000 { ; RW data
.ANY (+RW +ZI)
}
ZI +0 { ; ZI data
.ANY (+ZI)
}
} 还有Debug页的设置,选Use Simulator是软件仿真,右边选择RDI Interface Driver,用wiggler JTAG,再点Settings,选择H-JTAG.DLL的路径,这些设置不懂可以装了H-JTAG后看它的帮助文档有介绍。
Load Application at Startup前的小钩钩去掉,在Initialization File中,添加初始化脚步文件.ini,编辑内容如下,关键是定义上电后PC指针地址,我的RAM.ini文件如下,另外提醒RVMDK区分大小写,Main函数要注意大小写一致
FUNC void Setup (void) {
// Program Entry Point
PC = 0x30000000;
}
LOAD outputstart.axf INCREMENTAL // Download Setup(); // Setup for Running g, Main
RVMDK中的新版本编译工具会重新生成满足堆栈8byte对齐要求的目标文件,避免由于堆栈不对齐引起的连接错误,因此在每个汇编文件的开头,添加“PRESERVE8”指令,如
PRESERVE8
AREA RESET, CODE, READONLY ;下面定义了一个只读的名字为SelfBoot的代码端
如果是在SDRAM中调试,还要打开start.s的option选项,在Asm页Define输入RAM_MODE REMAP
设置基本完成,编译Build工程,通过后,打开运行H-JTAG,点Debug就可以了, 看到开始Debug时候PC已经不是在0x00000000地址,而是到到0x30000280了,直接到了Mail函数了。 SDRAM调试成功,但是曾经出现程序跑飞的情况,有地方说是SDRAM初始化问题,以后再跟进,解决这个问题。 上面程序跑飞的问题,实际是由于本来我的板子NAND FLASH里面有程序,有VIVi跟wince,VIVI把wince的镜像释放到SDRAM中,使我的程序跑飞了,解决办法是把nand flash清空,或在VIVI释放镜像前进入DEBUG。
2
|
|
|
|
楼主 你好,看到这个 如获至宝,我最近也在学2410上裸机开发,用KEIL, 能再提供一点具体的指导么,非常感谢呀
或者,楼主讲解一下,我现在应该做的具体流程,也可以,谢谢
QQ: 963450691
email: qinglanyu_jun@foxmail.com
|
|
|
|
|