流平 发表于 2012-6-10 01:18:47

MDK4.12+jinlkV8在SDRAM上成功调试S3C44B0

用那古老的ADS觉得很难受,决定要用MDK和jlinkV8学学老掉牙的44B0。摸索了很久,终于成功将ADS下在SDRAM上调试的跑马灯程序移植到MDK下。
不过很可惜MDK没有提供给三星用的片上外设仿真用的TARM.DLL文件,所以只能用memory命令查看片上外设的寄存器了。
虽然会在调试的Commend窗口看到
  *** Error: 'C:\Keil\ARM\BIN\TARMS.DLL' not found
不过不影响MDK调试。

我开发板上的SDRAM起始地址为:0x0C000000

首先新建个44B0的project,当问到是否要添加MDK自带的44B0启动代码时,我们选择No。(我们将添加原来在ADS下的启动代码)
接下来就把代码关系整理好,新建好group什么的。

选择Target option按钮

弹出Option for Target 窗口。
其中的Target选项卡,我们基本不用理它。因为我们用的是分散加载文件(scatter file),所以这一个选项卡对我们没什么用。(当然也可以由该选项卡生成scatter文件)

选中Output选项卡

单击Select Folder for Objects...
1.弹出下面的窗口,选好obj文件的输出文件夹。(输出的.axf文件和.hex文件都在该目录底下)

2.为输出的可执行文件命名

3.按图所示,打上勾,到时会生成相应的调试信息和交叉引用文件,方便调试。
选中Listing选项卡
像设置object文件夹一样设置一下Listing文件夹

选中User选项卡
如果我们希望生成bin文件方便烧录的话,可以在编译器编译完成后调用fromelf.exe将编译生成的.axf文件转换成bin文件。Fromelf.exe命令的具体语法格式如下:
  命令的格式:fromelf input_file
我们在Run User Programs After Build/Rebuilt中勾选Run#1,注意后面DOS16不要勾选,不然会出错(fromelf.exe不是DOS16的执行文件)
填入命令行:fromelf.exe –bin –o$L@L.bin!L

该行会在调用fromelf.exe时展开如下:

从UV4.chm这个帮助文档中可以查得

Key Code和File Code要配套使用,UV4会根据其组合进行命令行展开,方便用户使用。
根据上图可知File Code L指代linker的输出文件,特别是生成的用于debug的文件,也就是.axf文件。
Key Code $是展开成后面File Code指代文件所在的文件夹路径。
所以$L展开成.axf文件所在文件夹的路径,即E:\MDKprj\44B0\Debug_in_SDRAM_ok\obj\
@是修饰文件没有指定的文件扩展名和路径,也就是@只取文件名,不过会展开文件的路径和扩展名。
所以@L展开成ledtest
而@L.bin也就展开是ledtest.bin
!是File Code指代的文件带相对路径
所以!L展开成.\obj\ledtest.axf
选中C/C++标签页
Proprocessor Symbols:可以实现宏定义(我这里不用填,根据代码需要)
Include Paths:将放头文件的文件夹include进去,也就是在Include Paths选中放置头文件的文件夹

Linker标签页是重点

首先去掉Use Memory Layout from Target Dialog,也就是不使用由Target标签页生成的scatter file,而是使用用户自己编写的scatter file。
在Scatter File中选中用户自己编写的scatter file,我的是Debug_in_SDRAM.sct文件。
Misc control中填入:--entry 0x0c000000 (也就是程序的入口点,程序从该点执行)
Debug_in_SDRAM.sct文件的内容如下:

; *************************************************************
; *** Scatter-Loading Description File 分散加载文件             ***
; *************************************************************

LR_ROM1 0x0C000000   
{    ; 加载域
ER_ROM1 0x0C000000 +0    ; 0x0c000000 +0就是和加载域对齐到0x0c000000,
{; +0代表offset为0,也就是执行域的起始地址也是0x0c000000。
   vector.o (selfboot, +FIRST);在vector.o文件中将selfboot段
                ;作为FIRST输入端
   *(InRoot$$Sections);放置启动代码段
   .ANY(+RO);放置RO代码段
}

RW_RAM1 +0   ;RW_RAM1域起始地址为空,表示紧邻ER_ROM1域放置,
{   ; +0表示offset为0
   *(+RW +ZI);放置+rw 和 +zi
   .ANY(+RW +ZI)
}

RW_IRAM1 0x10000000 0x2000   
{; RW data
   .ANY (+RW +ZI)
}
}

重点是这个调试初始化文件,44B0_Debug_in_SDRAM.ini,内容如下
//    初始化44B0的相关寄存器,以实现在外部SDRAM中调试程序
//    Date: 2011.12.02
//    Modifiy By: colordrv
//    Program Entry Point: 0x0C000000
//    Supply for: MDK IDE and the board QZTECH-44B0

FUNC void Setup (void)
{
        //_WWORD (0x01c00000, 0x00000008);// SYSCFG(System Configuration)
        _WWORD (0x1c80000, 0x11111100); // BWSCON(Bus Width & Wait Status Control)
        _WWORD (0x1c80004, 0x00000600); // BANKCON0(Boot ROM Control)
        _WWORD (0x1c80008, 0x00007ffc); // BANKCON1(BANK1 Control)
        _WWORD (0x1c8000c, 0x00007ffc); // BANKCON2(BANK2 Control)
        _WWORD (0x1c80010, 0x00007ffc); // BANKCON3(BANK3 Control)
        _WWORD (0x1c80014, 0x00007ffc); // BANKCON4(BANK4 Control)
        _WWORD (0x1c80018, 0x00007ffc); // BANKCON5(BANK5 Control)
        _WWORD (0x1c8001c, 0x00018000); // BANKCON6(BANK6 Control)
        _WWORD (0x1c80020, 0x00018000); // BANKCON7(BANK7 Control)
        _WWORD (0x1c80024, 0x0086060e); // REFRESH(DRAM/SDRAM Refresh Control)
        _WWORD (0x1c80028, 0x00000010); // BANKSIZE(Flexible Bank Size)
        _WWORD (0x1c8002c, 0x00000020); // MRSRB6(Mode register set for SDRAM)
        _WWORD (0x1c80030, 0x00000020); // MRSRB7(Mode register set for SDRAM)
       
        //sp = ; // Stack Pointer
        pc = 0x0C000000; // Program Entry Point
}

/*
   The LOAD command can used with key sequences. With this enhancement,
   a generic Debugger initialization file may be used across multiple projects,
   for example in a Multi-Project Workspace the name of the linker output file
   can be specified with %L.
   INCREMENTAL add the debugging information to the existing symbol table.
               This allows multi-application debugging. */
LOAD %L INCREMENTAL // Load the .axf Debug File(必须加)
Setup();    // Setup for Running(必须加)

就这样OK了。
小弟第一次发帖,各位别喷我太厉害哦-1-1

流平 发表于 2012-6-10 01:26:51

忘记加上程序工程文件了,真没记性,这东西也是半年前写 的,忘记发了。

hxh824 发表于 2012-6-10 08:36:37

好旧的板啊

yxy789 发表于 2012-6-18 16:30:21

谢谢,可以参考下,我还有一块easy arm 2200的板子

chuyong999 发表于 2012-6-25 09:18:05

楼上的兄弟你有 2200的板子吗? 有没有 ucos 的keil模板啊? 我的QQ 7744000

william_rain 发表于 2012-6-25 10:38:34

我也有块44b0的板子

aitchow 发表于 2012-7-4 14:05:22

多谢分享~~~~~~

BILLCHIA 发表于 2012-8-20 22:31:34

mark!!!!!!!!!!!!!1

ds168 发表于 2012-8-20 23:24:58

多谢分享...

yuele 发表于 2013-1-7 19:37:27

LZ,有没有带有中断的程序,发一个来呀。。timer的

654987 发表于 2013-10-20 12:00:26

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

liang16888 发表于 2013-11-18 10:47:09

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}
页: [1]
查看完整版本: MDK4.12+jinlkV8在SDRAM上成功调试S3C44B0