嗨,今天看内存初始化的内容,快看哭了T_T,问老师,老师不怎么回答,还是看一篇博文知道了不少
mov r1, #0x1
str r1, [r0]
mov r1, #0x2
str r1, [r0]
ldr r0, =0x7e001024
@set RC 68us
ldr r1, =(68/(1000/133)+1)
str r1, [r0]
ldr r1, =(23/(1000/133)+1)
ldr r0, =0x7e00102c
@set RFC 80us
ldr r1, =(80/(1000/133)+1)
str r1, [r0]
ldr r1, =(23/(1000/133)+1)
str r1, [r0]
ldr r1, =(15/(1000/133)+1)
str r1, [r0]
ldr r1, =(15/(1000/133)+1)
str r1, [r0]
mov r1, #0x07
str r1, [r0]
ldr r0, =0x7e001040
mov r1, #0x02
str r1, [r0]
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 r1, =0x00010012
@set bit 16 4 1 0
str r1, [r0]
ldr r1, =0x0b45
@set bit just follow the table in the manual
str r1, [r0]
ldr r1, =0x150f8
@第8位用来屏蔽地址
str r1, [r0]
mov r1, #0x0
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]
回头又增加了不少关于内存地知识。在我们的开发板里面都有地址空间,不同的地址空间区域对应着不同的功能,其中主存储区中有一部分(动态存储区)就是内存的地址(0x50000000)。
在OK6410里使用的是属于DRAM的DDR
对于内存的初始化,在芯片手册里有规定好的步骤,但是要实现起来却不太简单,它里面是这样写的
ldr r0, =0x7e001004
mov r1, #0x4
str r1, [r0]
二.配置内存里有关时间的参数,芯片配置,ID配置。这里简简单单写了一句,执行起来却有好多
先说有关内存时间的参数
刷新周期(DRAM内部都有小电容构成,要定时对电容充电)
但是这个周期又要到内存芯片里去找到对应的值
所以一般可以选取7.8us作周期,但是要转换成多少个时钟周期
公式(所要时间,单位ns)/(1000/133)+1
公式(所要时间,单位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
MRD
照表格0x2
ldr r0, =0x7e00101c @set MRD 2 only 2
str r1, [r0]
RAS
KKK
ldr r0, =0x7e001020 @set RAS 45us
ldr r1, =(45/(1000/133)+1)
RC
RCD
ldr r0, =0x7e001028 @set DRC 23us
str r1, [r0]
RFC
ppp
RP
ldr r0, =0x7e001030
@set RP 23us
RRD
ldr r0, =0x7e001034
@set RRD 15us
WR
ldr r0, =0x7e001038
@set WR 15us
WTR,XP
这两个不太清楚为什么。但参考是这么设置的。
ldr r0, =0x7e00103c
XSR
ldr r0, =0x7e001044
@set XSR 120us
ESR
再来配置芯片配置
设16 4 1 0位为1,除最后3位,其余按默认
ldr r0, =0x7e00100c
@memory configuration
MEMORY CONFIGURATION 2
ldr r0, =0x7e00104c
@memory configuration2
CHIP_N_CFG
ldr r0, =0x7e001200
@设置片选 bank-row内存地址50000000
USER_CONFIG
ldr r0, =0x7e001304
@全选0,使用最小延时
这下,步骤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]
@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