历史上的今天
返回首页

历史上的今天

今天是:2025年04月27日(星期日)

正在发生

2019年04月27日 | ARM7存储器结构及外扩flash

2019-04-27 来源:eefocus

一.存储器的字与半字


1.从偶数地址开始的连续的两个字节构成一个半字。


2.能被4整除的地址的连续4个字阶构成一个字


ARM指令的长度刚好是一个字,Thumb指令的长度刚好是一个半字


二.存储器的存储方式(半字对齐,字对齐)


1.半字对齐:存放一个数据的地址如果能被二整除,则它是半字对齐。反之,则是非半字对齐。


2.字对齐:存放一个数据的地址如果能被四整除,则它是字对齐。否则,它是非字对齐。


        ARM7的S3C44B0内部没有RAM和ROM,只有一个8KB的Cache(其实质是用SRAM组成的一种高速缓冲存储器),未用的Cache空间可以用作0KB/4KB/8KB的SRAM空间。


        S3C44B0内存为256MB,分为8个BANK,每个32MB,25根地址线,ADDR[24..0],寻址范围是2^25,即32MB,这就是每个bank32MB的由来。然后他还另外有8个选通信号,就是分别选择8个bank的,nGCS[7..0],那么一共就是32MB * 8个bank = 256MB,或者你可以认为这8根选通线是由更高位地址ADDR[27..25]经过74HC138做3-8线译码得到的,那么一共有28根地址线(低25位引出来了,高3位做译码去了)寻址2^28 = 256MB。


        每个BANK的32MB是固定的,即32M*8bit,若是采用16位存储器,则最多可寻址16M*16bit,也可以在1个BANK的32MB中只放2MB的存储器,若采用16位存储器,则寻址1M*16bit。


        flash连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH (A0-A19),处理器的地址线要(A1-A20)左移偏1位。为什么要偏1位?


        从软件和CPU的角度而言,一个地址对应一个字节,就是8位数据。这是肯定的,不要怀疑这点。


        对于具体器件而言,它的位宽是一定的,所谓位宽,指的是“读/写操作时,最小的数据单元”──别说最小单元是“位”,一般设备上没有单独的“位操作”,修改位时通过把整个字节、字或双字读出来、修改,再回写。


        CPU的地址线(A0-A20)对应的最小数据单元是字节,即8位;而位宽为16的NOR FLASH的地址线(A0-A19)对应的最小数据单元是16位。这两个怎么对应起来?


        如果说外设的位宽是16,难道我们写程序时会“特意”以16位进行操作吗?不用的,我们写程序时根本不用管外设位宽是8、16还是32。


        仔细想想,其实是可以想通的:既然CPU、外设NOR FLASH的最小读/写单元已经固定,那么肯定就是CPU与NOR FLASH之间有个中间层,它来做处理:这个中间层被称为“Memory Controller”,CPU要进行读写操作时,“Memory Controller”根据NOR FLASH的位宽,每次总是读/写16位数据。


以读操作为例:

CPU想进行8位操作时,它选择其中的8位返回给CPU;

CPU想进行16位操作时,它直接把这16位数据返回给CPU;

CPU想进行32位操作时,它发起2次读/写,把结果组合成32位返回给CPU。


         现在的连线是:CPU的(A1-A20)接到 16位的NOR FLASH (A0-A19),即CPU的A0不接──这说明:不管A0是0还是1,NOR FLASH接收到的地址是一样的。CPU发出地址0bxxxxxxxxx0、0bxxxxxxxxx1时,NOR FLASH看到的都是0bxxxxxxxxx,返回给“Memory Controller”的都是同一个16位数据。再由“Memory Controller”选择其中的低8位或高8位给CPU。“Memory Controller”会帮助我们做这些事情,举例为证:


1. 软件要读取地址0上的8位数据时,硬件是这样进行的:

  ① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000

  ② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元” 

  ③ “Memory Controller”读入这个16位数据

  ④ “Memory Controller”把这个16位数据的低8位返回给CPU,这就是一个8位数据。


2. 软件要读取地址1上的8位数据时,硬件是这样进行的:

  ① “Memory Controller”发出0b000000000000000000001的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000

  ② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元” 

  ③ “Memory Controller”读入这个16位数据

  ④ “Memory Controller”把这个16位数据的高8位(注意,前面的低8位)返回给CPU,这就是一个8位数据。


3. 软件要读取地址2上的8位数据时,硬件是这样进行的:

  ① “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001

  ② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元” 

  ③ “Memory Controller”读入这个16位数据

  ④ “Memory Controller”把这个16位数据的低8位返回给CPU,这就是一个8位数据。


4. 软件要读取地址3上的8位数据时,硬件是这样进行的:

  ① “Memory Controller”发出0b000000000000000000011的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001

  ② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元” 

  ③ “Memory Controller”读入这个16位数据

  ④ “Memory Controller”把这个16位数据的高8位(注意,第3点是低8位)返回给CPU,这就是一个8位数据。


5. 软件要读取地址0和1上的16位数据时,硬件是这样进行的:

  ① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000

  ② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元” 

  ③ “Memory Controller”读入这个16位数据

  ④ “Memory Controller”把这个16位数据返回给CPU


6. 软件要读取地址2和3上的16位数据时,硬件是这样进行的:

  ① “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001

  ② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元” 

  ③ “Memory Controller”读入这个16位数据

  ④ “Memory Controller”把这个16位数据返回给CPU


7. 软件要读取地址0、1、2、3上的32位数据时,硬件是这样进行的:

  ① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000

  ② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元” 

  ③ “Memory Controller”读入这个16位数据

  ④ “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001

  ⑤ NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元” 

  ⑥ “Memory Controller”读入这个16位数据

  ⑦ “Memory Controller”把两个16位的数据组合成一个32位的数据,返回给CPU。

  

从1~7可知:

  ① 对于软件而言,它不知道底下发生了什么事,它只管结果:

      读取地址0的8位数据,就得到了一个8位数据;读取地址1的8位数据,就得到另一个紧挨着的8位数据

      读取地址0开始的16位数据,就得到了一个16位数据;读取地址2开始的16位数据,就得到另一个紧挨着的16位数据

      读取地址0开始的32位数据,就得到了一个32位数据;读取地址4开始的32位数据,就得到另一个紧挨着的32位数据


  ② 对于NOR FLASH,它只按照A0-A19地址线,提供16位数据,才不管软件要的是8位、16位,还是32位呢。


  ③ “Memory Controller”完成了这些位宽之间的数据选择、合并。


所以:


外设位宽是8时,CPU的A0~AXX与外设的A0~AXX直接相连


外设位宽是16时,CPU的A1~AXX与外设的A0~AYY直接相连,表示不管CPU的A0是0还是1,外设看到的都是同一个地址,对应16位的数,“Memory Controller”对数据进行选择或组合,再提供给CPU。


外设位宽是32时,CPU的A2~AXX与外设的A0~AZZ直接相连,表示不管CPU的A0A1是00,01,10还是11,外设看到的都是同一个地址,对应32位的数据,“Memory Controller”对数据进行选择或组合,再提供给CPU。




        ARM7在使用BANK之前要设置每个BANK所接的外设时多少位的,由BWSCON寄存器设置,默认情况为8位。由于BANK0位启动区,所以有硬件指示,通过读OM[1:0]引脚来设置。


当宽度为8位的时候,"Memory Controller"硬件是这样做的:(不错位连接)

(1)CPU想进行8位操作时,直接根据软件所给出的地址读取8位数据返回给CPU。

(2)CPU想进行16位操作时,进行两次8位的操作,并组成一个16位的数据返回给CPU。

(3)CPU想进行32位操作时,进行四次8位的操作,并组成一个32位的数据返回给CPU。



当宽度为16位的时候,"Memory Controller"硬件是这样做的:(错一位连接)

(1)CPU想进行8位操作时,直接根据软件所给出的地址读取16位数据,并将低8位返回给CPU。

(2)CPU想进行16位操作时,直接根据软件所给出的地址读取16位数据返回给CPU。

(3)CPU想进行32位操作时,进行2次8位的操作,并组成一个32位的数据返回给CPU。


当宽度为32位的时候,"Memory Controller"硬件是这样做的:(错两位连接)

(1)CPU想进行8位操作时,直接根据软件所给出的地址读取32位数据,并将低8位返回给CPU。

(2)CPU想进行16位操作时,直接根据软件所给出的地址读取32位数据,并将低16位返回给CPU。

(3)CPU想进行32位操作时,直接根据软件所给出的地址读取32位数据返回给CPU。


推荐阅读

史海拾趣

Barry Industries Inc公司的发展小趣事

Barry Industries Inc在创业初期面临资金短缺、技术壁垒和市场竞争激烈等诸多挑战。然而,公司创始人凭借对电子行业的深厚理解和对市场需求的敏锐洞察,坚信公司的微波半导体封装技术具有巨大潜力。在创始团队的坚持与努力下,公司逐渐克服了初期的困难,逐步在市场上建立了自己的地位。

飞翼科技(FEIYI)公司的发展小趣事

Barry Industries Inc深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,公司还注重品牌建设,通过提升产品形象和服务水平,逐渐树立了良好的品牌形象。

EDSYN公司的发展小趣事

Econais公司自创立之初,就致力于研发超低功耗(ULP)的无线模块。随着物联网(IoT)和机器对机器(M2M)通信技术的兴起,市场对低功耗嵌入式模块的需求日益增长。Econais工程师团队凭借几十年的行业经验,成功研发出了一系列超低功耗Wi-Fi模块,这些模块不仅性能卓越,而且易于集成,为各种物联网应用提供了强大的技术支持。

AEMC Instruments公司的发展小趣事

AEMC Instruments公司成立于1976年,隶属于Chauvin Arnoux集团。这个新成立的公司在电子行业中崭露头角,凭借其在电气测试和测量领域的专业知识和技术,迅速获得了市场的认可。初创时期,AEMC Instruments公司以研发和生产电流测量探头、电能质量分析仪等核心产品为主,这些产品凭借其准确性和稳定性,为公司的快速发展奠定了坚实的基础。

CalAmp公司的发展小趣事

在物联网领域,安全问题一直是业界关注的焦点。某年,CalAmp公司运营的一台服务器因配置错误,导致黑客可以通过该漏洞接入账号数据,甚至接管相关车辆。这一事件引起了业界的广泛关注。面对这一挑战,CalAmp公司迅速采取行动,加强了对服务器的安全配置和监控,同时积极与安全专家合作,共同解决存在的安全问题。通过这一事件的应对和改进,CalAmp公司不仅提升了自身的安全防护能力,也为整个物联网行业树立了良好的安全榜样。

这些故事展示了CalAmp公司在电子行业中的发展历程和取得的成就。无论是通过签署全球分销协议拓展市场、推出创新的车队管理解决方案、发展新业务领域还是积极应对物联网安全挑战,CalAmp公司都展现出了其卓越的技术实力和市场竞争力。这些努力不仅推动了公司自身的持续发展,也为整个电子行业的进步做出了积极贡献。

福斯特半导体(Foster)公司的发展小趣事

在业务拓展方面,CalAmp公司始终保持着敏锐的市场洞察力。某年,公司成功推出了RFID动物溯源和共享单车智能等新业务。这些新业务不仅为公司带来了新的增长点,也进一步拓宽了其业务范围。虽然新产品线的毛利率较低,对公司的整体毛利率和净利率产生了一定影响,但公司通过优化成本结构和提升运营效率,逐步改善了这一状况。同时,公司与澳大利亚利德品有限公司签订的品牌授权及合作协议,也为公司未来的盈利能力提升奠定了基础。

问答坊 | AI 解惑

太阳跟踪电原理

本电路可用在太阳能热水器、太阳能电池等自动跟踪太阳地设备设施上。稍加改动可用于其他的跟踪。本电路是本人精心设计的,PCB和软件暂不上传。若用商业使用,请通知我。xliu001@163.com 否则,属于侵权。(在专利申请中) …

查看全部问答>

神奇的光圈

神奇的光圈                                                 Magic Laser aperture http://www.lotusinvention.c ...…

查看全部问答>

请教:串口,并口,USB,PCI 哪个的相应速度最快?谢谢!

请教: 我发送的数据量不是很大,需要的是响应速度快 如 PC 向单片机端发数据,希望 单片机端快速响应 单片机端向 PC 端发数据,PC 端快速响应 串口,并口,USB,PCI 哪种最好啊 USB 怎么样? 比串口快,还是慢呢? 稳定不? 谢谢!…

查看全部问答>

小人刚接到一个项目,做一个Vxwork的IO驱动,有几点不是很明白,那位大虾能给解释下,不胜感激

一直做Linux驱动,Vxwork也做过一点,但IO驱动一直不是很明白,最近接手一个日本的XXX(没记住名字...)芯片开发,要用Vxwork,而且芯片API很简单,这片子本来不适用Vxwork,但客户要求,没办法了。 芯片本身定义了一个SIO东东的,提供对应寄存器配 ...…

查看全部问答>

急:请问TLP627次级是否可以接24V直流呢,输入端TTL电平是否可以驱动

如题,因为需要控制24V直流考虑TLP627,负载大概1-5K,不知道是否可以实现 输入端想用TTL控制,电阻1.1K,不知道有没有大了 多谢啦…

查看全部问答>

[高手进来]C#调用vs2005 vc++ 智能设备编写的dll 出现的问题 急

vc++的“MFCDes.dll”导出函数 __declspec (dllexport)  bool DesGo(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = 0) 在c#中调用 DllImport(\"MFCDes.dll\", SetLastError = true)] public static exte ...…

查看全部问答>

求救:vxWorks启动盘的制作

各位大侠帮帮忙啊!     我把启动盘插入后,显示器上显示:v1.6+++++++++++++++。几行加号以后就停在那里不动了。     我的目标机处理器是p3的,网卡类型是Intel 8255x ethernet interface.     我猜可能是启动参 ...…

查看全部问答>

LM3S8962是否支持linux下gdb调试开发?

有没有人用过? 就是那个LM3S8962开发板.…

查看全部问答>

电子看门狗

本帖最后由 jameswangsynnex 于 2015-3-3 20:03 编辑 如图所示为电子看门狗电路。它具有普通狗看守家门的本领。每当有人进入大门内10米监视区域,它就会发出逼真的狗叫声。这种叫声能维持10秒钟,如果此人不离开,电子看门狗便会一直叫下去 …

查看全部问答>

干燥除尘设备加热预热高频机

目前,很多厂家在生产干燥设备、储热设备、预热设备、换热器等时,还多用传统加热方式。而无论你所选用的是油气加热、氧气乙炔加热、液化气加热,煤炭加热、电炉加热、电烘箱加热等方式。都比感应式加热技术耗能多、效率低,且有的还存在环保问题 ...…

查看全部问答>