基于2410的MDK例程移植.docx

上传人:b****5 文档编号:7252425 上传时间:2023-01-22 格式:DOCX 页数:30 大小:308.59KB
下载 相关 举报
基于2410的MDK例程移植.docx_第1页
第1页 / 共30页
基于2410的MDK例程移植.docx_第2页
第2页 / 共30页
基于2410的MDK例程移植.docx_第3页
第3页 / 共30页
基于2410的MDK例程移植.docx_第4页
第4页 / 共30页
基于2410的MDK例程移植.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

基于2410的MDK例程移植.docx

《基于2410的MDK例程移植.docx》由会员分享,可在线阅读,更多相关《基于2410的MDK例程移植.docx(30页珍藏版)》请在冰豆网上搜索。

基于2410的MDK例程移植.docx

基于2410的MDK例程移植

基于S3C2410的MDK例程移植

Embest

1前言

Keil是业界最好的51单片机开发工具之一,它拥有流畅的用户界面与强大的仿真功能。

ARM将Keil公司收购之后,正式推出了针对ARM微控制器的开发工具RVMDK,它将ARM编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。

2007年5月,ARM正式授权中国深圳英蓓特公司代理中文版RVMDK的出售事务。

S3C2410目前已经在国内外市场得到了普遍的应用,因此移植S3C2410的MDK例程,对于推广MDK具有比较重要的意义。

其实,对于MDK例程的移植,无论是从EmbestIDE下,还是从ADS下,其过程都是相似的。

S3C2410基于ARM920T内核,16KB指令Cache,16KB数据Cache,支持MMU,NandFlashBootLoader,内部嵌有4KBRAM,即启动石,亦可在系统启动完成后,做为他用。

同时S3CEV2410开发板还集成了32M*2NorFLash,64MSDRAM。

因此在移植的时候,可以将程序分别运行在SDRAM和NorFlash中。

2相关技术说明

2.1启动代码

MDK一个强大的功能就是能够自动生成启动代码,而且可以进行图形化的代码设置,这就可以极大地方便了工程师,减少了百余行的汇编代码的编写。

虽然一些老工程师习惯而且更喜欢文本编辑的方式,但是不可否认,MDK提供的启动代码生成向导,对于加快项目开发进度,提高工作效率,帮助新人迅速进入开发工作具有十分重要的意义。

同样,MDK支持S3C2410启动代码自动生成。

1)在MDK中新建工程

打开RVMDK,在主菜单中选择ProjectNew…uVisionProject,并给新工程命名为New_MDK.uv2,单击“保存”,见图2-1。

图2-1在RVMDK中新建工程

在RVMDK自动弹出的器件选择窗口(SelectDeviceforTarget)中选择该工程所对应的处理器型号,“S3C2410”,并单击“确定”,见图2-2。

当RVMDK提示用户是否自动添加启动代码时,选择“是”。

图2-2启动代码自动生成向导

双击打开S3C2410A.S文件,在MDK的文本编辑区中,显示S3C2410的默认配置的启动代码。

点击ConfigurationWizard,就可以通过图形化的形式对生成的默认启动代码进行个性化的配置,包括:

堆栈,时钟管理,中断向量表,看门狗时钟,存储器控制,I/O配置等。

如图2-3所示:

图2-3启动代码图形化配置界面

这样,通过以上的步骤,我们就可以快速方便地完成启动代码的生成配置了。

2.2分散加载文件

关于散加载文件的具体内容介绍,可参考附录1“RealviewMDK中链接脚本详细解析”,这里只针对S3C2410以及开发板的特点,给出具体的代码参考。

之前提到的S3C2410及其开发板的一些基本参数,这里我们要关心的是SDRAM和NorFlash的编址问题。

通过阅读S3C2410用户指南可知,地址分布如下:

0x00000000~~0x01000000:

32MNorFlash

0x80000000~~0x81000000:

32MNorFlash

0x30000000~~0x02000000:

64MSDRAM

因此,针对不同的程序运行地址,就有不同的分散加载文件:

1)程序运行在NorFlash中(RuninFlash.sct):

;*************************************************************

;***Scatter-LoadingDescriptionFilegeneratedbyuVision***

;*************************************************************

;RuninFlash

LR_ROM10x00000000{;loadregion

ER_ROM10x000000000x0200000{;loadaddress=executionaddress

*.o(RESET,+First)

*(InRoot$$Sections)

.ANY(+RO)

}

RW_RAM10x300000000x4000000{;RWdata

.ANY(+RW+ZI)

}

RW_IRAM10x400000000x00001000{

.ANY(+RW+ZI)

}

}

2)程序运行在SDRAM中(RuninRAM.sct):

;*************************************************************

;***Scatter-LoadingDescriptionFilegeneratedbyuVision***

;*************************************************************

;RuninRAM

LR_ROM10x30000000{;loadregion

ER_ROM10x300000000x02000000{;loadaddress=executionaddress

*.o(RESET,+First)

*(InRoot$$Sections)

.ANY(+RO)

}

RW_RAM10x302000000x3E00000{;RWdata

.ANY(+RW+ZI)

}

RW_IRAM10x400000000x00001000{

.ANY(+RW+ZI)

}

}

2.3调试脚本

关于调试脚本的更多原理介绍,请参考附录2“RealviewMDK中调试脚本的详细解析”。

在S3C2410的MDK移植过程中,调试脚本(SDRAM.INI)主要的内容是进行SDRAM的配置和初始化运行指针。

/*******************************************************************/

/*Ext_RAM.INI:

ExternalRAM(SDRAM)InitializationFile*/

/*******************************************************************/

//<<>>//

/*******************************************************************/

/*ThisfileispartoftheuVision/ARMdevelopmenttools.*/

/*Copyright(c)2005-2006KeilSoftware.Allrightsreserved.*/

/*Thissoftwaremayonlybeusedunderthetermsofavalid,current,*/

/*enduserlicencefromKEILforacompatibleversionofKEILsoftware*/

/*developmenttools.Nothingelsegivesyoutherighttousethissoftware.*/

/********************************************************************/

FUNCvoidSetup(void){

_WDWORD(0x53000000,0x00000000);

_WDWORD(0x4A000008,0xFFFFFFFF);

_WDWORD(0x4A00001C,0x000007FF);

_WDWORD(0x4C000014,0x00000003);

_WDWORD(0x4C000004,0x0005c042);

_WDWORD(0x56000070,0x00280000);

_WDWORD(0x56000078,0x00000000);

_WDWORD(0x48000000,0x22111110);

_WDWORD(0x48000004,0x00000700);

_WDWORD(0x48000008,0x00000700);

_WDWORD(0x4800000C,0x00000700);

_WDWORD(0x48000010,0x00000700);

_WDWORD(0x48000014,0x00000700);

_WDWORD(0x48000018,0x00000700);

_WDWORD(0x4800001c,0x00018005);

_WDWORD(0x48000020,0x00000700);

_WDWORD(0x48000024,0x008e0459);

_WDWORD(0x48000028,0x000000B2);

_WDWORD(0x4800002c,0x00000030);

_WDWORD(0x48000030,0x00000030);

_WDWORD(0x56000014,0x00000001);

_WDWORD(0x56000020,0xAAAA55AA);

_WDWORD(0x56000028,0x0000FFFF);

_WDWORD(0x56000024,0x00000000);

}

Setup();//SetupforInit

LOADSDRAM\Button_Test.axfINCREMENTAL//Download

PC=0x30000000;//ProgramEntryPoint

g,main//Runtomainfunction

具体的寄存器地址以及初始化参数请查阅S3C2410用户指南。

2.4NorFlash烧写算法

MDK支持多种NorFlash芯片的烧写,故在移植的过程中,只需要选择对应的NorFlash烧写算法即可。

在MDK工具栏中点击

或是ProjectOptionsforTarget“XXX”,选择Uilities选项卡,如图2-4所示:

图2-4Flash烧写配置界面

点击Settings按钮,添加Flash烧写算法。

已知S3C2410开发板用到的烧写算法为AM29F160DBFlash,因此,只需在点击Add按钮后,在里面找到对应的算法即可。

添加算法后,界面如图2-5所示:

图2-5Flash算法配置界面

2.5MMU

S3C2410支持MMU,具体的内容可见附录3“RealViewMDK中如何对MMU进行操作”。

当程序运行在SDRAM中时,需要运行MMU,以便能够找到正确的异常入口。

具体的函数实现过程如下:

/****************************************************************

*name:

EnableMMU

*func:

EnabletheMMU

*para:

none

*ret:

none

*modify:

*comment:

****************************************************************/

voidEnableMMU()

{

unsignedintctl;

ctl=ARM_ReadControl();

ctl|=(1<<0);

ARM_WriteControl(ctl);

}

/***********************************************************

*name:

InitMMU

*func:

InitializationtheMMU

*para:

pTranslationTable-TranslationTableAddress

*ret:

none

*modify:

*comment:

*****************************************************************/

voidInitMMU(unsignedint*pTranslationTable)

{

inti;

//ProgramtheTTB

ARM_WriteTTB((unsignedint)pTranslationTable);

//Programthedomainaccessregister

ARM_WriteDomain(0xC0000000);//domain15:

accessarenotchecked

//Resettableentries

for(i=0;i<0x200;++i)

pTranslationTable[i]=0;

//Programlevel1pagetableentry

pTranslationTable[0x0]=

(0x300<<20)|//PhysicalAddress

(1<<10)|//Accessinsupervisormode

(15<<5)|//Domain

1<<4|

0x2;//Setas1Mbytesection

pTranslationTable[0x1]=

(0x301<<20)|//PhysicalAddress

(1<<10)|//Accessinsupervisormode

(15<<5)|//Domain

1<<4|

0x2;//Setas1Mbytesection

pTranslationTable[0x2]=

(0x302<<20)|//PhysicalAddress

(1<<10)|//Accessinsupervisormode

(15<<5)|//Domain

1<<4|

0x2;//Setas1Mbytesection

pTranslationTable[0x3]=

(0x303<<20)|//PhysicalAddress

(1<<10)|//Accessinsupervisormode

(15<<5)|//Domain

1<<4|

0x2;//Setas1Mbytesection

for(i=0x200;i<0xFFF;++i)

pTranslationTable[i]=

(i<<20)|//PhysicalAddress

(1<<10)|//Accessinsupervisormode

(15<<5)|//Domain

1<<4|

0x2;//Setas1Mbytesection

EnableMMU();//EnabletheMMU

}

/****************************************************************

*name:

ARM_WriteTTB

*func:

WriteTranslationtablebaseregister

*para:

TTBAddress

*ret:

none

*modify:

*comment:

*************************************************************/

__inlinevoidARM_WriteTTB(unsignedintttb)

{

__asm("MCRp15,0,(ttb&0xFFFFC000),c2,c0,0");

}

/*************************************************************

*name:

ARM_WriteDomain

*func:

Writedomainaccesscontrol

*para:

DomainNO.

*ret:

none

*modify:

*comment:

*******************************************************************/

__inlinevoidARM_WriteDomain(unsignedintdomain)

{

__asm("MCRp15,0,domain,c3,c0,0");

}

因为对于MMU的控制必须在管理态下进行,故应该对启动代码进行相应的修改。

其中粗体部分为添加的内容。

;EnterSupervisorModeandsetitsStackPointer

MSRCPSR_c,#Mode_SVC:

OR:

I_Bit:

OR:

F_Bit

MOVSP,R0

SUBR0,R0,#SVC_Stack_Size

;EnableMMUMapAddress0x00to0x300000000,Soifhavenonorflashtheinterruptcanalsowork!

IF:

DEF:

ENABLEMMU

IMPORTInitMMU

STMFDSP!

{R0}

LDRR0,=TTB_ADDR

BLInitMMU

LDMFDSP!

{R0}

ENDIF

;EnterUserModeandsetitsStackPointer

MSRCPSR_c,#Mode_USR

MOVSP,R0

SUBSL,SP,#USR_Stack_Size

2.6工程管理

在S3C2410的MDK例程移植中,需要建立两个目标工程:

RuninRAM和RuninFlash。

具体的工程管理方法,请参考附4“RealViewMDK中如何方便实现同一程序在不同地址运行的工程管理”。

3移植步骤

下面就介绍下如何从其他的开发工具上移植例程到MDK上。

3.1RuninSDRAM

1)新建一个文件夹,用于保存例程的所有文件,将例程中与开发工具无关的源文件拷到该目录下。

2)参照2.1启动代码一节,利用MDK自动生成启动代码,并配置好所需要的参数。

同时,依据2.5MMU一节,对启动代码进行修改。

3)根据2.7工程管理,建立工程目录,同时添加相应的源文件。

如图3-1所示:

图3-1工程结构目录

4)单击工程属性快捷键

,打开工程属性设置窗口,并选择C/C++标签页,设置编译器属性。

选择优化等级,以及优化选项,同时添加包含头文件的目录。

如图3-2所示:

图3-2编译器属性配置界面

5)选择Asm标签页进行汇编器属性配置。

因为程序运行在SDRAM中时,需要MMU,故需要在Define中预定义:

ENABLEMMU。

该标号用来作为启动代码中的“IF:

DEF:

ENABLEMMU”的判断条件。

图3-3汇编器属性配置界面

6)选择Linker标签页进行链接器配置。

在链接器的属性配置中,主要添加分散加载文件,即添加RuninRAM.sct路径,如图3-4所示。

图3-4链接器属性配置界面

7)选择Debug标签页进行调试属性配置。

包括添加调试脚本(SDRAM.ini),设置调试方式等。

如图3-5所示:

图3-5调试属性配置界面

8)Build工程并适当修改代码。

当所有的工程属性都设置好之后,单击“Buildalltargetfile”快捷键

,对整个工程进行编译链接。

对出现的错误或警告进行相应的修改,重新编译工程。

9)点击Debug调试快捷键

,将生成的.axf文件下载到SDRAM中进行在线调试。

10)配置超级终端。

在PC机上运行windows自带的超级终端串口通信程序,,设置超级终端:

波特率115200、1位停止位、无校验位、无硬件流控制,或者使用其它串口通信程序。

(注:

超级终端串口的选择根据用户的PC串口硬件不同,请自行选择,如果PC机只有一个串口,一般是COM1)。

11)单击

,顺利执行程序;或执行单步运行,观察开发板上指示灯和超级终端输出信息。

12)编写Readme文件,以方便用户进行程序实验。

3.2RuninFlash

1)配置完RuninRAM工程属性后,通过

选择程序运行在Flash中,单击工程属性快捷键

,打开工程属性设置窗口,对与RuninFlash进行工程配置。

2)选择C/C++标签页,设置编译器属性。

选择优化等级,以及优化选项,同时添加包含头文件的目录。

如图3-6所示:

图3-6编译器属性配置界面

3)选择Asm标签页进行汇编器属性配置。

注意,与RuninRAM不同,当程序运行在NorFlash中时是不需要MMU的,故不需要预定义“ENABLEMMU”标号。

图3-7汇编器属性配置界面

4)选择Linker标签页进行链接器配置。

在链接器的属性配置中,主要添加分散加载文件,即添加RuninFlash.sct路径,如图3-8所示。

图3-8链接器属性配置界面

5)选择Debug标签页进行调试属性配置。

包括添加调试脚本(Flash.ini),设置调试方式等。

其实Flash.ini和SDRAM.ini类似,只是在.axf引用的位置和最后PC指向的位置不同。

在Flash.ini中,PC=0x00000000。

这样程序就可以在Flash中进行调试了,需要说明的是在Flash中调试的时候,只能设置2个断点。

如图3-9所示:

图3-9调试属性配置界面

6)参照2.4NorFlash烧写算法一节,添加NorFlash烧写算法。

同时在Uilities标签页中选上“UpdateTargetb

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1