文章目录

  • 一.内存接口的概念
  • 二.存储控制器(内存控制器)
    • 2.1 什么是存储控制器?
    • 2.2 S3C2440存储控制器介绍
    • 2.3 存储控制器如何处理不同位宽的外设
    • 2.4 怎么确定芯片的访问地址?
  • 三.时序问题

一.内存接口的概念

S3C2440是SOC,所以会有很多外设,一般驱动外设的方法可以分为:

  • 通过CPU访问相应的的寄存器,然后通过控制器驱动外设
  • CPU直接访问外设地址,驱动外设

后一种访问方式是CPU直接对内存地址的访问,即通过内存接口访问外设,CPU通过片选线选定外设,通过地址线先选定地址,通过数据线进行控制。

我们称这种外设为内存类设备,通常有:NOR FLASH、网卡、SDRAM……

那CPU是如何通过这些总线来驱动内存类设备呢?这就涉及到存储控制器了,下面就来介绍一下存储控制器的原理。

二.存储控制器(内存控制器)

2.1 什么是存储控制器?

存储控制器是按照一定的时序规则对存储器的访问进行必要控制的设备,包括地址信号、数据信号以及各种命令信号的控制,使主设备(访问存储器的设备)能够根据自己的要求使用存储器上的存储资源

存储控制器可以看作CPU与内存之间沟通的桥梁,CPU通过存储控制器来访问内存,比如GPIO、UART、IIC、SDRAM……都属于CPU的统一编址,地址都是CPU统一编排的(NAND FLASH不属于),所以CPU就可以通过存储控制器来访问这些外设的地址。

2.2 S3C2440存储控制器介绍

下面是S3C2440的存储控制器介绍:

其中主要的信息为:

  • 总共1GB的内存,分为8BANK,每个BANK的地址大小为128MB
  • BANK的位宽是可编程的
  • BANK0~BANK7的起始地址是固定的

此外,为了访问这1GB的空间,存储控制器引出了27根地址线ADDR0~ADDR27,这时候我们算一下:2^27=128M,这明明是一个BANK的空间呀,怎么可以访问8个BANK的空间呢?

其实还有8根片选线nGCS0~nGCS7,用来选择某一块BANK,就是8个BANK将1GB空间划分为8块128MB大小的空间,当访问某一块范围内的地址时,将此块的片选信号拉低就可以,这8个BANK的地址空间如下:

注意:S3C2440是32位CPU,理论上可使用的地址大小为4GB,除了上面这由于连接外设的1GB外,还有一部分空间是CPU内部寄存器使用了,剩下的地址空间没有使用。

2.3 存储控制器如何处理不同位宽的外设

有的外设位宽是8bit,有的是16bit,有的是32bit,当CPU访问这些外设的内存空间时,那要怎么办?要分情况来吗?

不需要,因为有存储控制器!CPU只需要向存储控制器提供地址,由存储控制器来解决不同位宽的问题。

以ROM为例:CPU想读取ROM中的某块地址中的数据,可ROM的位宽有8bit、16bit、32bit

下面对比一下三种位宽情况下ROM与存储控制器的接线情况:

8bit:

16bit:

32bit:

区别就是地址线的接法,8bit位宽是相对应的A0对A0;16bit位宽是从A1开始对齐的;32bit位宽是从A2开始对齐的,这是因为不同位宽的ROM内部构造不相同。

ROM的内部构造:

8bit带宽:每个地址的空间大小是8bit(1Byte);

16bit带宽:每个地址的空间大小是16bit(2Byte);

32bit带宽:每个地址的空间大小是32bit(4Byte);

表面上看到A0、A1没用到,实际上是起了别的作用:

8bit:内存控制器A0对应ROM的A0

16bit:内存控制器A1对应ROM的A0,内存控制器A0用来确定16bit(2Byte)中的哪一Byte

32bit:内存控制器A2对应ROM的A0,内存控制器A1A0用来确定32bit(4Byte)中的哪一Byte

实际上这些地址线都是有用的!!!

下面通过俩个例子来说明CPU在对不同位宽ROM读取数据时的差异。

例一:

#读取地址3的一个字节数据到R1寄存器
MOV Ro ,#3
LDRB R1, [R0]

读地址3的一个字节(LDRB 代表读取一个字节),CPU会将地址3发送给ROM(通过内存控制器),此时A2A1A0对应:011

8bitROM:A0对应A0,直接取出第三个数据,1Byte

16bitROM:A1对应A0,取出第一个数据,2Byte(一个地址16bit)

32bitROM:A2对应A0,取出第0个数据,4Byte(一个地址32bit)

取出的数据中 包含有我们想要的数据,由内存控制器筛选我们所需要的数据。

过程:CPU发出地址,ROM通过存储控制器收到地址,ROM返回数据给存储控制器,存储控制器筛选所需要的数据,存储控制器返回有用数据给CPU。

存储控制器操作16bit、32bit时会根据A0、A1的信息筛选出所需数据给CPU。

例二:

#从地址4开始读取32bit数据(4Byte)
mov R0, #4
LDR R1, [R0]

CPU去地址4开始读取4Byte数据(32位ARM),地址是以Byte为单位的,地址4就是第四个Byte,此时A2A1A0对应:100

8bit:发送四次地址给ROM,每次得到一个ROM返回的字节(8bit),内存控制器整合4Byte数据

16bit:发送俩次地址给ROM,每次得到俩个ROM返回的字节(16bit),内存控制器整合得到4Byte数据

32bit:发送一次地址给ROM,ROM返回四个字节(32bit),正好是地址4开始的4Byte数据

过程:CPU发出地址给内存控制器,内存控制器收到地址转发给ROM,ROM返回数据,内存控制器组装数据后返回CPU。

2.4 怎么确定芯片的访问地址?

第一步:根据片选信号确定基地址(每个片选线确定的地址块有128MB)

第二步:根据芯片所接地址线确定范围(27根地址线)

比如:Nor FLASH

片选线0,基地址0X0000_0000,因为这个NOR FLASH是16位的,所以内存控制器的LADDR1接A0,LADDR0用来选择低八位还是高八位。

用到A0~A20总共21条地址线,所以NOR FLASH地址范围是:基地址+地址线确定的范围

即:0X0000_0000~0X001f_ffff 2^21=2M空间。

比如:网卡NET

基地址是nGCS4:0X2000_0000 内存控制器的地址线只接了LADDR2,16位数据线,意味着LADDR0也用到了。

网卡的地址范围:基地址+0b000~基地址+0b101 (LADDR1的位置无所谓)即:0X2000_0000~0X2000_0005

访问这些地址就可以访问到DM9000网卡

比如:SDRAM

SDRAM输出是32位,所以LADDR0、LADDR1已经包含了,加上LADDR2~LADDR14、LADDR24、LADDR25总共17条地址线,2^17=128k ,然鹅SDRAM是64M的,实际上是行地址和列地址。(这个问题会在下篇博客中细细分析)

三.时序问题

以NOR FLASH读时序为例:

内存控制器与NOR FLASH有地址线LADDRx、数据线LDATAx、片选信号nGCS0、读信号LnOE、写信号LnWE

这些信号控制线协调工作。

下面是芯片手册中存储控制器对芯片读数据时的时序图:

各个信号的持续时间根据外设芯片的性能有差异,可以根据具体芯片的手册进行设置,比如NOR FLASH:

(读时序)

对照AC特性:

然后就是配置各个信号线的时序:

可以看出,Taa=70ns时,同时发出保证了片选线、读信号线、地址线的时序,可以得到有效的数据

设置寄存器:


板子默认是14clocks,上电时,HCLK默认晶振12MHz,此时的Tacc=1166ns,相当于牺牲了性能来满足各种NOR FLASH。

我们配置当HCLK=100MHz时,1clock=10ns 所以选择8clock:101。

按照寄存器直接配置就可以了,可以通过烧写NOR FLASH的速度来体现时序中Tacc的影响。

S3C2440—7.存储控制器访问外设相关推荐

  1. S3C2440的存储控制器

    S3C2440存储控制器特性: 1>.  s3c2440的存储器控制器为访问外部存储的需要提供了控制信号 (27位地址信号.32位数据信号.8个片选信号.以及读/写控制信号等) 查 S3C244 ...

  2. (嵌入式)关于arm中的存储控制器

    /// 预备知识: 1.存储控制器概述 S3C2440存储控制器提供了访问外部存储设备所需的内存控制信号 .有以下特点: --支持小端/大端字节序(通过软件选择) --地址空间:每个BANK有128M ...

  3. s3c2440存储控制器和地址以及启动的理解

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来. NAND ...

  4. 存储控制器(SDRAM操作)

    什么是存储控制器 2440是32位单片机,进行数据访问时通过32位地址访问. CPU发出32位地址信号给存储控制器,存储控制器根据地址信号设置片选信号及地址总线,将相应数据通过数据总线传回存储控制器, ...

  5. 嵌入式开发笔记-存储控制器

    我是一个刚开始学习,嵌入式的小白,最近对协议接口和存储的控制器,有了小小的理解,首先第一点,程序是在存储控制器里面跑起来的,在驱动程里,对相关的驱动寄存器 进行赋值,调用相关的功能. 存储控制器基本理 ...

  6. 存储控制器_SDRAM详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是 SDRAM Synchronous Dynamic Random Access Memory: 同步动态随机存储器. ...

  7. DMA—直接存储区访问

    本章参考资料:< STM32F4xx 中文参考手册> DMA 控制器章节. 学习本章时,配合< STM32F4xx 中文参考手册> DMA 控制器章节一起阅读,效果会 更佳,特 ...

  8. 第21章 DMA—直接存储区访问

    本章参考资料:<STM32F76xxx参考手册>DMA控制器章节. 学习本章时,配合<STM32F76xxx参考手册>DMA控制器章节一起阅读,效果会更佳,特别是涉及到寄存器说 ...

  9. 《STM32从零开始学习历程》——DMA直接存储区访问实验例程

    <STM32从零开始学习历程>@EnzoReventon DMA-直接存储区访问实验例程 本章节为DMA直接存储区访问的实验例程讲解,以"正点原子"的例程为基础进行讲解 ...

最新文章

  1. java的query_Java-Query
  2. android tomtom gps location,TomTom智能地图修正 规避不能走的路
  3. linux 误删除mysql表能恢复吗,Linux误删数据恢复
  4. Redis高级特性介绍及实例分析
  5. 《RHEL6.3 FTP服务器虚拟用户的配置(含图)》——如此简单
  6. 排序系统 c语言程序设计,c语言程序设计(排序算法).doc
  7. mysql关键字及其用法_mysql的优化-explain
  8. 如何在云服务器上装系统吗,如何在云服务器上装系统吗
  9. BigInteger简单使用及方法总结
  10. 一步一步写一个简单通用的makefile(一)
  11. 华为hcna认证考完多久考hcip?华为认证的发展就业前景怎么样?
  12. 艾永亮:不做读书人生意的书店,如此不正经却年赚超12亿?
  13. 利用 eutils 实现自动下载序列文件(python实现)
  14. 关于修改ico图片位深度的方法
  15. 织梦网站数据入库接口(实现图片本地化,自动图片打水印)【原创】
  16. 爬杜蕾斯官方微博,内容太刺激了吧
  17. RabbitMQ 入门到应用 ( 六 ) 消息可靠性
  18. 第十一章 AWT编程
  19. 区块链时代,企业如何构筑竞争力的护城河?
  20. win7 如何设置快速启动栏

热门文章

  1. AXUBLOG 代码审计报告
  2. 适合用于听写的新型语音识别技术 可将单词错误率低于5%
  3. office__让word记录并显示修改标记及接受(去除)修改标记
  4. 亚马逊云科技云创计划携手 SegmentFault 思否,成就 AI 探路者
  5. 微信小程序访问WebService接口返回500错误解决过程
  6. RabbitMQ总结(一)--消息队列RabbitMQ应答模式(自动、手动)
  7. 2022-01-14:深度学习中关于显卡的设置
  8. delphi excel
  9. 2014蓝桥杯决赛试题及答案
  10. Python三大排序算法实现