基于2410的MDK例程移植.docx
- 文档编号:7252425
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:30
- 大小:308.59KB
基于2410的MDK例程移植.docx
《基于2410的MDK例程移植.docx》由会员分享,可在线阅读,更多相关《基于2410的MDK例程移植.docx(30页珍藏版)》请在冰豆网上搜索。
基于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;//
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 2410 MDK 例程 移植