历史上的今天
今天是: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条啊。
史海拾趣
|
LabVIEW测量信号时间间隔的实现 摘要 以两路信号为例, 详细阐述了以虚拟仪器方式, 针对不同种类的信号输入硬件板卡, 使用L abV IEW 软件平台实现信 号时间间隔测量的方法。详细解释了各种方法的特点、适用范围及具体实现。另外, 也根据具体的测 ...… 查看全部问答> |
|
大家好: 在我的程序里用了::TrackPopupMenu,程序编译通过了,但连接时又出现如下错误: error LNK2019: 无法解析的外部符号 TrackPopupMenu。 我在.cpp文件中已经#include ,TrackPopupMenu就在winuser.h里,为什 ...… 查看全部问答> |
|
具体点是 现在有多个数据过来 比如说 一号灯亮 二号等亮 三号灭 四号灭 这些是不同个信号源发送过来的 这些都是同时发送给51 能不能让51 同时记录下来 记录后打包做好标记 然后不同时刻发送出去 !! ...… 查看全部问答> |




