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

实验目的:
由于开发板(JZ2440 V3)上电后从Nand flash启动CPU时,CPU会通过内部的硬件将Nand flash的前4K数据复制到称为“Steppingstone”的4K内部SRAM中(起始地址为0),然后跳到地址0开始执行。
这个实验我们先用汇编语言设置好S3C2440芯片内部的存储控制器,使外接的SDRAM可以操作使用:然后把程序本身从“Steppingstone”(即芯片内部的4K SRAM)复制到SDRAM处,最后跳到SDRAM中执行。

知识预备:
存储控制器(memory controller):它为CPU提供了访问外部设备所需的信号,这是一种通过总线方式来访问拓展的外设,在嵌入式中,这些拓展的外设可能不仅仅是内存,也包括网卡、Nor flash、Nand flash等等。(这里我们可以把它想像成是CPU与拓展外设沟通的桥梁!)

S3C2440芯片对外引出了27根地址线ADDR0~ADDR26,那么它的访问范围即2^7*2^20=128MB。但是这个芯片可以达到1GB的访问空间,怎么达到的?因为CPU还对外引出了8根片选信号:nGCS0~nGCS7,对应于BANK0~BANK7。当访问BANKx的地址空间时,nGCSx引脚输出低电平用来选中外界的设备,故:这个芯片最多8个拓展外设,因为只有8个bank,想用相应的外设直接让相应的nGCSx输出低电平即可   ^~^   看来也不是很难,就是这么个理。

那么问题来了,如果我们想通过CPU访问一个芯片需要哪些条件呢?
1.地址线(我们需要知道芯片的访问地址)
2.数据线(我们需要知道一次传输多少数据,8bit/16bit/32bit 即我们常说的数据宽度)
3.时钟/频率(我们需要CPU与外设约定好传输的速率,不能太快,不能太慢,必须能满足双方的要求)
4.芯片相关的一些要求(比如说我们这里是访问SDRAM,那么就得知道它的行地址,列地址,哪个l_bank,这样我们就可以具体确定访问芯片的哪个存储单元了)

现在我们实验的是通过CPU访问SDRAM,那么我们就大概的想象一下,我们可以大致的分为4个步骤:
①CPU发出的片选信号nGCS6有效,它选中SDRAM芯片。(从V3原理图可得)
②SDRAM中有4个L-Bank,需要两根地址信号线选中哪一个L-Bank。(从V3原理图我们可以知道 CPU的ADDR24、ADDR25作为L-Bank的选择信号)
③对SDRAM进行统一的 行/列 寻址。(这样我们就可以确定具体访问芯片内部哪一个存储单元了)
④找到存储单元后,就要对SDRAM进行数据传输了。(这里我们就需要知道数据宽度等等)


如果你开始没有了解过SDRAM,也许上面这四个步骤你有些不大明白,没关系啊,现在我就来穿插一下,大概的说一下这个SDRAM内部的存储结构到底是个什么鬼:

(这里你可以先天马行空一下,你眼前现在应该浮现出一个长方体的蛋糕,然后你拿刀切切切,切成四块,一块你给它想成是一个面,然后一个面你就给它看成是Excel表格)

(嵌入式)关于arm中的存储控制器(一)_第1张图片(嵌入式)关于arm中的存储控制器(一)_第2张图片

SDRAM的内部是一个个存储阵列,阵列就如同表格一样,将数据“填”进去。和表格的检索原理一样,先指定一个行(Row)和一个列(Column),就可以准确的找到所需要的单元格,这就是SDRAM寻址的基本原理,这个单元格被称为存储单元,这个表格(存储阵列)就是逻辑Bank(Logical Bank,简称L-Bank)。SDRAM一般分为4个L-Bank。PS:这回上面的那4个步骤你就应该明白了,接下来我们就看看具体怎么操作。

对于①,我就不废话了。
对于②,[ADDR25:ADDR24]=0b00/0b01/0b10/0b11,就正好对应四个L-Bank了。
对于③,(这个我们就得SDRAM的芯片手册和原理图结合看一下了)根据SDRAM的列地址线数目设置CPU相关的寄存器后,CPU就会从32位的地址中自动分出L-Bank选择信号、行地址信号、列地址信号,然后先后
发出行地址信号,列地址信号。L-Bank选择信号在发出行地址信号的同时发出,并维持到列地址信号结束。
在我们这个实验中,行地址、列地址共用ADDR2~ADDR14,然后使用nSRAS、nSCAS来区分它们(Bank6的位宽是32,也就是CPU访问SDRAM,一次访问4个字节。而CPU的单位是Byte,eg:CPU内存地址0x00000000、0x00000001、0x00000002、0x00000003其实访问的都是SDRAM的0x00000000,即CPU真正有效的地址位是从ADDR2开始的,所以ADDR0和ADDR1没用)。
通过原理图我们可以看出,这个开发板的两根地址线ADDR24、ADDR25作为L-Bank的选择信号,行地址数为13,列地址数为9。当nSRAS信号有效时,ADDR2~ADDR14发出的是行地址信号,它对应32bit地址空间的

bit[23:11]。当nSCAS信号有效时,ADDR2~ADDR14发出的是列地址信号,它对应32bit地址空间的bit[10:2]。ADDR0、ADDR1恒为0,不参与译码。

                                                                        这个图是SDRAM芯片手册上的

(嵌入式)关于arm中的存储控制器(一)_第3张图片

所以此时访问SDRAM的内存地址范围为 0x30000000~0x30000000+0x03FFFFFF 即 0x30000000~0x33FFFFFF。

共64MB。为什么是64MB? (2^13*2^9*4)*32bit/8 = 2^26 Byte=64MB

对于④,看开发板原理图可以得到,我们使用了俩片16位的SDRAM芯片并联组成32位的位宽,与CPU的32根数据线(DATA0~DATA31)相连。

(嵌入式)关于arm中的存储控制器(一)_第4张图片

完成这个实验的预备知识就还剩最后一个问题了,大家想一下,我们通过CPU访问SDRAM,上面我们已经把关于SDRAM部分的操作说完了,接下来自然而然就剩下那个“桥梁”————配置CPU内部的存储控制器。

怎么配置?很简单,就是往一堆寄存器里写我们需要的配置就好。而通过S3C2440芯片手册我们可以了解到,CPU内部存储控制器相关寄存器地址为0x48000000~0x48000030(一共13个)。

接下来就是讲我们这个实验里需要用到的寄存器以及相关配置了:
嗯哦哼  哼哦啊  啊哈吼……………………想了想,相应寄存器我也要详细了解了解,仔细的学习学习。所以我就单另放在我的下一篇博客了。

仁者见仁,智者见智。同一个问题不同的人就会有不同的看法,适合自己的就是最好的 !


你可能感兴趣的:(ARM汇编)