内存初始化
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