历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2019年02月13日 | 基于S3C2410 的MDK 例程移植

2019-02-13 来源:eefocus

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


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”的判断条件。


推荐阅读

史海拾趣

Bud Industries公司的发展小趣事

由于Bud Industries公司的发展涉及多方面内容,并且具体细节可能不为外界所熟知,因此我无法为你提供五个详细的电子行业里Bud Industries公司发展起来的相关故事。但我可以根据所掌握的信息,为你概述Bud Industries在电子行业中的一些发展事实。

Bud Industries在电子行业中的发展,得益于其持续的创新和卓越的制造能力。作为世界顶级的电子和数据外壳制造商,该公司以其革命性的设计赢得了市场的广泛认可。其中,其首款可堆叠塑料电子外壳和首款完全透明的NEMA级外壳的推出,标志着公司在设计创新上的重要突破。这些产品不仅满足了市场对电子外壳的多样化需求,同时也提升了产品的美观性和实用性。

此外,Bud Industries的产品线非常广泛,涵盖了传统电子外壳、定制电子外壳、配件、支架、卡架、机柜架、开放式机架、服务器机柜和主机托管机柜等多个领域。这些产品从尺寸上涵盖了从小型手持盒到大型机柜机架的各种规格,满足了不同客户的需求。同时,公司还提供了从塑料到金属等多种材质的选择,能够根据NEMA标准或客户的特殊需求进行制造。

除了产品线的丰富多样,Bud Industries还注重提供全面的设计支持。无论是标准产品还是定制商品,公司都能提供专业的设计建议和解决方案。这种全方位的服务使得客户能够更轻松地找到适合自己需求的产品,从而提高了客户的满意度和忠诚度。

在市场竞争日益激烈的今天,Bud Industries还注重与合作伙伴的紧密合作。通过与上下游企业的深入合作,公司能够更好地掌握市场动态和技术趋势,从而及时调整产品策略和生产计划。这种合作模式不仅提高了公司的市场竞争力,也为整个电子行业的发展做出了积极贡献。

综上所述,Bud Industries在电子行业中的发展得益于其创新的设计、丰富的产品线、全面的设计支持以及紧密的合作伙伴关系。这些因素共同推动了公司在市场中的快速发展和壮大。然而,具体的发展故事和细节可能需要进一步查阅相关资料或访问公司官网才能了解。

Hoffman Engineering公司的发展小趣事

Hoffman Engineering始终将技术创新视为公司发展的核心驱动力。公司不断投入研发资源,推动产品迭代升级。在机柜系列产品中,Hoffman Engineering通过引入先进的设计理念和生产工艺,不断提升产品的性能和质量。同时,公司还积极关注行业动态和客户需求变化,及时调整产品策略和市场布局。这种持续的技术创新和产品迭代,使Hoffman Engineering在激烈的市场竞争中保持领先地位。

Alliance Fiber Optics Products Inc公司的发展小趣事

随着产品质量的不断提升和市场需求的扩大,AFOP开始积极拓展国内外市场。公司通过与各大电信运营商、设备制造商等建立合作关系,将产品应用于长途通信、大都会网络以及最后一里接入等领域。同时,AFOP还积极参与国际光纤通信展览会等活动,加强与国际同行的交流与合作,提升了公司在国际市场的知名度。

Chyao Shiunn Electronic Industrial Ltd公司的发展小趣事

随着市场竞争的加剧,Chyao Shiunn意识到品质管理的重要性。公司开始加强产品质量的控制,从原材料的采购到生产流程的每一个环节都严格把关。同时,公司还加大了品牌宣传力度,通过参加行业展会、举办技术研讨会等方式提升品牌知名度。这些举措不仅提高了公司的市场份额,也增强了客户对公司的信任。

ETA Electric Industry Co Ltd公司的发展小趣事

在市场不断拓展的同时,ETA Electric Industry Co Ltd非常注重产品质量管理。他们引入了国际先进的质量管理体系,并严格执行每一项质量控制标准。公司还设立了专门的质量检测部门,对每一批出厂的产品进行严格把关。这种对质量的极致追求,赢得了客户的广泛认可和信赖。

Gang Song Electronics Co Ltd公司的发展小趣事

并购完成后,GainSpan的技术与Telit的物联网平台实现了深度融合。Telit利用GainSpan的低功耗WiFi模组技术,推出了更加高效、节能的物联网解决方案。这些方案不仅降低了物联网设备的能耗,还延长了设备的使用寿命,提高了整体系统的稳定性和可靠性。同时,GainSpan的技术也为Telit的物联网平台带来了更多创新应用的可能性。

问答坊 | AI 解惑

走出防电脑辐射的种种误区

很长一段时间以来,由射线防护品生产厂商们炒作的电磁辐射危害人类生存的浪潮愈演愈烈,引诱了很多日用品的生产者跟风,向消费者不断推销号称“世界领先科技”的防护用品,如:防电脑辐射的眼镜、手套、面罩、上衣、裤子、甚至孕妇专用的套装等等千 ...…

查看全部问答>

什么是汽车电子?

汽车电子简而言之就是半导体和汽车的结合,主要分为两类:一类是汽车电子控制装置,要和机械系统配合使用,例如电子燃油喷射系统、制动防抱死控制、防滑控制、悬架控制、动力转向等。另一类是车载汽车电子装置,是在汽车环境下能够独立使用的电子装 ...…

查看全部问答>

【藏书阁】电子线路与电子技术 /电器修理技术丛书

目录: 第1章 基础知识 第1节 基本概念 第2节 电子元器件主要特性和典型应用电路故障分析 第2章 音频放大器电路 第1节 晶体管单级放大器电路和电路故障分析 第2节 多级放大器电路及电路故障分析 第3节 放大器性能参数 第4节 音频功率放大 ...…

查看全部问答>

【藏书阁】微型计算机原理与汇编语言程序设计

第01章 微型计算机概述 38页.ppt 第02章 计算机中的数据表示 26页.ppt 第03章 80X86微处理器及其体系结构 33页.ppt 第04章 指令系统 134页.ppt 第05章 汇编语言的基本表达及其运行 28页.ppt 第06章 汇编语言程序设计 78页.ppt 第07章 中断调 ...…

查看全部问答>

求硬件开发的人才

高薪求人才! 职位描述及要求: 1. 生物医学工程、精密仪器、检测电子、电子信息工程等相关专业毕业 2、医疗工程系毕业的硕士优先考虑 2. 精通FPGA,单片机等硬件编程芯片的程序设计者优先考虑 3. 熟悉模拟电路、数字电路等sch设计及pcb设计 ...…

查看全部问答>

请教关于HALT模式

本人使用的不是低功耗的ST8芯片,在进入HALT后,用470uF的电容只能够记忆10S左右,但是我看说明书说进入HALT的电流是6ua,我把定时器,看门狗,内外部时钟都关掉,IO口置为输入,请问我是否有其他用电器需要关掉,谢谢.…

查看全部问答>

关于FLASH读写

                                 我现在FLASH能读,但是写不进去,也擦不了。对寄存器也是正确操作。…

查看全部问答>

关于P2IN

给P2.5输入0,程序如下 P2SEL &=~BIT5; P2IN    &=~BIT5; 结果编译出错,改成P2OUT &=~BIT5,没问题,但我一直理解的是P2OUT为输出的值,P2IN为输入的值,不知道这样理解对不对…

查看全部问答>

独立按键接法

小弟是刚开始学习的,按键触发不是有高低电平吗,我想知道独立按键的高电平触发电路接法和低电平触发电路接法.…

查看全部问答>