S3C2440内存组成

发布者:冰心独语u最新更新时间:2022-11-16 来源: zhihu关键字:S3C2440  存储 手机看文章 扫描二维码
随时随地手机看文章

大家好,我们这回来讨论下S3C2440内存组成。

先来张图吧:

图1

S3C2440是32bit的单片机(请允许我叫它单片,因为我觉得它和普通的单片机真的没有本质的区别),那么按道理它的地址范围就是0~0xFFFFFFFF,也就是4GB的寻址空间。但是,实际上很多是保留的,0~0x3FFFFFFF的地址部分是分配给用户的NandFlash、NorFlash、SDRAM等存储器件,0x40000000开始有一部分是内部寄存器,绝大部分是保留不使用的。

NandFlash:我们可以把它当作PC机的硬盘。

NorFlash:也是FLASH,但是其读的速度很快。

SDRAM:中文全称是同步随机动态存储,类似于SRAM,但是造价啥的比较便宜;当然性能上一定比SRAM差一些,便宜没好货嘛。但无论如何,都是RAM,掉电数据丢失。

图1所表示的就是分配给用户的内存部分,我们仔细分析下。

官方的说法就是:

图2

其实都是一些扯淡的玩意,看完也不知道什么意思。我们一点点来分析。

首先,这个单片机的存储时是按小端模式还是大端模式去存储是可以通过软件去配置。具体怎么配置先不管,后面再说。

然后呢这个单片机给用户的1GB地址空间里面啊,分了8个小块出来,每个小块是128MB的大小。8个小块里面呢,编号分别为0,2,3,4,5,6,7。0这块的起始地址是0x00000000,1这块的起始地址是0x8000000,2这块的起始地址是0x10000000,3这块的起始地址是0x18000000,4这块的起始地址是0x20000000,5这块的起始地址是0x28000000,6的起始地址是0x30000000。7这块就是有点意思了,因为6那块的大小是不一定的,它可以是2/4/8/16/32/64/128MB,就是说假如我希望6块的大小是64MB,那么那么6的终点地址就是0X33FFFFFF;接着块7的起始地址就是0X34000000,且其大小必须和块6一样大,这个是芯片规定的,为啥就后面再解释。多出来没用的地址就是保留的了。所以说这8个块里面,编号0到6这7个都是有固定起始地址的,只有编号7这个是要根据编号6的终点地址来确定,但是编号7一定紧随编号6的结束地址且编号6和7的大小一定要一样。

这8块里面呢,编号0到5这6个可以作为SROM、SRAM的接口,说白了就是这6个地址接口处你可以接个FLASH,可以接SRAM存储芯片;6和7这两个块可以接SDRAM、FLASH、SRAM。通常买来的开发板都是6和7这两个块接SDRAM,这里SDRAM和SRAM是有区别的,但是暂时不管,就当他就是RAM。我买的开发板就是6和7接了两片32MB的SDRAM,一共64MB,块0接的是NORFLASH。

这里NORFLASH需要做一些解释,NORFLASH有8bit/16bit/32bit,海洋买的板子上是用16bit的norflash。最初,海洋看板子上norflash连接的时候就有个疑问:2MByte的NORFLASH,A0~A20的地址线,D0~D15的数据总线;跟CPU的memory conctrl控制模块是这么连接的:nor的A0~A19对应CPU的A1~A20,nor的D0~D15对应CPU的D0~D15,第一反应有点懵,为什么nor的A0地址线不对应CPU的A0地址线呢?OK,搜索一下NOR的一些原理。

先来说一些基本的东西,在我们通常见到的普通flash中,通常是按每一页N个字节,每个扇区M个页,每个块S个扇区这样的组成。其最小擦除和最小写入单位是页,比如我的FLASH是每页256字节,那么一次最最少擦除或写入256字节。假如我有一块串行flash是2Mbyte的,SPI总线单字节读写方式。那么其地址空间就是0~0x1FFFFF,我里边存储的数据是0x01,0x02,0x03,0x04,0x05,0x06。好了,我读取地址0处的数据,那么毋庸置疑的读取到的数据一定是0x01,这一切都没有任何疑问对吧。那么假如还是这块flash,假如这玩意只支持16bit的读写呢,其读写结果会是怎么样呢?

假设我有一块并行的norflash,并行也就是说数据线和地址线分开的,我这块norflash名字就叫做nor16,大小是2Mbyte,只支持16bit的模式(这个就暂且理解为有的单片机8位有的32位)。2Mbyte嘛,按前面说的串行flash的道理,这个2Mbyte的nor16的地址就是0~0x1FFFFF,这个肯定没啥好说的,无论你是几bit的模式,你总归得有那么多个地址才能放得下那么多数据吧,不然就扯淡了。我的接线是这样,no16的地址线A0~A20(地址最大是0x1FFFFF,那当然你的地址线得有21条地址线才够用)接单片机的A0~A20,数据线也是逐条对接(16条,16bit的数据嘛)。我通过我的单片机给出一个0x0得地址,告诉nor16,我要读0地址处得数据,那么nor16会返回什么呢?是0x0201。我给它0x01这个地址,它就回0x0403,我给它0x02这个地址,它就给我回0x0605。这好像不对啊,为什么不是按前面的说的串行FLASH那样返回数据给我呢?问题就在于这个所谓的16bit模式。

Nor16是16bit模式,也就是说它一次性是读/写入两个字节的,我们读地址0 ,他会返回16bit的数据。它是把0地址和0x01地址类似于绑一块,要死一起死的那种感觉。所以你发出0地址,它就是两个位置的一起搞回来给你。那这就有个问题了,我要是给个0x01的地址呢?那这样干扰到我了,我前面给0地址,你给我回来0x0201,接着给1地址,你给我回0x0403,太难受了。于是整了个办法,假如我在单片机编程时我代码写地址0x00和0x01发出去时,nor16收到的都是0x00,那nor16给我回的一定就是0x0201;我发出地址0x02和0x03,nor16收到的都是0x01,回给我的数据就一定时0x0403。这样就比较符合人类的脑子了,我在里面存储的数据是0x01,0x02,0x03,0x04,0x05,0x06嘛,我的代码发出0x02这个地址它就给我回了0x0403,起码收到的数据是按我代码给的地址去返回的嘛(如果还是不爽,就把它设置一下大小端模式,就会收到0x0304,就更直观了)。

所以人们很聪明的把地址线错开了一下,nor16的地址线的A0~A20连接到单片机的A1~A21。这样之后呢,代码发出0地址时,nor16收到的是0;代码发出1地址时,nor16收到的还是0;发出2的时候,nor16收到的就是1啦。咦,这样好像有个问题喔,我们前面说了,2Mbyte的nor16的地址最大是0x1FFFFF,那么当我的单片机发出0x1FFFFF时,也就是二进制的1 1111 1111 1111 1111 1111。然后由于地址线错开了,那么nor16看到的就是1 1111 1111 1111 1111 111,很奇怪,才20个1了,那就是说20条线就够了,那为什么我们算出来了的药21条地址线,A0~A20呢?其实是前面算错了一丢丢而已。我把nor16当一个大和黑子,里面有2Mbyte个小空格,我说取0处数据时,它把0和1格子的数据都给我了;我说取1处数据时,它把2和3格子的数据都给我了。以此类推,我说要第N处的数据时,这玩意就把2N和2N+1处的数据都给给我了。那我想要最后一个格子S和倒数第2个格子(S-1)的数据时,不就是告诉它我要(S-1)/2这个地址处的数据嘛。那么由于最后一个格子就是第2Mbyte个格子,于是我只要告诉它把第0XFFFFF处的数据给我就可以了。所以,nor16的地址就变成只需要20条线。于是正确的连接方式就是nor16的A0~A19接单片机的A1~A20,单片机发出0x1FFFFF时,nor16就收到0xFFFFF,就把最后两个格子的数据给我了。

好了,16bit的norflash分析到此。写了这么多是因为一开始海洋没看明白为什么原理图上单片机和norflash连接是地址线错开一位的,不知道大伙是不是也有这个疑问,如果是没疑问的高手请绕道(捂脸)。至于32bit的norflash那自然就是错开3位来接线,具体的分析就和16位是一样的。另外就是大伙不要混淆了这个数据线和地址线,16bit模式是说数据是16bit存储,但和地址没毛线关系啊;你16bit模式只是说数据线16条,地址线不一定是16条啊。


关键字:S3C2440  存储 引用地址:S3C2440内存组成

上一篇:S3C6410输入子系统按键驱动程序
下一篇:Linux驱动:s3c2440 lcd 驱动分析

推荐阅读最新更新时间:2024-11-09 11:41

服务全球超18000家客户 揭秘华为存储四大创新方向
4月26-27日,华为分析师大会在深圳举办,在此次会议上,据华为强调,华为存储持续以技术驱动创新,不断突破,持续引领数据基础设施发展。服务全球18000家客户,助力企业数字化转型。 此外,华为存储阐述了全场景闪存化、新兴业务驱动、面向数据中心的产品组合创新、绿色低碳等数据存储四大创新方向。 首先是全场景闪存化创新,据华为介绍,当前华为面向企业的不同业务场景,持续完善全场景闪存产品序列,包括SAN&NAS一体化的OceanStor Dorado全闪存存储,新一代OceanStor混合闪存,支持闪存的OceanProtect专用备份存储,以及业界唯一的“主存+备份”完整防勒索解决方案。 其次则是新兴业务驱动的存储创新,面向容器、
[手机便携]
服务全球超18000家客户 揭秘华为<font color='red'>存储</font>四大创新方向
S3C2440裸机之串口
前言 基于JZ2440开发板 一、思维导图 二、代码 1.uart.c 代码如下(示例): /************************************************************************ * * 文件名:uart.c * * 功能: 键盘输入字符,信息会通过串口打印在界面上 * * 创建人:LiZhenhao * * 时间:2021年10月10日15:51:49 * * 版本号:1.0 * * 修改记录:无 * ************************************************************************/
[单片机]
<font color='red'>S3C2440</font>裸机之串口
ALSA声卡10_从零编写之数据传输_学习笔记
1、引言 (1)应用程序使用声卡的时候,数据流程是:应用程序把数据发送给驱动,驱动把数据发送给硬件声卡,声卡把数据转换成声音数据播放出去。 (2)可以使用两种方式发送数据 第一种:app发数据,等驱动处理完后再发下一段(处理完再发下一段就会导致声音会断断续续 ) 第二种:应用程序不断地发数据,驱动程序不断地取数据,不断地发给硬件。解决了声音断续的问题,但是要创建一个非常大的缓冲区(在驱动程序里面申请的 ,称其为buffer) 一个采样点的数据包括左声道数据和右声道数据 这里hw_ptr是指针( 更新是指指针向后移) 2、怎么写驱动(s3c2440_dma.c(platform)) (1)负责数据传输的是平台部分里面
[单片机]
ALSA声卡10_从零编写之数据传输_学习笔记
S3C2440内存情况在NAND FLASH或者NOR FLASH启动的情况下
1,从NANDFLASH启动时,在ARM上电时,ARM会自动把NANDFLASH前4K的内容拷贝到S3C2440内部SRAM中,同时把SRAM的地址映射到0X00000000。ARM上电后会从SRAM处开始运行。 2,从NOR FLASH启动时,因为NORFLASH接在bank0。地址映射是0X00000000。所以ARM上电后直接运行NORFLASH里的程序。此时S3C2440内部SRAM地址为0X40000000。 3,ARM上电启动都是从0X00000000开始运行。但是对于复位程序入口,ResetEntry的值在ARM上电运行时是0X00000000,在JTAG仿真时是0X30000000。这个值很关键,在拷贝程序
[单片机]
<font color='red'>S3C2440</font>的<font color='red'>内存</font>情况在NAND FLASH或者NOR FLASH启动的情况下
移植Qt图形界面应用程序到S3C2440 arm开发板
1.进入qt已经写好的一个图形界面应用程序目录里,例如,我的应用程序目录是在/home/czd/qt_project/mp3player/ $ cd /home/czd/qt_project/mp3player/ 发现里面有个mp3player.pro文件 我们在上面已配置好的qt-embedded-linux环境下,编译后自动在/usr/local/目录下生成咯一个Trolltech目录,Trolltech/QtEmbedded-4.5.0-arm/bin/下可以看到qmake这个编译,在/home/czd/qt_project/mp3player/目录下执行下句: $/usr/local/Trolltech/QtEmbedde
[单片机]
s3c2440裸机-内存控制器(一、内存控制器的原理)
1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nand控制器等... 1.不同类型的控制器: (1)GPIO控制器属于门电路,不涉及到时序,相对简单。 (2)串口控制器属于协议类接口,类似的协议类接口还有iic、iis、spi等。 (3)前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部设备,仅仅只是将地址写入到相应的控制器。 接下来的内存类接口,会把地址输出到外部,cpu将地址写入内存控制器,内存控制器还需访问外部设备,比如NorFlash、网卡、SDRAM。 2.
[单片机]
<font color='red'>s3c2440</font>裸机-<font color='red'>内存</font>控制器(一、<font color='red'>内存</font>控制器的原理)
SCL程序: 检测存储区的填充量示例介绍
检测存储区的填充量 下图显示的系统中包含两条传送带和一个临时存储区,临时存储区位于两条传送带之间。传送带 1 将包裹传送到该存储区。传送带 1 末端靠近存储区的光电屏蔽,负责检测传送到存储区的包裹数量。 传送带 2 将包裹从临时存储区域传输到装载台,包裹将在此装载到卡车上。存储区出口处的光电屏蔽,负责检测离开存储区传入装载台的包裹数量。五个指示灯用于指示临时存储区的容量。 实施 下表列出了所用变量的定义: 名称 声明 数据类型 说明 PEB1 Input BOOL 光电屏蔽 1 PEB2 Input BOOL 光电屏蔽 2 RESET Input BOOL 复位计数器 LOAD Input BOOL 将当前计数器
[嵌入式]
SCL程序: 检测<font color='red'>存储</font>区的填充量示例介绍
s3c2440裸机-异常中断(二. und未定义指令异常)
1._und(未定义指令异常)介绍 我们之前分析过5种异常,那么如何进入未定义指令异常,当然是cpu读取指令发生异常,出现了指令解析异常。 我们先来看下当cpu解析到什么样的指令才会触发未定义指令异常呢? 从上面的arm指令格式中可知,只要指令码属于划线的格式,就属于未定义指令异常。 2.汇编向c函数传参 我们知道汇编给C语言函数传参是通过r0,r1,...通过堆栈的方式去传递的参数,比如r0=1, r1=2;那么在被调用的c函数中argv0就是r0, argv1就是r1...,那么我们如果通过汇编给C函数传递字符串呢? 我们可以通过这样声明und_string为一个字符串: und_string: .string unde
[单片机]
<font color='red'>s3c2440</font>裸机-异常中断(二. und未定义指令异常)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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