本帖最后由 wdluo 于 2012-8-19 10:18 编辑
最近准备用自己手里面的一块闲置GT2440开发板做个音乐频谱,在网上找到了一篇关于程序在内存中调试的文章,这个文章可以在Keil MDK下将程序下载到内存中调试,但是中断却不能正确运行,主要原因是keil自带的启动代码没有中断处理相关代码,于是自己研究ADS版本的启动代码,并在网上查阅了一些资料,把keil自带的启动代码增加了中断处理部分代码,现在可以正确的处理中断了。下面就简单介绍下在内存中调试的工程建立过程,后面有建立好的工程源码下载。
新建工程,选择Samsung的S3C2440A:
点击“OK”,出现下面的对话框:
点击“是”,添加KEIL自带的STARTUP.s到工程中,进入下一步,管理组件:
进行如下配置:
完了进行工程配置:
目标选项如下配置,这些数值根据开发板上的硬件资源进行调整;使用Thumb-Mode和使用MicroLIB可以有效减少代码尺寸:
配置输出文件夹:
将Object文件放到这个Output文件夹:
LIST文件放到这个文件夹:
调整汇编编译选项,不使用Thumb模式:
下面的就是关于ULINK的配置了,注意不要勾选Load Application at Startup,还要配置Initialization File,这个文件在文末进行介绍:
JTAG Speed可以选择1MHz:
最后是下载项的配置,不要选中“Update Target Before Debugging”:
具体的配置如下:
下面是EXT_RAM.ini的内容,拷贝下来略作修改就可以用:- /******************************************************************************/
- /* Ext_RAM.INI: External RAM (SDRAM) Initialization File */
- /******************************************************************************/
- // <<< Use Configuration Wizard in Context Menu >>> //
- /******************************************************************************/
- /* This file is part of the uVision/ARM development tools. */
- /* Copyright (c) 2005-2008 Keil Software. All rights reserved. */
- /* This software may only be used under the terms of a valid, current, */
- /* end user licence from KEIL for a compatible version of KEIL software */
- /* development tools. Nothing else gives you the right to use this software. */
- /******************************************************************************/
- FUNC void SetupForStart (void) {
- // <o> Program Entry Point
- PC = 0x30000000;
- }
- FUNC void Init (void) {
- _WDWORD(0x4A000008, 0xFFFFFFFF); // 禁用所有中断
- _WDWORD(0x53000000, 0x00000000); // 禁用看门狗定时器
- // 时钟配置
- // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz
- _WDWORD(0x4C000000, 0x0FFF0FFF); // LOCKTIME
- _WDWORD(0x4C000014, 0x0000000F); // CLKDIVN
- _WDWORD(0x4C000004, 0x00043011); // MPLLCON
- _WDWORD(0x4C000008, 0x00038021); // UPLLCON
- _WDWORD(0x4C00000C, 0x001FFFF0); // CLKCON
- // 配置和SDRAM相关的内存控制器
- _WDWORD(0x48000000, 0x22000000); // BWSCON
- _WDWORD(0x4800001C, 0x00018005); // BANKCON6
- _WDWORD(0x48000020, 0x00018005); // BANKCON7
- _WDWORD(0x48000024, 0x008404F3); // REFRESH
- _WDWORD(0x48000028, 0x00000032); // BANKSIZE
- _WDWORD(0x4800002C, 0x00000020); // MRSRB6
- _WDWORD(0x48000030, 0x00000020); // MRSRB7
- _WDWORD(0x56000000, 0x000003FF); // GPACON: 使能SDRAM相关的地址线
- }
- // Reset chip with watchdog, because nRST line is routed on hardware in a way
- // that it can not be pulled low with ULINK
- // 由于nRST不能通过J-Link进行拉低,使用看门狗复位芯片
- _WDWORD(0x40000000, 0xEAFFFFFE); // Load RAM addr 0 with branch to itself
- CPSR = 0x000000D3; // 禁用中断
- PC = 0x40000000; // 定位PC到RAM的起始位置
- _WDWORD(0x53000000, 0x00000021); // 使能看门狗
- g, 0 // 等待看门狗复位芯片
- Init(); // 初始化内存
- LOAD Output\SD_FATFS.axf INCREMENTAL // 下载程序
- SetupForStart(); // 配置运行
- 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进行调试。
|