内存初始化

这篇博客详细介绍了DDR内存的初始化过程,包括设置DRAM配置模式、配置内存时间参数、芯片配置等复杂步骤,涉及到多个寄存器的设置和计算,旨在帮助读者理解如何在嵌入式系统中初始化内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嗨,今天看内存初始化的内容,快看哭了T_T,问老师,老师不怎么回答,还是看一篇博文知道了不少

回头又增加了不少关于内存地知识。在我们的开发板里面都有地址空间,不同的地址空间区域对应着不同的功能,其中主存储区中有一部分(动态存储区)就是内存的地址(0x50000000)。
在OK6410里使用的是属于DRAM的DDR
对于内存的初始化,在芯片手册里有规定好的步骤,但是要实现起来却不太简单,它里面是这样写的
内存初始化
这里面的memc_cmd是内存命令寄存器
内存初始化
一. 设置DRAM到配置模式,也就是把memc_cmd的最低三位设成100(步骤里的参数可能会有错的,寄存器为准)
ldr r0, =0x7e001004
mov r1, #0x4
str r1, [r0]

二.配置内存里有关时间的参数,芯片配置,ID配置。这里简简单单写了一句,执行起来却有好多
先说有关内存时间的参数
刷新周期(DRAM内部都有小电容构成,要定时对电容充电)
内存初始化
但是这个周期又要到内存芯片里去找到对应的值
内存初始化
所以一般可以选取7.8us作周期,但是要转换成多少个时钟周期
公式(所要时间,单位ns)/(1000/133)+1
ldr r0, =0x7e001010 @refresh period register 
ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) ) @设置周期 
str r1, [r0]


CAS潜伏期时间
内存初始化

这里[3:1]设置成011就可以了,[0]不变,所以是0x6
ldr r0, =0x7e001014 @CAS latency set 3 
mov r1, #0x6 
str r1, [r0]


DQSS
内存初始化

不用变,设为1就可以了
ldr r0, =0x7e001018 @set DQSS 1 range from 0.75 to 1.25 
  mov r1, #0x1 
  str r1, [r0]

MRD
内存初始化
照表格0x2
ldr r0, =0x7e00101c @set MRD 2 only 2 
  mov r1, #0x2 
str r1, [r0]


RAS
内存初始化

这里要去看一下内存芯片手册了
KKK
内存初始化KKK

这张图之后还有许多用到,图中设置RAS位45us,用公式
ldr r0, =0x7e001020 @set RAS 45us 
ldr r1, =(45/(1000/133)+1) 
  str r1, [r0]


RC
内存初始化看图kkk,得可以用68us,用公式
    ldr r0, =0x7e001024   @set RC 68us
    ldr r1, =(68/(1000/133)+1)
    str r1, [r0]


RCD
内存初始化
看KKK,用23us,用公式
ldr r0, =0x7e001028 @set DRC 23us 
  ldr r1, =(23/(1000/133)+1) 
str r1, [r0]


RFC
内存初始化这里看芯片手册另一个地方
ppp
内存初始化
ppp
这里用80us,用公式
    ldr r0, =0x7e00102c   @set RFC 80us
    ldr r1, =(80/(1000/133)+1)
    str r1, [r0]

RP
内存初始化

内存初始化
看图kkk,用23us,公式
ldr r0, =0x7e001030   @set RP 23us
    ldr r1, =(23/(1000/133)+1)
    str r1, [r0]

RRD
内存初始化
看kkk,用15us,公式
ldr r0, =0x7e001034   @set RRD 15us
    ldr r1, =(15/(1000/133)+1)
    str r1, [r0]


WR
内存初始化
kkk,15us
ldr r0, =0x7e001038   @set WR 15us
    ldr r1, =(15/(1000/133)+1)
    str r1, [r0]



WTR,XP
这两个不太清楚为什么。但参考是这么设置的。
ldr r0, =0x7e00103c    
    mov r1, #0x07
    str r1, [r0]

    ldr r0, =0x7e001040    
    mov r1, #0x02
    str r1, [r0]

XSR
内存初始化
看ppp,120us
ldr r0, =0x7e001044   @set XSR 120us
    ldr r1, =(120/(1000/133)+1)
    str r1, [r0]


ESR
内存初始化
这里查看self refresh,同样用120us
    ldr r0, =0x7e001048   @set ESR 120us
    ldr r1, =(120/(1000/133)+1)
    str r1, [r0]

再来配置芯片配置

内存初始化
内存初始化

设16 4 1 0位为1,除最后3位,其余按默认
ldr r0, =0x7e00100c   @memory configuration
    ldr r1, =0x00010012   @set bit 16 4 1 0
    str r1, [r0]

MEMORY CONFIGURATION 2
内存初始化
因为外界两片16位内存芯片,所以[7:6]选01(32位),[3]选0
ldr r0, =0x7e00104c   @memory configuration2
    ldr r1, =0x0b45   @set bit just follow the table in the manual
    str r1, [r0]


CHIP_N_CFG
内存初始化
设置片选 bank-row内存地址50000000
ldr r0, =0x7e001200   @设置片选 bank-row内存地址50000000
    ldr r1, =0x150f8   @第8位用来屏蔽地址
    str r1, [r0]



USER_CONFIG
内存初始化
全按默认,使用最小延时
ldr r0, =0x7e001304   @全选0,使用最小延时
    mov r1, #0x0
    str r1, [r0]

这下,步骤2算是好了
三.跳过不做,一般稳定
四.Execute memory initialization sequence
内存初始化
这里的有些参数是错的,所以还是看寄存器direct_cmd的表格
内存初始化

先写出来
Prechargeall 0x0
Autorefresh 0x4000
Nop 0xc000
另外两个参考U-boot,不推
@issue NOP
ldr r0, =0x7e001008
ldr r1, =0xc0000
str r1, [r0]
@issue prechargeall
ldr r0, =0x7e001008
ldr r1, =0x0
str r1, [r0]
@issue autorefresh
ldr r0, =0x7e001008
ldr r1, =0x4000
str r1, [r0]
@issue autorefresh
ldr r0, =0x7e001008
ldr r1, =0x4000
str r1, [r0]
@issue mrs
ldr r0, =0x7e001008
ldr r1, =0x0a0000
str r1, [r0]
@issue mrs
ldr r0, =0x7e001008
ldr r1, =0x0800032
str r1, [r0]

五.使DRAM进入ready/go状态
ldr r0, =0x7e001004
mov r1, #0x0
str r1, [r0]



六,检测是否进入ready/go
check_ready:
ldr r0, =0x7e001000
ldr r1, [r0]
mov r2, #0x3
and r1,r1,r2
cmp r1, #0x1
bne check_ready




终于好了,贴上全部完整代码
.text
.global mem_init
mem_init:
@set data pin
ldr r0, =0x7e00f120
mov r1, #0x0
str r1, [r0]

ldr r0, =0x7e001004
mov r1, #0x4
str r1, [r0]


    ldr r0, =0x7e001010   @refresh period register
    ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) )       @设置周期
    str r1, [r0]

    ldr r0, =0x7e001014 @CAS latency   set 3 
    mov r1, #0x6
    str r1, [r0]

    ldr r0, =0x7e001018   @set DQSS 1   range from 0.75 to 1.25
    mov r1, #0x1
    str r1, [r0]

    ldr r0, =0x7e00101c   @set MRD 2 only 2
    mov r1, #0x2
    str r1, [r0]

    ldr r0, =0x7e001020   @set RAS 45us
    ldr r1, =(45/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e001024   @set RC 68us
    ldr r1, =(68/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e001028   @set DRC 23us
    ldr r1, =(23/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e00102c   @set RFC 80us
    ldr r1, =(80/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e001030   @set RP 23us
    ldr r1, =(23/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e001034   @set RRD 15us
    ldr r1, =(15/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e001038   @set WR 15us
    ldr r1, =(15/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e00103c   @t_wtr瀵勫瓨鍣?
    mov r1, #0x07
    str r1, [r0]

    ldr r0, =0x7e001040   @t_xp瀵勫瓨鍣?
    mov r1, #0x02
    str r1, [r0]

    ldr r0, =0x7e001044   @set XSR 120us
    ldr r1, =(120/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e001048   @set ESR 120us
    ldr r1, =(120/(1000/133)+1)
    str r1, [r0]

    ldr r0, =0x7e00100c   @memory configuration
    ldr r1, =0x00010012   @set bit 16 4 1 0
    str r1, [r0]

    ldr r0, =0x7e00104c   @memory configuration2
    ldr r1, =0x0b45   @set bit just follow the table in the manual
    str r1, [r0]

    ldr r0, =0x7e001200   @设置片选 bank-row内存地址50000000
    ldr r1, =0x150f8   @第8位用来屏蔽地址
    str r1, [r0]

    ldr r0, =0x7e001304   @全选0,使用最小延时
    mov r1, #0x0
    str r1, [r0]

@issue NOP
ldr r0, =0x7e001008
ldr r1, =0xc0000
str r1, [r0]
@issue prechargeall
ldr r0, =0x7e001008
ldr r1, =0x0
str r1, [r0]
@issue autorefresh
ldr r0, =0x7e001008
ldr r1, =0x4000
str r1, [r0]
@issue autorefresh
ldr r0, =0x7e001008
ldr r1, =0x4000
str r1, [r0]
@issue mrs
ldr r0, =0x7e001008
ldr r1, =0x0a0000
str r1, [r0]
@issue mrs
ldr r0, =0x7e001008
ldr r1, =0x0800032
str r1, [r0]
ldr r0, =0x7e001004
mov r1, #0x0
str r1, [r0]
check_ready:
ldr r0, =0x7e001000
ldr r1, [r0]
mov r2, #0x3
and r1,r1,r2
cmp r1, #0x1
bne check_ready
mov pc, lr


最后附上高人指点的链接 http://comm.chinaaet.com/adi/blogdetail/40034.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值