内存初始化

1.内存的分类

DRAM

它的基本原件是小电容,电容可以在两个极板上保留电荷,但是需要定期的充电(刷新),否则数据会丢失。缺点:由于要定期刷新存储介质,存取速度较慢。 

SRAM:

它是一种具有静止存取功能的内存,不需要定期刷新电路就能保存它内部存储的数据。优点:存取速度快;但是缺点是:功耗大,成本高。常用作存储容量不高,但存取速度快的场合,比如stepping stone.

SDRAMSDRAM(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

 

 



原文地址:https://www.cnblogs.com/boyiliushui/p/5862040.html