*********************************************************************************
******************************软硬件说明***************************************
************ Keil: Keil uVision V4.10 **************************************
************ CPU: S3C2440 **********************************************
************ J-Link: J-Link V8(SEGGER) *******************************
*********************************************************************************
1.打开Keil,新建工程并选择处理器型号,之后会提示是否添加该处理器的启动代码,选择“是”即OK。
2.新建页编写代码,保存并添加到工程目录下。
3.Ctr+F7(或选择编译按钮)编译代码,如果代码没问题是不会报错的,之后如果不配置相关选项直接Build代码会报错。一般会提示内存出错之类的信息。
4.打开“Option for Target”选项卡,在“Target”选项下面设置:“Read/Only Memory Areas”下面勾选ROM1,Start:“0”,Size:“0x1000”,并勾选Startup,在“Read/Write Memory Areas”下面勾选RAM1,Start:“0x30000000”,Size:“0x1000”。其中地址空间大小可以根据情况自己设定。
5.在“Output”选项卡下面勾选:“Create HEX File”。(不勾也无所谓的)
6.此时再build代码,一般不会出现问题,这时会生成一个 “ 工程名.sct ” 文件,再打开“Option for Target”,在“Linker”选项卡下面去掉第一行“Use Memory Layout fromTarget Dialog”前面的勾勾。下面“Scatter File”变成可修改状态,一般会有个 “ 工程名.sct”文件,点击后面的编辑按钮,这个文件是关于代码存储空间分布的,注意修改里面的地址空间(S3C2440的SDRAM空间一般为0x3000 0000,地址空间大小可以自己设定,不要超出SDRAM地址空间,一般设置0x10000,)保存文件,并在之前的地方(Scatter File)重新加载该文件。
7.从网上Down一个“Ext_RAM.INI”文件(External RAM (SDRAM) Initialization File ,Keil 公司编写的 ),这个文件会在你编写的代码运行之前运行,该代码主要是用于初始化处理器(如看门狗、时钟、SDRAM等);在初始化语句下面一行 “LOAD .\***.axf INCREMENTAL”中,将“***.axf”文件改为之前生成的 “工程名.axf”并保存。
8.在“Option for Target”选项卡的“Debug”子页下,选择 “J-link/J-TRACE”以及勾选前面的“Use”,并选择初始化文件(Initialization File,上一步中所说的那个“.ini文件”)。并在“Utilities”选项卡下面选择“J-link/J-TRACE ”以及初始化文件。注意:去掉“Update Target before Debugging”前面的勾勾,不然下载代码会报错的。之后点击OK即可。
9.重新Build代码,然后可以通过Debug方式将代码通过J-Link下载到开发板上运行。 以下是初始化代码:###########################################################
FUNC void SetupForStart (void)
{// Program Entry Point
PC = 0x30000000;}
FUNC void Init (void) {
_WDWORD(0x4A000008, 0xFFFFFFFF); // Disable All Interrupts
_WDWORD(0x53000000, 0x00000000); // Disable Watchdog Timer
// Clock Setup
// 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
// Memory Controller Setup for 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: Enable Address lines for SDRAM
}
// Reset chip with watchdog, because nRST line is routed on hardware in a way
// that it can not be pulled low with ULINK
_WDWORD(0x40000000, 0xEAFFFFFE); // Load RAM addr 0 with branch to itself
CPSR = 0x000000D3; // Disable interrupts
PC = 0x40000000; // Position PC to start of RAM
_WDWORD(0x53000000, 0x00000021); // Enable Watchdog
g, 0 // Wait for Watchdog to reset chip
Init(); // Initialize memory
LOAD .\444.axf INCREMENTAL // Download program
//SetupForStart(); // Setup for Running
PC = 0x30000000;
g, main // Goto Main
###########################################################