纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 11583|回复: 2

KEIL MDK 4.23+ ULINK2调试S3C2440的工程配置

[复制链接]
发表于 2012-8-18 12:34:42 | 显示全部楼层 |阅读模式
本帖最后由 wdluo 于 2012-8-19 10:18 编辑

最近准备用自己手里面的一块闲置GT2440开发板做个音乐频谱,在网上找到了一篇关于程序在内存中调试的文章,这个文章可以在Keil MDK下将程序下载到内存中调试,但是中断却不能正确运行,主要原因是keil自带的启动代码没有中断处理相关代码,于是自己研究ADS版本的启动代码,并在网上查阅了一些资料,把keil自带的启动代码增加了中断处理部分代码,现在可以正确的处理中断了。下面就简单介绍下在内存中调试的工程建立过程,后面有建立好的工程源码下载。

新建工程,选择Samsung的S3C2440A:
1.jpg
点击“OK”,出现下面的对话框:
2.jpg
点击“是”,添加KEIL自带的STARTUP.s到工程中,进入下一步,管理组件:
3.jpg
进行如下配置:
4.jpg
完了进行工程配置:
5.jpg
目标选项如下配置,这些数值根据开发板上的硬件资源进行调整;使用Thumb-Mode和使用MicroLIB可以有效减少代码尺寸:
6.jpg
配置输出文件夹:
7.jpg
将Object文件放到这个Output文件夹:
8.jpg
LIST文件放到这个文件夹:
9.jpg
调整汇编编译选项,不使用Thumb模式:
10.jpg
下面的就是关于ULINK的配置了,注意不要勾选Load Application at Startup,还要配置Initialization File,这个文件在文末进行介绍:
11.jpg
JTAG Speed可以选择1MHz:
12.jpg
最后是下载项的配置,不要选中“Update Target Before Debugging”:
13.jpg
具体的配置如下:
14.jpg

下面是EXT_RAM.ini的内容,拷贝下来略作修改就可以用:
  1. /******************************************************************************/
  2. /* Ext_RAM.INI: External RAM (SDRAM) Initialization File                      */
  3. /******************************************************************************/
  4. // <<< Use Configuration Wizard in Context Menu >>>                           //
  5. /******************************************************************************/
  6. /* This file is part of the uVision/ARM development tools.                    */
  7. /* Copyright (c) 2005-2008 Keil Software. All rights reserved.                */
  8. /* This software may only be used under the terms of a valid, current,        */
  9. /* end user licence from KEIL for a compatible version of KEIL software       */
  10. /* development tools. Nothing else gives you the right to use this software. */
  11. /******************************************************************************/


  12. FUNC void SetupForStart (void) {

  13. // <o> Program Entry Point
  14. PC = 0x30000000;
  15. }


  16. FUNC void Init (void) {

  17.     _WDWORD(0x4A000008, 0xFFFFFFFF);      // 禁用所有中断

  18.     _WDWORD(0x53000000, 0x00000000);      // 禁用看门狗定时器

  19.                                           // 时钟配置
  20.                                           // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz
  21.     _WDWORD(0x4C000000, 0x0FFF0FFF);      // LOCKTIME
  22.     _WDWORD(0x4C000014, 0x0000000F);      // CLKDIVN
  23.     _WDWORD(0x4C000004, 0x00043011);      // MPLLCON
  24.     _WDWORD(0x4C000008, 0x00038021);      // UPLLCON
  25.     _WDWORD(0x4C00000C, 0x001FFFF0);      // CLKCON

  26.                                           // 配置和SDRAM相关的内存控制器
  27.     _WDWORD(0x48000000, 0x22000000);      // BWSCON
  28.     _WDWORD(0x4800001C, 0x00018005);      // BANKCON6
  29.     _WDWORD(0x48000020, 0x00018005);      // BANKCON7
  30.     _WDWORD(0x48000024, 0x008404F3);      // REFRESH
  31.     _WDWORD(0x48000028, 0x00000032);      // BANKSIZE
  32.     _WDWORD(0x4800002C, 0x00000020);      // MRSRB6
  33.     _WDWORD(0x48000030, 0x00000020);      // MRSRB7

  34.     _WDWORD(0x56000000, 0x000003FF);      // GPACON: 使能SDRAM相关的地址线
  35. }


  36. // Reset chip with watchdog, because nRST line is routed on hardware in a way
  37. // that it can not be pulled low with ULINK

  38. // 由于nRST不能通过J-Link进行拉低,使用看门狗复位芯片

  39. _WDWORD(0x40000000, 0xEAFFFFFE);        // Load RAM addr 0 with branch to itself
  40. CPSR = 0x000000D3;                      // 禁用中断
  41. PC   = 0x40000000;                      // 定位PC到RAM的起始位置
  42. _WDWORD(0x53000000, 0x00000021);        // 使能看门狗
  43. g, 0                                    // 等待看门狗复位芯片

  44. Init();                                 // 初始化内存
  45. LOAD  Output\SD_FATFS.axf  INCREMENTAL        // 下载程序
  46. SetupForStart();                        // 配置运行
  47. g, main                                 // Goto Main
复制代码
上面的红色加粗部分Output\SD_FATFS.axf是要调整的,调整跟你的工程配置相适应,比如我的输出文件名是SD_FATFS,就写成了现在的这个样子。

OK,下面是一个简单的例子,控制连接在GPB5的LED闪烁:

#include<S3C2440.H>
int main(void)
{
    unsigned int i ;
   
    //配置GPB5为输出口
    GPBCON &= ~(0x3 << 10) ;
    GPBCON |= (0x1 << 10) ;
   
    while(1)
    {
        //使GPB5输出低电平
        GPBDAT &= ~(1<<5);
        //延时
        for(i=0;i<200000;i++);
        //使GPB5输出高电平
        GPBDAT |= (1<<5);
        //延时
        for(i=0;i<200000;i++);
    }
}

开始Debug,至此,这个代码已经可以在SDRAM进行调试。
回复

使用道具 举报

发表于 2012-11-3 09:39:38 | 显示全部楼层
顶一个,内容蛮强大
回复 支持 反对

使用道具 举报

发表于 2013-2-21 13:01:43 | 显示全部楼层
看了LZ的帖子,我只想说一句很好很强大!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-22 01:11 , Processed in 0.630764 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表