1.内存的分类
DRAM:
它的基本原件是小电容,电容可以在两个极板上保留电荷,但是需要定期的充电(刷新),否则数据会丢失。缺点:由于要定期刷新存储介质,存取速度较慢。
SRAM:
它是一种具有静止存取功能的内存,不需要定期刷新电路就能保存它内部存储的数据。优点:存取速度快;但是缺点是:功耗大,成本高。常用作存储容量不高,但存取速度快的场合,比如stepping stone.
SDRAM(SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机存储器):
同步: 内存工作需要有同步时钟,内部的命令的发送与数据的传输都以该时钟为基准。
动态:存储阵列需要不断的刷新来保证数据不丢失。
随机:是指数据不是线性依次存储,而是自由指定地址进行数据读写。
DDR (Double Data Rate SDRAM),即“双倍速率同步动态随机存储器”:
与早期的SDRAM相比,DDR 除了可以在时钟脉冲的上升沿传输数据,还可以在下降沿传输信号,这意味着在相同的工作频率下,DDR 的理论传输速率为SDRAM的两倍。
DDR2 则在DDR 的基础上再次进行了改进,使得数据传输速率在DDR 的基础上再次翻倍 。
备注:6410开发板通常采用DDR内存
2.内存结构
2.1 表结构
内存的内部如同表格,数据就存放在每个单元格中。数据读写时,先指定行号(行地址),再指定列号(列地址) ,我们就可以准确地找到所需要的单元格。而这张表格的称为:Logical Bank(L-Bank)
2.2 L—Bank
由于技术、成本等原因,一块内存不可能把所有的单元格都做到一个L-Bank,现在内存内部基本都会分割成4个L-Bank。
3.地址空间
S3C6410处理器拥有32位地址总线,其寻址空间为4GB。其中高2GB为保留区,低2GB局域又可划分两部分:主存储区和外设区。
主存储区的划分:
Boot镜像区 :用来启动ARM系统。但是这个区域并没有固定的存储介质与之对应。而是通过修改启动选项,把不同的启动介质映射到该区域。比如,选择了IROM启动方式后,就把IROM映射到该区域。
内部存储区 :这个区域对应着内部的内存地址,iROM和SRAM都是分布在这个区间。0x08000000~0x0bffffff对应着内部ROM,但是IROM实际只有32KB,选择从IROM启动的时候,首先运行就是这里面的程序BL0,这部分代码由三星固化。0x0c000000~0x0fffffff对应内部SRAM,实际就是8KB的Steppingstone。
静态存储区 :这个区域用于访问挂在外部总线上的设备,比如说NOR flash、oneNand等。这个区域被分割为6个bank,每个bank为128MB,数据宽度最大支持16bit,每个bank由片选Xm0CS[0]~Xm0CS[5] 选中 。
保留区
动态存储区:该区域从0x50000000~0x6fffffff,又分为2个区间,分别占256MB,可以片选Xm1CS[0]~Xm1CS[1]来进行着2个区间的选择。6410开发板上256MB的DDR内存就安排在这个区域,这也就是为什么6410的内存地址是从0x50000000开始的原因。
4.内存初始化步骤
5.汇编代码
代码:
1 .text
2 .global mem_init
3 mem_init:
4
5 ldr r0, =0x7e00f120
6 mov r1, #0x8
7 str r1, [r0]
8
9 ldr r0, =0x7e001004 @内存控制命令寄存器
10 mov r1, #0x4 @根据手册得知需要先进入配置模式
11 str r1, [r0]
12
13 ldr r0, =0x7e001010 @刷新寄存器地址
14 ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) ) @设置刷新时间
15 str r1, [r0]
16
17 ldr r0, =0x7e001014 @CAS latency寄存器
18 mov r1, #(3 << 1)
19 str r1, [r0]
20
21 ldr r0, =0x7e001018 @t_DQSS寄存器
22 mov r1, #0x1
23 str r1, [r0]
24
25 ldr r0, =0x7e00101c @T_MRD寄存器
26 mov r1, #0x2
27 str r1, [r0]
28
29 ldr r0, =0x7e001020 @t_RAS寄存器
30 ldr r1, =( ( 45 / ( 1000000000 / 133000000 ) + 1 ) )
31 str r1, [r0]
32
33 ldr r0, =0x7e001024 @t_RC寄存器
34 ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) )
35 str r1, [r0]
36
37 ldr r0, =0x7e001028 @t_RCD寄存器
38 ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )
39 str r1, [r0]
40
41 ldr r0, =0x7e00102c @t_RFC寄存器
42 ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) )
43 str r1, [r0]
44
45 ldr r0, =0x7e001030 @t_RP寄存器
46 ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )
47 str r1, [r0]
48
49 ldr r0, =0x7e001034 @t_rrd寄存器
50 ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )
51 str r1, [r0]
52
53 ldr r0, =0x7e001038 @t_wr寄存器
54 ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )
55 @ ldr r2, [r0]
56 str r1, [r0]
57
58 ldr r0, =0x7e00103c @t_wtr寄存器
59 mov r1, #0x07
60 str r1, [r0]
61
62 ldr r0, =0x7e001040 @t_xp寄存器
63 mov r1, #0x02
64 str r1, [r0]
65
66 ldr r0, =0x7e001044 @t_xsr寄存器
67 ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )
68 str r1, [r0]
69
70 ldr r0, =0x7e001048 @t_esr寄存器
71 ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )
72 str r1, [r0]
73
74 ldr r0, =0x7e00100c @内存控制配置寄存器
75 ldr r1, =0x00010012 @配置控制器
76 str r1, [r0]
77
78 ldr r0, =0x7e00104c @32位DRAM配置控制寄存器
79 ldr r1, =0x0b45
80 str r1, [r0]
81
82 ldr r0, =0x7e001200 @片选寄存器
83 ldr r1, =0x150f8
84 str r1, [r0]
85
86 ldr r0, =0x7e001304 @用户配置寄存器
87 mov r1, #0x0
88 str r1, [r0]
89
90 ldr r0, =0x7e001008
91 ldr r1, =0x000c0000
92 str r1, [r0]
93
94 ldr r1, =0x00000000
95 str r1, [r0]
96
97 ldr r1, =0x00040000
98 str r1, [r0]
99
100 ldr r1, =0x000a0000
101 str r1, [r0]
102
103 ldr r1, =0x00080032
104 str r1, [r0]
105
106 ldr r0, =0x7e001004
107 mov r1, #0x0
108 str r1, [r0]
109
110 check_dmc1_ready:
111
112 ldr r0, =0x7e001000
113 ldr r1, [r0]
114 mov r2, #0x3
115 and r1, r1, r2
116 cmp r1, #0x1
117 bne check_dmc1_ready
118 nop
119 mov pc, lr
View Code