历史上的今天
返回首页

历史上的今天

今天是:2025年11月16日(星期日)

正在发生

2022年11月16日 | S3C2440内存组成

2022-11-16 来源:zhihu

大家好,我们这回来讨论下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条啊。


推荐阅读

史海拾趣

Einfochips公司的发展小趣事

随着硬件设计和验证领域的发展,SystemVerilog逐渐成为行业内的主流语言。Einfochips公司敏锐地捕捉到了这一趋势,并决定为客户提供从其他传统语言和环境转变到SystemVerilog的验证迁移服务。这一服务的推出,不仅帮助客户提高了设计和验证效率,还进一步扩大了Einfochips在硬件设计和验证领域的市场份额。

Catalyst / ON Semiconductor公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Catalyst / ON Semiconductor公司开始实施全球扩张战略。公司先后在多个国家和地区设立了分支机构和研发中心,以便更好地服务当地客户并吸引优秀人才。同时,公司还积极与其他知名企业进行战略合作,共同推动半导体技术的创新和应用。

ECLIPTEK公司的发展小趣事

随着公司规模的扩大和订单量的增加,ECLIPTEK面临着越来越大的供应链管理挑战。为了应对这些挑战,公司投入大量资源优化供应链管理,引入先进的供应链管理系统和自动化生产设备。通过提高生产效率和降低生产成本,ECLIPTEK成功地保持了其在市场上的竞争优势。

CANDD公司的发展小趣事

为了进一步提升品牌影响力和市场份额,CANDD公司开始实施国际化战略。公司首先在欧洲市场设立了分公司,并成功打开了欧洲市场的大门。随后,公司又进军亚洲市场,通过与当地企业的合作,逐渐在亚洲市场站稳了脚跟。随着国际化战略的深入实施,CANDD公司的品牌知名度和市场份额不断攀升。

Eby Electro Inc公司的发展小趣事

Eby Electro Inc公司的创始人李明,是一位对电子技术充满热情的工程师。在20世纪90年代初,他看到了电子行业的巨大潜力和未来发展趋势,于是决定创立自己的公司。起初,公司只有几名员工,主要业务是设计和制造电子零部件。李明凭借其过硬的技术能力和对市场的敏锐洞察,带领公司逐步打开了市场。他坚持质量第一的原则,赢得了客户的信任。随着业务的拓展,Eby Electro Inc逐渐在电子行业中崭露头角。

Conexcon Group公司的发展小趣事

在电子行业的发展过程中,环保问题日益受到关注。Conexcon Group积极响应国家环保政策,将绿色环保理念贯穿于产品研发、生产和销售的全过程。公司采用了环保材料和工艺,减少了对环境的污染和破坏。同时,公司还加强了废旧电子产品的回收和处理工作,推动了电子行业的可持续发展。这些举措不仅赢得了消费者的认可和支持,也为公司树立了良好的社会形象。

问答坊 | AI 解惑

c陷阱与缺陷

书中收集了c语言编程的几乎所有漏洞与缺陷。 这本书再版多少次了,几乎没有改版,经典!!! [ 本帖最后由 richiefang 于 2009-11-25 08:55 编辑 ]…

查看全部问答>

LabVIEW测量信号时间间隔的实现

LabVIEW测量信号时间间隔的实现 摘要 以两路信号为例, 详细阐述了以虚拟仪器方式, 针对不同种类的信号输入硬件板卡, 使用L abV IEW 软件平台实现信 号时间间隔测量的方法。详细解释了各种方法的特点、适用范围及具体实现。另外, 也根据具体的测 ...…

查看全部问答>

SD卡数据的读取

我想用FPGA来读取SD卡内的数据,那位大虾有现成的FPGA程序,共享一下!…

查看全部问答>

支持DirectShow的usb摄像头的接口是什么标准啊(不需要安装驱动)

如题:这种usb设备需要怎样通讯可让windows 自动识别为usb图像设备…

查看全部问答>

求助:关于无法解析的外部符号的错误

大家好:     在我的程序里用了::TrackPopupMenu,程序编译通过了,但连接时又出现如下错误: error LNK2019: 无法解析的外部符号 TrackPopupMenu。     我在.cpp文件中已经#include ,TrackPopupMenu就在winuser.h里,为什 ...…

查看全部问答>

由于快递没到所以团购活动的maple开发板延误了

由于快递没到所以团购的maple开发板延误了预计明天会到…

查看全部问答>

仿真器的问题

我用的是usb仿真器,以前一直好好的,可是昨天拆了一次后,系统突然提示为无法识别的usb设备,因此也无法安装驱动,请问有人遇到这样的问题吗?…

查看全部问答>

死区控制寄存器不起作用?

可能是载波频率过高,示波器扫描时间不足以观察脉冲边沿的变化。 上下桥臂驱动脉冲应该是互补,而且上下沿变化是错开的。…

查看全部问答>

如何让51 记录下很多数据??

具体点是  现在有多个数据过来 比如说 一号灯亮 二号等亮 三号灭 四号灭 这些是不同个信号源发送过来的 这些都是同时发送给51  能不能让51  同时记录下来  记录后打包做好标记 然后不同时刻发送出去 !! ...…

查看全部问答>

FPGA中PLL配置详细说明和使用

FPGA中PLL配置详细说明和使用(Quartus II)…

查看全部问答>