基于S3C2410 的MDK 例程移植

发布者:鑫森淼焱最新更新时间:2019-02-13 来源: eefocus关键字:S3C2410  MDK  例程移植 手机看文章 扫描二维码
随时随地手机看文章

移植所关注的要点如下所示:


1.分散加载文件


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

之前提到的S3C2410 及其开发板的一些基本参数,这里我们要关心的是SDRAM 和Nor Flash 的编址问题。通过阅读S3C2410 用户指南可知,地址分布如下:
0x0000 0000 ~~ 0x0100 0000 :32M Nor Flash
0x8000 0000 ~~ 0x8100 0000 :32M Nor Flash
0x3000 0000 ~~ 0x0200 0000 :64M SDRAM
因此,针对不同的程序运行地址,就有不同的分散加载文件:

1) 程序运行在Nor Flash 中(RuninFlash.sct):
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
;Run in Flash
LR_ROM1 0x00000000 { ; load region
ER_ROM1 0x00000000 0x0200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x30000000 0x4000000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM1 0x40000000 0x00001000 {
.ANY (+RW +ZI)
}
}
2) 程序运行在SDRAM 中(RuninRAM.sct):
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
; Run in RAM
LR_ROM1 0x30000000 { ; load region
ER_ROM1 0x30000000 0x02000000 { ; load address = execution address

*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x30200000 0x3E00000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM1 0x40000000 0x00001000 {
.ANY (+RW +ZI)
}
}


2.调试脚本

关于调试脚本的更多原理介绍,请参考附录2 “Realview MDK 中调试脚本的详细解析”。
在S3C2410 的MDK 移植过程中,调试脚本(SDRAM.INI)主要的内容是进行SDRAM 的配置和初始化运行指针。

/*******************************************************************/
/* 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-2006 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 Setup (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(); // Setup for Init
LOAD SDRAM\Button_Test.axf INCREMENTAL // Download
PC = 0x30000000; //

3.MMU

S3C2410 支持MMU,具体的内容可见附录3 “RealView MDK 中如何对MMU 进行操作”。当程序运行在SDRAM 中时,需要运行MMU,以便能够找到正确的异常入

口。具体的函数实现过程如下:
/****************************************************************
* name: EnableMMU
* func: Enable the MMU
* para: none
* ret: none
* modify:
* comment:
****************************************************************/
void EnableMMU()
{
unsigned int ctl;
ctl = ARM_ReadControl();
ctl |= (1 << 0);
ARM_WriteControl(ctl);
}
/***********************************************************
* name: InitMMU
* func: Initialization the MMU
* para: pTranslationTable-TranslationTable Address
* ret: none
* modify:
* comment:
*****************************************************************/
void InitMMU(unsigned int *pTranslationTable)
{
int i;
// Program the TTB
ARM_WriteTTB((unsigned int) pTranslationTable);
// Program the domain access register
ARM_WriteDomain(0xC0000000); // domain 15: access are not checked
// Reset table entries
for (i = 0; i < 0x200; ++i)
pTranslationTable[i] = 0;
// Program level 1 page table entry
pTranslationTable[0x0] =
(0x300 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
0x2; // Set as 1 Mbyte section
pTranslationTable[0x1] =

(0x301 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
0x2; // Set as 1 Mbyte section
pTranslationTable[0x2] =
(0x302 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
0x2; // Set as 1 Mbyte section
pTranslationTable[0x3] =
(0x303 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
0x2; // Set as 1 Mbyte section
for(i = 0x200; i < 0xFFF; ++i)
pTranslationTable[i] =
(i << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
0x2; // Set as 1 Mbyte section
EnableMMU(); // Enable the MMU
}
/****************************************************************
* name: ARM_WriteTTB
* func: Write Translation table base register
* para: TTB Address
* ret: none
* modify:
* comment:
*************************************************************/
__inline void ARM_WriteTTB(unsigned int ttb)
{
__asm("MCR p15, 0, (ttb & 0xFFFFC000), c2, c0, 0");
}
/*************************************************************
* name: ARM_WriteDomain
* func: Write domain access control
* para: Domain NO.
* ret: none

* modify:
* comment:
*******************************************************************/
__inline void ARM_WriteDomain(unsigned int domain)
{
__asm("MCR p15, 0, domain, c3, c0, 0");
}
因为对于MMU 的控制必须在管理态下进行,故应该对启动代码进行相应的
修改。其中粗体部分为添加的内容。
; Enter Supervisor Mode and set its Stack Pointer
MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size
; Enable MMU Map Address 0x00 to 0x300000000,So if have no norflash the
interrupt can also work!
IF :DEF:ENABLEMMU
IMPORT InitMMU
STMFD SP!,{R0}
LDR R0, =TTB_ADDR
BL InitMMU
LDMFD SP!,{R0}
ENDIF
; Enter User Mode and set its Stack Pointer
MSR CPSR_c, #Mode_USR
MOV SP, R0
SUB SL, SP, #USR_Stack_Size

注意设置:Option or target ==>选择Asm 标签页进行汇编器属性配置。因为程序运行在SDRAM 中时,需要MMU,故需要在Define 中预定义:ENABLEMMU。该标号用来作为启动代码中的“IF:DEF:ENABLEMMU”的判断条件。


关键字:S3C2410  MDK  例程移植 引用地址:基于S3C2410 的MDK 例程移植

上一篇:ARM 如何实现绝对地址的跳转
下一篇:MDK S3C2440启动代码简单分析

推荐阅读最新更新时间:2024-03-16 16:23

Linux操作系统在S3C2410开发板上的的移植过程
ARM9S3C2410微处理器与Linux的结合越来越紧密,逐渐在嵌入式领域得到广范的应用。目前,在便携式消费类电子产品、无线设备、汽车、网络、存储产品等都可以看到S3C2410与Linux相结合的身影。 S3C2410微处理器是一款由Samsung公司为手持终端设计的低价格、低功耗、高性能,基于ARM920T核的微处理器。它带有内存管理单元(MMU),采用0.18mm工艺和AMBA新型总线结构,主频可达203MHz。同时,它支持Thumb16位压缩指令集,从而能以较小的存储空间获得32位的系统性能。 在众多嵌入式操作系统中,Linux目前发展最快、应用最为广泛。性能优良、源码开放的Linux具有体积小、内核可裁减、网络功
[单片机]
Linux操作系统在<font color='red'>S3C2410</font>开发板上的的<font color='red'>移植</font>过程
LCD基础及S3C2410 LCD控制器
一、超薄平面显示器时代来临 电视机所采用的 CRT(阴极射线管)有着体积大、重量重、尺寸受限等缺点。随着电子科技的发展,对移动显示的要求越来越多,CRT 的先天限制,让其小型化、行动化的理想受到阻碍。这使得开发新一代的显示器技术变得更有其必要! 新一代的显示器讲求几个重点:平面直角,画面显示不变形、轻薄短小耗能少,携带方便且同时要与现有的影像信号技术兼容。目前谈论到超薄型显示器技术,最普及当是 TFT LCD 的应用了,举凡数字相机、笔记型计算机、PDA 等,需要显示复杂信息的电子产品通通少不了它。TFT LCD 技术又包含了,低温多硅晶TFT LCD、反射式TFT LCD 等,多项不同的显示技术,下面我们就要来一探 LCD
[应用]
出租车监控调度系统方案设计
1 引言 在车辆定位系统中,GPS 系统是目前世界上应用得最为广泛的,其功能作用已广为人所接受。它能为用户提供全球、全天候、高精度、连续实时的导航、定位和授时。 随着移动 GPRS 业务的开展,GPRS 在无线传输中已经成为一种成熟可靠的传输方式。 GPRS 网本身支持TCP/IP、X.25 等协议,可以直接与IP 网或X.25 网互通,实现GPRS 终端的上网功能。它可以保证永远在线,而且是按照流量记费,不传输数据时不计费,同时中国移动公司的众多基站和可靠的频段信号能够保证信息传输及时、无误。 2 系统总体结构和实现功能介绍 本系统基于 GPS/GPRS 进行设计,主要以出租车公司为服务对象,总体结构如图1: 主要实现的功能
[单片机]
出租车监控调度系统方案设计
54M无线网络适配器在嵌入式系统中的研究与应用
目前,嵌入式技术已广泛应用于工业控制、消费类电子产品、通信系统等各类市场产品。并且随着互联网的日益发达,具有无线接入功能的嵌入式系统更加具有发展前景。本文将介绍支持IEEE 802.11g协议的54M USB无线网卡在嵌入式系统上的应用,嵌入式系统使用了ARM9系列的S3C2410处理器。 1 系统硬件体系结构 1.1 系统结构 系统总体结构如图1所示。 系统核心芯片采用三星公司的S3C2410处理器,该处理器是三星公司的一款基于ARM920T内核的16/32位RISC嵌入式微处理器,主要面向手持设备以及高性价比,低功耗的应用,运行的频率可以达到203MHz。该处理器集成了很多重要的功能模块,并且支持多种总线。处理器集
[单片机]
54M无线网络适配器在嵌入式系统中的研究与应用
基于S3C2410的CF卡文件系统
1 前 言 随着计算机应用技术的飞速发展,移动存储设备得到了广泛的应用。CF(Com PAC t Flash)卡以其能捕获、保存、传送数据、及其它音像信息的设计理念诞生于1994年,它是最早推出的闪存卡。由于CF卡具有价格低廉、体积小、存储容量大、高速等特点,因此被广泛地应用于数码相机、PDA和笔记本电脑等那些需要高速采样、实时记录数据、然后再将数据传入计算机进行分析处理的仪器和设备中。 由于CF卡中存储的信息要能从PC机上读取出来,所以必须采用一种标准的格式组织数据,通常采用的方法是在CF卡中内嵌文件系统。目前,市场上存在多种商用的嵌入式操作系统可以支持文件系统,但这些操作系统对硬件要求一般都比较高,价格昂贵,且
[单片机]
基于<font color='red'>S3C2410</font>的CF卡文件系统
使用RealView MDK进行SW调试和实时跟踪
一、目标调试阶段的配置 1. 调试器的选择 选择μVision- Debug - Options for Target – Debug,并选择ULINK Cortex Debugger调试器。 screen.width-333)this.width=screen.width-333" border=0> 2. 调试目标初始化文件 按照路径KeilARMStartupST,将文件STM32DBG.ini拷贝到工程文件夹中。选择μVision- Debug - Options for Target – Debug,同时在Initi
[单片机]
使用RealView <font color='red'>MDK</font>进行SW调试和实时跟踪
Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出
摘要: c标准库的printf是输出给显示器的,将printf函数进行修改,使其输出重定向至串口,就能实现目的。printf函数调用fputc函数完成实质输出单一字符的工作,因此将fputc函数修改使之完成串口单字符发送工作即可。 注: 本文方法性内容主要来自《Keil MDK环境下使用printf函数的解决方法》与《STM32串口使用Printf()函数问题》。除使用c标准库外,还可以使用keil mdk提供的microLib,在STM32串口使用Printf()函数问题》一文有介绍,另外,该文同时也提到如果使用c标准库函数,则要避免链接使用半主机模式的函数,retarge.c文件中的#pragma import(__use
[单片机]
基于MDK-ARM创建STM32L-DISCOVERY Project
本文只针对使用MDK-ARM建立软件开发环境,并基于STM32L1xx_StdPeriph_Lib_V1.1.1库及其Examples,其余情况可参考UM1451 User manual Getting started with software development toolchains for the STM32L-DISCOVERY board (后续会补充一般情况下创建STM32L MDK Project说明) 1. 安装Keil uVision4 2. 下载获得STM32L1xx_StdPeriph_Lib_V1.1.1.zip压缩包,解压到H:STM32L1xx_StdPeriph_Lib_V1.1.1,内部
[单片机]
基于<font color='red'>MDK</font>-ARM创建STM32L-DISCOVERY Project
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved