来自http://blog.163.com/yjie_life/blog/static/16319833720116910264279/
以uart的项目为例子。
建项目目录test_uart,在该目录下建一个src目录,并把uart的所有源码放到src目录下。
把S3C2440A的RAM初始化文件Ext_RAM.ini(在文章后面有源码)和RunInRAM.sct文件(在文章后面有源码)放到项目根目录下
打开MDK,新建项目,项目文件名为test_uart
选择芯片
不使用默认的startup代码
添加src
添加源文件到src目录
修改项目选项,点击,并如图修改
修改2440init.s文件,
注释掉
IMPORT |Image$$RO$$Base| ; Base of ROM code
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise
添加
IMPORT |Image$$ER_ROM1$$RO$$Base| ; Base of ROM code
IMPORT |Image$$ER_ROM1$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW_RAM1$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$RW_RAM1$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$RW_RAM1$$ZI$$Limit| ; to zero initialise
注释掉
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
添加
BaseOfROM DCD |Image$$ER_ROM1$$RO$$Base|
TopOfROM DCD |Image$$ER_ROM1$$RO$$Limit|
BaseOfBSS DCD |Image$$RW_RAM1$$RW$$Base|
BaseOfZero DCD |Image$$RW_RAM1$$ZI$$Base|
EndOfBSS DCD |Image$$RW_RAM1$$ZI$$Limit|
在AREA Init,CODE,READONLY这行前将上PRESERVE8
修改Ext_RAM.ini文件,将加载文件改为test_uart.axf:
LOAD .\test_uart.axf INCREMENTAL// 下载程序
编译项目,点击
将所有硬件准备好后就可以点击进行调试了,
说明:其它main.c源码有错误,导致输入的字符串不能再次打印出来。其实只要对变量稍作修改就可以了。
以下是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的起始位置;片内4K RAM的起始地址
_WDWORD(0x53000000, 0x00000021); // 使能看门狗
g, 0 // 等待看门狗复位芯片
Init(); // 初始化内存
LOAD .\test_adc.axf INCREMENTAL// 下载程序
SetupForStart(); // 配置运行
g, main // Goto Main
以下是RunInRAM.sct文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
; Run in RAM
LR_ROM1 0x30000000 { ; load region
ER_ROM1 0x30000000 0x1000000 { ; load address = execution address
*.o (Init, +First) ;设置程序入口,Init是2440Init.S中的段名
; *(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x31000000 0x1000000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM1 0x40000000 0x00001000 {
.ANY (+RW +ZI)
}
}