zoukankan      html  css  js  c++  java
  • 内存初始化

    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

     

     



  • 相关阅读:
    低效代码的危害
    使用datetime来控制timer的问题
    redis for windows
    log4net支持用日期加时间指定文件名
    防止数据丢失的解决方法
    RabbitMQ默认情况下不保证每次都把消息传递
    UnitTest和Developer
    spring+eureka+zuul
    新工具解决消息丢失的bug
    java_if_else__的应用1
  • 原文地址:https://www.cnblogs.com/boyiliushui/p/5862040.html
Copyright © 2011-2022 走看看