博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存初始化
阅读量:6238 次
发布时间:2019-06-22

本文共 4265 字,大约阅读时间需要 14 分钟。

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, =0x000a0000101     str r1, [r0]102 103     ldr r1, =0x00080032104     str r1, [r0]105 106     ldr r0, =0x7e001004107     mov r1, #0x0108     str r1, [r0]109 110 check_dmc1_ready:111     112     ldr r0, =0x7e001000 113     ldr r1, [r0]114     mov r2, #0x3115     and r1, r1, r2116     cmp r1, #0x1117     bne check_dmc1_ready118     nop119     mov pc, lr
View Code

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/boyiliushui/p/5862040.html

你可能感兴趣的文章
animationFromTop
查看>>
Java多线程运行时序问题
查看>>
SEM如何做数据分析?
查看>>
Word文档怎么在线压缩变小?
查看>>
语音转文字如何在线转换的?
查看>>
区块链教程Fabric1.0源代码分析policy(背书策略
查看>>
平台化,中台化
查看>>
比你优秀的人都在努力,你还有什么理由浑浑噩噩
查看>>
无线传输更安全也更稳定
查看>>
ABB焊接机器人伺服电机维修常见故障
查看>>
oracle使用plsql插入数据中文乱码问题
查看>>
ssh各种异常登陆
查看>>
nginx域名配置方法
查看>>
Java 基本问题
查看>>
马哥2016全新Linux+Python高端运维班第一周作业
查看>>
setup Docker private registry
查看>>
Redis 为什么使用单进程单线程方式也这么快
查看>>
JAVA's NIO, Netty And Mina文章推荐
查看>>
《Java从小白到大牛精简版》之第4章 Java语法基础
查看>>
启动文件类型与芯片容量大小区别
查看>>