历史上的今天
返回首页

历史上的今天

今天是:2025年06月05日(星期四)

正在发生

2018年06月05日 | 关于S3C2440存储器地址分配和启动流程分析

2018-06-05 来源:eefocus

学习嵌入式,最开始应该了解就是地址空间的分配,真正搞清楚每个地址代表的位置,才有了入门的基础。

1、地址分配(27根线如何寻找1G空间)

S3C2440集成了丰富了外设控制器(LCD控制器、USB Device控制器、USB Host控制器、NAND FLASH控制器、I2C控制器、SPI控制器等)。要控制这些外设就要设置相应控制器的寄存器以产生相应的驱动时序。学习S3C2440,主要是如何配置寄存器。

下面是S3C2440特殊功能寄存器地址:
#define rBANKCON0  (*(volatileunsigned *)0x48000004) //Boot ROM control
#define rBANKCON1  (*(volatileunsigned *)0x48000008) //BANK1 control
#define rBANKCON2  (*(volatileunsigned *)0x4800000c) //BANK2 cControl

在学习的过程我一直在想这些地址为什么是这样的?

arm体系并没有明确指明每个寄存器的地址,而是各个芯片厂家自己设定了每个特殊寄存器的地址。


查S3C2440的数据手册可知S3C2440可寻址1G的地址范围,但是S3C2440的地址线只有27根,理论上只能寻址2的27次方等于128M的地址范围。
通过细致的分析可知:S3C2440通过一个BANK来解决了这个问题。

S3C2440有8个存储器BANK,引出了8根BANK线(对应nGCS0~ nGCS7),通过这个8根线来选通和关闭不同的存储器,这样S3C2440最多就可以连接8个128M的存储器。对某个BANK地址的访问实际上就是选通该BANK,于是ARM核只要发出一个地址,然后S3C2440的储存控制器把该地址解释成两部分:一部分是BANK地址,一部分是连接到该BANK存储器内部的地址就可以访问了。

这8个存储器banks:

6 个是ROM,SRAM 等类型存储器bank (bank0 ---- bank5)
l2 个是可以作为ROM、SRAM、SDRAM 等存储器bank (bank6 ---- bank7)
l7 个固定的存储器bank起始地址 (bank0 ---- bank6)
l最后一个bank 的起始地址可调整 (bank7, 接两片sdram时.接在bank7上的sdram会根据bank6上的结束地址而调整)

而作为32位的CPU,理论上可以使用的地址范围可以达到2的32次方等于4G,除去上述的1G地址空间,还有一部分是CPU内部寄存器的地址,剩下的地址空间没有使用。


图1


(1) S3C2440A的存储器管理器提供访问外部存储器的所有控制信号,27位地址信号(ADDR[26:0])、32位数据信号(DATA[31:0])、8个片选信号(nGCS[7:0])、以及读/写控制信号等.
看图1,我们知道.从0x4000 0000 地址开始,有片内SRAM,片内寄存器,还有未使用的空间.这是都是固定的,不能动的.留给我们用户的只有0x0000 0000 到 0x3FFF FFFF这1GB的地址空间给我们用. 1GB的地址空间我们需要30根地址线才能完全寻址完毕,2 的 30次方 刚好等于1GB,但是,芯片引脚上只给出了27根地址()ADDR[26:0]),单靠芯片上的27根引脚,它只能控制128M的空间,那3根线去哪里.其实这3根线用在了3-8译码器(如:000表示00000001,001表示00000010,010表示00000100,011表示00001000等等)的输入端去了,而这个3-8译码器的输出端,就是对应这nGCS0~7,对应着8个bank,用于选择当前处于哪个bank,这样做的好处在于很模块化结构化了,便于管理.不会造成一片和手动去分割地址.
(2) bank0---bank5为固定128MB,bank6和bank7的容量可编程改变,可以是2、4、8、16、32、64、128MB
请看图2


图2
所以.7个固定存储器bank(bank0-bank6)起始地址。bank7的开始地址与bank6的结束地址相连接,但是二者的容量必须相等,s3c2440最小可以支支持2MB(2MB一片,只接bank6) 最大支持是256MB(bank6接128MB,bank7接128MB),另需注意一点就是如果,需要接两片sdram的话,两片的容量大小必须是一样的.看图2就清楚了.
(3) bank0可以作为引导ROM。其数据线宽只能是16位和32位,其它存储器的数据线宽可以是8位、16位和32位
(4) 地址:
0x0000 0000 ----- 0x3FFF FFFF : 分配了8个bank ,每个bank 有128MB寻址空间, 每个bank也都会有片选信号,这8个bank 的地址提供给nandflash ,norflash,sdram使用(下面sdram的接入我们会祥细讲解)
0x4000 0000 ----- 0x47FF FFFF : 其中的前4KB空间,也就是0x4000 0000 到 0x4000 1000 为片内SRAM地址空间,这就是所谓的steppingstone(下面s3c2440启动时会再讨论steppingstone的作用),其它的空间未使用.
0x4800 0000 ----- 0x5FFF FFFF : 特殊功能寄存器,CPU的寄存器都在这时定义和配置.
0x6000 0000 ----- 0xFFFF FFFF : 这大概3G的空间是没有使用的.


下面的图片或许更加直观:

1、绿色那部分为外设地址空间,大小为1G,存在于CPU外部,由于存放数据与程序用的,CPU可通过地址线和数据线从中读取数据。
2、黄色那部分为功能部件寄存器,大小为3G,存在于CPU内部,即在这些寄存器上写入一些数据,则可控制相应功能部件的行为。



其中的各功能部件的寄存器地址范围如表下:


其中的各外设的访问地址如下表:



2、S3C2440启动流程

s3c2440支持两种启动模式:NAND和非NAND(这里是nor flash)。具体采用的方式取决于OM0、OM1两个引脚
OM[1:0所决定的启动方式
OM[1:0]=00时,处理器从NAND Flash启动
OM[1:0]=01时,处理器从16位宽度的ROM启动
OM[1:0]=10时,处理器从32位宽度的ROM启动。
OM[1:0]=11时,处理器从Test Mode启动。


1当引脚OM0跟OM1有一个是高电平时,这时地址0会映射到外部nGCS0片选的空间,也就是Norflash,程序就会从Norflash中启动,arm直接取Norflash中的指令运行。2当OM0跟OM1都为低电平,则0地址内部bootbuf(一段4k的SRAM)开始。系统上电,arm会自动把NANDflash中的前4K内容考到bootbuf(也就是0地址),然后从0地址运行。
Arm的启动都是从0地址开始,所不同的是地址的映射不一样。在arm开电的时候,要想让arm知道以某种方式(地址映射方式)运行,不可能通过你写的某段程序控制,因为这时候你的程序还没启动,这时候arm会通过引脚的电平来判断。


1) 从NorFlash启动时,与nGCS0相连的NorFlash就被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000;http://blog.csdn.net/shanzhizi


2) 从NandFlash启动时,S3C2440芯片内部自带的一块容量为4K的被称为“Steppingstone”(起步石)的BootRAM被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000。当系统上电或复位时,程序会从0x0地址处开始执行,因此我们编写的启动代码要确保存储在0地址处。如果系统的所有程序在编译链接后的大小小于4K,那在系统的启动代码中无需考虑将程序从NandFlash搬运到SDRAM这个问题,因为所有的程序在启动时即全部由NandFlash拷贝至BootSRAM,程序在BootSRAM中运行即可;如果系统的所有程序在编译链接后的大小大于4K,那在系统的启动代码中就需要包含一段将系统的全部程序从NandFlash搬运到SDRAM的代码,因为系统启动时只将NandFlash的前4K拷贝到了BootSRAM中,还有部分程序在NandFlash中,而程序在NandFlash中是无法运行的,需要将所有程序拷贝至SDRAM并在其中运行,所以系统的启动代码中要包含这段有关程序拷贝的代码,并在所有程序拷贝完成后使程序跳转到SDRAM中运行。也就是说NandFlash启动时需要考虑到涉及的两次搬移,第一次搬运是S3C2440硬件机制自动实现的,无需干预,第二次搬运需要程序员来实现,搬运程序量大小是系统的所有程序。


推荐阅读

史海拾趣

DB Unlimited公司的发展小趣事

DB Unlimited始终将技术创新作为公司发展的核心驱动力。公司不断投入大量资源进行技术研发和创新,推出了多项具有行业领先水平的音频技术。这些技术的推出不仅提升了公司的竞争力,也推动了整个音频行业的发展。DB Unlimited的技术创新能力和成果得到了业界的广泛认可。

GE Power Electronics Inc公司的发展小趣事
为企业或个人提供定制化的声控音乐玩具娃娃电路方案,满足不同的礼品需求。
Babcock Inc公司的发展小趣事

随着公司的发展壮大,Babcock开始注重品牌建设和企业文化建设。通过加强品牌宣传和推广,提升公司的知名度和美誉度;同时,公司还注重培养员工的归属感和忠诚度,营造积极向上的工作氛围。这些举措不仅提升了公司的软实力,也为公司的长远发展提供了有力保障。

这五个故事展示了Babcock Inc公司在电子行业中的发展历程和取得的成就。通过技术创新、市场拓展、国际合作以及品牌建设等方面的努力,Babcock逐渐成为了电子行业中的佼佼者,为行业的发展做出了积极贡献。

Churod Electronics Co Ltd公司的发展小趣事

随着国内市场的饱和,中汇瑞德开始将目光投向海外市场。为了更好地服务全球客户,公司在美国设立了子公司,并在全球范围内建立了销售网络。同时,公司还积极参与国际展会和交流活动,与国际同行建立了广泛的合作关系。这些举措不仅拓展了公司的业务范围,也提升了公司的国际影响力。

Anixter Inc公司的发展小趣事

随着国内市场的饱和,中汇瑞德开始将目光投向海外市场。为了更好地服务全球客户,公司在美国设立了子公司,并在全球范围内建立了销售网络。同时,公司还积极参与国际展会和交流活动,与国际同行建立了广泛的合作关系。这些举措不仅拓展了公司的业务范围,也提升了公司的国际影响力。

Fuji Electric Co Ltd公司的发展小趣事

中汇瑞德电子股份有限公司的创业之路并非一帆风顺。2006年,公司创始人周康平凭借对电子行业的深刻理解和前瞻视野,决定涉足继电器制造领域。当时,市场竞争激烈,技术门槛高,但周康平坚信,只要专注于技术研发和产品质量,就能在市场中脱颖而出。他带领团队日夜奋战,攻克了一个又一个技术难题,逐渐在继电器制造领域站稳了脚跟。

问答坊 | AI 解惑

谁有mega8学习板的电路图啊!分享一下!谢谢!

哪位仁兄有mega8学习板的原理图,分享一下嘛!小弟我找了好久都没找到啊!:\'(…

查看全部问答>

Linux动态加载驱动模块的问题

本人初学驱动开发 照着例子写了个简单的GPIO驱动 控制开发板上的LED 可是动态加载驱动后显示错误 过程如下: 硬件:s3c2440开发板      GPB5-8接4个LED 软件:linux-2.6.29内核      arm-linux-gcc- ...…

查看全部问答>

请问有4路24位的TTL电平信号的数据采集怎么设计和选型?

模拟信号都好采集,但是有的传感器是BCD码输出的,每个传感器的引脚是24条线输出,有4个,请问怎么设计和选型? 这里面可能要用到数据选择器或者寄存器;还有USB控制器…

查看全部问答>

请教,USART中的LIN模式如何配置`

请教,USART中的LIN模式如何配置GPIO、RCC以及USART的初始化,我用的STM32f103的,哪位用过次芯片的高手赐教下~~~…

查看全部问答>

nand flash驱动unable to mount partition

我的nand flash驱动加载时可以创建分区,也可以找到对应的文件系统驱动,但却无法mount这个分区,所以也出现不了盘符,请大家帮帮忙啊~~…

查看全部问答>

怎样将手机的摄像头作为Wince设备的USB设备

我的手机有一个摄像头,而且可以以USB接口连接到桌面计算机上,作为摄像头使用。请问怎样在WinCE设备里也可以这样用呢?需要怎样开发相关驱动?…

查看全部问答>

显示器怎么了,显示brilho=0

我的电脑前些天还好好的现在开机显示器黑屏只显示Brilho=0 我拿去别的机子试了不是主机的问题,各位大哥大姐教教小第 我该怎么处理啊 显示器调节按钮 按了都没反应。…

查看全部问答>

VS2005调试目标机上应用程序时,用TCP/IP方式连接总是“设备未就绪”??

使用VS2005开发win ce的应用程序,在调试的时间用TCP/IP方式连接到开发板,老说“设备未就绪”,该怎么解决啊?…

查看全部问答>

请教,关于ADS编译C++的问题

请教,我用ads1.2编译c++程序总是报一些头文件找不到,我把system path加了vc的库,结果有出了“only win32 and Mac supported\"这个问题,请问怎么办?ads1.2上可以编译c++吗?要怎么做? …

查看全部问答>

stm8l的Waitmode

Wait mode: The CPU clock is stopped, but selected peripherals keep running. 想请教前辈如何使用这种模式,我不明白进入等待模式后外设工作的时钟源从哪里来,是不是要使能LSI ? CPU停止工作应该不代表HSI停止工作吧?  有 ...…

查看全部问答>