内存由于具备访问速度快,访问方式简单等优点,成为了PC或者是嵌入式硬件平台上不可或缺的元件。在开始学习如何使用内存之前,非常有必要先了解一下内存的分类:

1.1内存分类:

1.2 DRAM分类



2.内存内部结构:
包括:表结构,L-Bank,寻址信息(包括L-Bank选择信号和行地址)。
2.1表结构:

2.2L-Bank的结构:

2.3:寻址信息:


6410内存初始化:

地址空间:

外设区是放寄存器的,主存储区又被分为五个子区:
1.1:主存储区-划分:

内存初始化
下面我们来完成内存初始化的工作:

图一
如图一,我们知道第一项工作是往我们的memc_cmd的域入b100,让我们的DRAM Controller进入config状态。这个域是在我们的P1MEMCCMD这个寄存器里面:

代码操作:

接下来是第二项工作:初始化以下的寄存器:
Write memory timing parameter, chip configuration, and id configuration registers.



我们从上面知道。第三步是可以不做的:
接下来进入第四步:Execute memory initialization sequence.内存初始化系列:

由上面的图知道,第一件事是把direct_cmd寄存器相应的位写入b10,让它发出一个nop的指令。下面是该寄存器的地址:


上面知道,要让系统发出nop命令,18,19位是等于11的。上面的10是错的。其他的是0.所以我们只要往该寄存器的18,19位写入11即可:代码:

第二件事是往我们的direct_cmd相应的位写入00,让它发出prechargeall命令:

代码:

第三项工作:

连续两次:

第五项工作:

这个我们是参考uboot的参数的:
代码:

第五件事:这样就完成了我们的第四件事Execute memory initialization sequence,接下来是第五件事:Program memc_cmd to '3'b000', which makes DRAM Controller enter 'Ready' state.就是往我们的寄存器写入0,让我们的controller进入ready的状态:

第六件事就是检查是否ready了:

从文字知道,我们得去看memc_stat这个寄存器:

我们看到最低的两位,就是状态位,所以要检查最低两位的值是否为01:

其实到这里,我们内存的初始化还没完成,就是在开头的时候,我们的落下的那几行代码:

这是用来干什么的呢?我们来看看手册:

该寄存器最重要的是第7位:


上面应该是31-16位:当这一位是0的时候,

如果第7位是0,上面的16-31这16个pin角,就用来作为我们的数据线。若果是1,就被我们的SROMC使用的。所以这一位是设置为0.

这样就写好了:make:

下载到开发板,led亮起来。
中间的代码没有讲------对应的是如下 :自学:

下面是Uboot里的代码实现:uboot_ok6410/cpu/s3c64xx/s3c6410/cpu_init.S:
#include #include .globl mem_ctrl_asm_init mem_ctrl_asm_init: ldr r0, =ELFIN_MEM_SYS_CFG @Memory sussystem address 0x7e00f120 mov r1, #0xd @ Xm0CSn2 = NFCON CS0, Xm0CSn3 = NFCON CS1 str r1, [r0] ldr r0, =ELFIN_DMC1_BASE @DMC1 base address 0x7e001000 ldr r1, =0x04 str r1, [r0, #INDEX_DMC_MEMC_CMD] ldr r1, =DMC_DDR_REFRESH_PRD str r1, [r0, #INDEX_DMC_REFRESH_PRD] ldr r1, =DMC_DDR_CAS_LATENCY str r1, [r0, #INDEX_DMC_CAS_LATENCY] ldr r1, =DMC_DDR_t_DQSS str r1, [r0, #INDEX_DMC_T_DQSS] ldr r1, =DMC_DDR_t_MRD str r1, [r0, #INDEX_DMC_T_MRD] ldr r1, =DMC_DDR_t_RAS str r1, [r0, #INDEX_DMC_T_RAS] ldr r1, =DMC_DDR_t_RC str r1, [r0, #INDEX_DMC_T_RC] ldr r1, =DMC_DDR_t_RCD ldr r2, =DMC_DDR_schedule_RCD orr r1, r1, r2 str r1, [r0, #INDEX_DMC_T_RCD] ldr r1, =DMC_DDR_t_RFC ldr r2, =DMC_DDR_schedule_RFC orr r1, r1, r2 str r1, [r0, #INDEX_DMC_T_RFC] ldr r1, =DMC_DDR_t_RP ldr r2, =DMC_DDR_schedule_RP orr r1, r1, r2 str r1, [r0, #INDEX_DMC_T_RP] ldr r1, =DMC_DDR_t_RRD str r1, [r0, #INDEX_DMC_T_RRD] ldr r1, =DMC_DDR_t_WR str r1, [r0, #INDEX_DMC_T_WR] ldr r1, =DMC_DDR_t_WTR str r1, [r0, #INDEX_DMC_T_WTR] ldr r1, =DMC_DDR_t_XP str r1, [r0, #INDEX_DMC_T_XP] ldr r1, =DMC_DDR_t_XSR str r1, [r0, #INDEX_DMC_T_XSR] ldr r1, =DMC_DDR_t_ESR str r1, [r0, #INDEX_DMC_T_ESR] ldr r1, =DMC1_MEM_CFG str r1, [r0, #INDEX_DMC_MEMORY_CFG] ldr r1, =DMC1_MEM_CFG2 str r1, [r0, #INDEX_DMC_MEMORY_CFG2] ldr r1, =DMC1_CHIP0_CFG str r1, [r0, #INDEX_DMC_CHIP_0_CFG] ldr r1, =DMC_DDR_32_CFG str r1, [r0, #INDEX_DMC_USER_CONFIG] @DMC0 DDR Chip 0 configuration direct command reg ldr r1, =DMC_NOP0 str r1, [r0, #INDEX_DMC_DIRECT_CMD] @Precharge All ldr r1, =DMC_PA0 str r1, [r0, #INDEX_DMC_DIRECT_CMD] @Auto Refresh 2 time ldr r1, =DMC_AR0 str r1, [r0, #INDEX_DMC_DIRECT_CMD] str r1, [r0, #INDEX_DMC_DIRECT_CMD] @MRS ldr r1, =DMC_mDDR_EMR0 str r1, [r0, #INDEX_DMC_DIRECT_CMD] @Mode Reg ldr r1, =DMC_mDDR_MR0 str r1, [r0, #INDEX_DMC_DIRECT_CMD] #ifdef CONFIG_SMDK6410_X5A ldr r1, =DMC1_CHIP1_CFG str r1, [r0, #INDEX_DMC_CHIP_1_CFG] @DMC0 DDR Chip 0 configuration direct command reg ldr r1, =DMC_NOP1 str r1, [r0, #INDEX_DMC_DIRECT_CMD] @Precharge All ldr r1, =DMC_PA1 str r1, [r0, #INDEX_DMC_DIRECT_CMD] @Auto Refresh 2 time ldr r1, =DMC_AR1 str r1, [r0, #INDEX_DMC_DIRECT_CMD] str r1, [r0, #INDEX_DMC_DIRECT_CMD] @MRS ldr r1, =DMC_mDDR_EMR1 str r1, [r0, #INDEX_DMC_DIRECT_CMD] @Mode Reg ldr r1, =DMC_mDDR_MR1 str r1, [r0, #INDEX_DMC_DIRECT_CMD] #endif @Enable DMC1 mov r1, #0x0 str r1, [r0, #INDEX_DMC_MEMC_CMD] check_dmc1_ready: ldr r1, [r0, #INDEX_DMC_MEMC_STATUS] mov r2, #0x3 and r1, r1, r2 cmp r1, #0x1 bne check_dmc1_ready nop mov pc, lr /* Below code is for ARM926EJS and ARM1026EJS */ .globl cleanDCache cleanDCache: mrc p15, 0, pc, c7, c10, 3 /* test/clean D-Cache */ bne cleanDCache mov pc, lr .globl cleanFlushDCache cleanFlushDCache: mrc p15, 0, pc, c7, c14, 3 /* test/cleanflush D-Cache */ bne cleanFlushDCache mov pc, lr .globl cleanFlushCache cleanFlushCache: mrc p15, 0, pc, c7, c14, 3 /* test/cleanflush D-Cache */ bne cleanFlushCache mcr p15, 0, r0, c7, c5, 0 /* flush I-Cache */ mov pc, lr .ltorg 

上一篇:8.时钟初始化
下一篇:android平台6410背光修改
推荐阅读最新更新时间:2026-03-20 11:58
- 使用 ON Semiconductor 的 FAN2518S 的参考设计
- LTC1530S8、3.3V/3A 稳压器
- 使用 ON Semiconductor 的 ADP3167 的参考设计
- 使用 Analog Devices 的 LT3420EDD 的参考设计
- 基于Kinetis® M的低成本单相电表参考设计
- LTC3708、具有上升/下降轨跟踪功能的 2.5V/15A 和 1.2V/15A 稳压器
- NXQ1TXH5插件板
- 应变仪仪表放大器
- WRL-13287,基于 ESP8266 802.11 无线局域网的 SparkFun Wi-Fi Shield
- 4.1W、3-LED 通用 LED 照明驱动器



有关MCU的寄存器及内存
CE修改器
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号