【说明】
前面我们介绍了地址相关的一些概念以及地址无关码的概念,我们知道了,当程序超过了8KB的时候,我们得把程序复制到DDR中运行,但是,DDR要使用是要先初始化的。6410带有DRAM控制器,它在初始化之后可以让我们对DDR的访问变得十分方便。。。这里我们要初始化2个东西,也就是DRAM控制器,以及DDR本身。在这之前,大家如果对于DDR参数不太熟悉,可以看看这篇文章哦!http://hard.zol.com.cn/2004/0330/90618.shtml
【怎么初始化】
在S3C6410芯片手册中,第5章开头直接给出了初始化DRAM控制器和初始化DDR的步骤!!一步一步来绝对没错的!,先从DRAM控制器开始。
【初始化DRAM控制器】
直接上芯片手册中的初始化顺序图,然后一步一步介绍
1】进入配置状态
它说往某某寄存器写入100(二进制),那我们就得先看看这寄存器是干什么的。。
哦!原来就这3位是有用的!二话不说,第一步理解了。
2】配置时序
1)刷新周期
这一步十分关键,我们要告诉控制器我们使用的DDR的一些参数。如果参数设置不对,控制器按这参数来操作DDR肯定是不对的。
一路找下面,我们发现在一堆配置寄存器后面出现了一个刷新周期寄存器
什么是刷新周期呢? 其实我们DDR并不能一直保持数据,它需要每隔一段时间充一下电来维持数据。这个间隔就是刷新周期。
那我怎么知道刷新周期是多少呢?
不同DDR不一样 所以要看DDR的手册。。一般DDR手册开头就有介绍,比如我的手册《K4X1G163PC - L(F)E/G》
那我们如何设置才能得到7.8us的刷新周期呢?还记得我们的时钟初始化吗,HCLK我们初始化成133MHZ,而DDR用的就是这个时钟,我们来算一下
一秒钟是133MHZ那一个时钟周期就是1 / (133 * 10^6) 秒,也就是1 / 133 us,那我们需要7.8us就是7.8 /(1 / 133) 个周期啦哈哈
代码中用纳秒,原理一样
2)延迟寄存器
就在刷新周期寄存器下边我们又看到一个CAS,延迟寄存器。
这个又是干什么的呢?CAS就是指当发出写命令后要延迟多少周期再去读取数据,从第0位我们默认为0,而【1:3】 我们就要看DDR手册了。
,还想什么,它叫我们写成3!
3)其他参数
和上边一样,一路配置下来,只要看到什么参数,就把参数的名字往DDR手册里一复制查找,,里边写什么你就配置成什么就可以啦,没有的就无视咯
3】属性设置
这一步需要配置这个寄存器
1)设置列地址数,
2)设置行地址
那我怎么知道列地址数呢,,看DDR的手册!看到这里了,明显了吧!
3)设置自动预充电地址
一看就知道又要看DDR手册。。。。在这里看到没,,A10!!!!!!
4)设置内存突发长度
在DDR手册中有这么些值,,都可以取的
4】依旧是属性设置
因为内存比较复杂,所以用一个32位的寄存器去设置不够,所以还有个寄存器也要设置,看名字就知道和刚才寄存器是兄弟了
1)设置存储长度
6410是32位机器,所以就是01了
2)设置DDR类型
可别告诉我你找不到你的是哪种DDR。。。。。。。。看DDR芯片手册的最大的标题
4】设置芯片
1)设置地址组织方式:
DDR芯片手册上哪里有说明呢?其实这张图我们见过的,如下,显然是BRC模式,也就是1
【初始化DDR自身】
其实现在DDR控制器就可以往DDR发东西了,但是根据手册上的说明,其实DDR控制器还没有设置好,只不过在设置DDR控制器的中间是要先初始化一下DDR自身的,所以在这里我们就来初始化DDR,初始化好了之后,我们再继续初始化DDR控制器剩下的部分内容。
S3C6410手册上给出了初始化DDR的办法!!,一目了然,我的是DDR所以选这个
1】寄存器
就是一次又一次往下面这个寄存器写数据就可以啦,,上边叫我们写什么我们就写什么咯哈哈!
【继续DDR控制器】
1】设置就绪
现在什么都配置好了,就直接把状态寄存器配置成"REDAY“
2】查询是否就绪
现在就等待它就绪就可以了
查看最低2位,知道变为01