Smart210学习记录-------内存初始化

发布者:安静的夜晚最新更新时间:2025-01-22 来源: cnblogs关键字:Smart210  学习记录  内存初始化 手机看文章 扫描二维码
随时随地手机看文章






 
DMC0_PRECHCONFIG = 0xFF000000;
DMC0_PWRDNCONFIG = 0xFFFF00FF;
 
 
DMC0_TIMINGAREF = 0x00000618;
DMC0_TIMINGROW = 0x28233287;
DMC0_TIMINGDATA = 0x23240304;
DMC0_TIMINGPOWER = 0x09C80232;
DMC0_PHYSTSTUS0 = 0x4;//11 PHY DLL is locked
 
 
 
DMC0_DIRECTCMD = 0x07000000;
DMC0_DIRECTCMD = 0x01000000;//所有板子预充电16
DMC0_DIRECTCMD = 0x00020000;
DMC0_DIRECTCMD = 0x00030000;
DMC0_DIRECTCMD = 0x00010400;
DMC0_DIRECTCMD = 0x00000542;
DMC0_DIRECTCMD = 0x01000000;//所有预充电21
DMC0_DIRECTCMD = 0x05000000;
DMC0_DIRECTCMD = 0x05000000;
DMC0_DIRECTCMD = 0x00000442;
DMC0_DIRECTCMD = 0x00010780;
DMC0_DIRECTCMD = 0x00010400;
DMC0_DIRECTCMD = 0x07100000;
DMC0_DIRECTCMD = 0x01100000;
DMC0_DIRECTCMD = 0x00120000;
DMC0_DIRECTCMD = 0x00130000;
DMC0_DIRECTCMD = 0x00110400;
DMC0_DIRECTCMD = 0x00100542;
DMC0_DIRECTCMD = 0x01100000;
DMC0_DIRECTCMD = 0x05100000;
DMC0_DIRECTCMD = 0x05100000;
DMC0_DIRECTCMD = 0x00100442;
DMC0_DIRECTCMD = 0x00110780;
DMC0_DIRECTCMD = 0x00110400;
 
 
DMC0_CONCONTROL = 0x0FF02030;
DMC0_PWRDNCONFIG = 0xFFFF00FF;
DMC0_MEMCONTROL = 0x00202400;
 
 
//DMC1
DMC1_PHYCONTROL0 = 0x00101000;
DMC1_PHYCONTROL0 = 0x00101002;
DMC1_PHYCONTROL1 = 0x86;
DMC1_PHYCONTROL0 = 0x00101003;
 
 
while((DMC0_PHYSTATUS&0x7) != 0x7);
 
 
DMC1_CONCONTROL = 0x0FFF2010;
DMC1_MEMCONTROL = 0x00202400;
DMC1_MEMCONFIG0 = 0x40E01323;
//DMC0_MEMCONFIG1 = 0x40F01323;
 
 
DMC1_PRECHCONFIG = 0xFF000000;
//DMC0_PWRDNCONFIG = 0xFFFF00FF;
 
 
DMC1_TIMINGAREF = 0x00000618;
DMC1_TIMINGROW = 0x28233287;
DMC1_TIMINGDATA = 0x23240304;
DMC1_TIMINGPOWER = 0x09C80232;
 
 
 
 
 
DMC1_DIRECTCMD = 0x07000000;
DMC1_DIRECTCMD = 0x01000000;
DMC1_DIRECTCMD = 0x00020000;
DMC1_DIRECTCMD = 0x00030000;
DMC1_DIRECTCMD = 0x00010400;
DMC1_DIRECTCMD = 0x00000542;
DMC1_DIRECTCMD = 0x01000000;
DMC1_DIRECTCMD = 0x05000000;
DMC1_DIRECTCMD = 0x05000000;
DMC1_DIRECTCMD = 0x00000442;
DMC1_DIRECTCMD = 0x00010780;
DMC1_DIRECTCMD = 0x00010400;
DMC1_DIRECTCMD = 0x07100000;
DMC1_DIRECTCMD = 0x01100000;
DMC1_DIRECTCMD = 0x00120000;
DMC1_DIRECTCMD = 0x00130000;
DMC1_DIRECTCMD = 0x00110400;
DMC1_DIRECTCMD = 0x00100542;
DMC1_DIRECTCMD = 0x01100000;
DMC1_DIRECTCMD = 0x05100000;
DMC1_DIRECTCMD = 0x05100000;
DMC1_DIRECTCMD = 0x00100442;
DMC1_DIRECTCMD = 0x00110780;
DMC1_DIRECTCMD = 0x00110400;
 
 
DMC1_CONCONTROL = 0x0FF02030;
DMC1_PWRDNCONFIG = 0xFFFF00FF;
DMC1_MEMCONTROL = 0x00202400;
)

买了Smart210的板子,开始学习中,,,,,

 

今天看了重定位DRAM ,然而内存需要初始化,早上信心满满的我到现在崩溃的我。。。。也不知遭受了什么样的蹂躏 ,,还是记下一点学到的知识吧。。

 

 数据手册上DDR类型的内存初始化步骤:

1. To provide stable power for controller and memory device, the controller must assert and hold CKE to a logic 
low level. Then apply stable clock. Note: XDDR2SEL should be High level to hold CKE to low.

2. Set the PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc bit-fields to correct value according 
frequency. Set the PhyControl0.ctrl_dll_on bit-field to ‘1’ to turn on the PHY DLL. 

//PHY Control0 Register (PhyControl0, R/W, Address = 0xF000_0018, 0xF140_0018) 
DMC0_PHYCONTROL0 = 0x00101002;


3. DQS Cleaning: Set the PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc bit-fields to correct value
according to clock frequency and memory tAC parameters. 
DMC0_PHYCONTROL0 = 0x00000086;

4. Set the PhyControl0.ctrl_start bit-field to ‘1’. 
DMC0_PHYCONTROL0 |= 1 << 0; 
while((MC0_PhyStatus & 0x07) != 0x07);

5. Set the ConControl. At this moment, an auto refresh counter should be off.

DMC0_CONCONTROL = 0x0FFF2010;


6. Set the MemControl. At this moment, all power down modes should be off.

// MemControl BL=4, 1Chip, DDR2 Type, dynamic self refresh, force precharge, dynamic power down off
DMC0_MEMCONTROL = 0x00202400;


7. Set the MemConfig0 register. If there are two external memory chips, set the MemConfig1 register.

// MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
DMC_MemConfig0 = 0X20F00313
DMC_MemConfig1 = 0X20F00313

8. Set the PrechConfig and PwrdnConfig registers. 
DMC0_PRECHCONFIG = 0xFF000000;
DMC0_PwrdnConfig = 0xFFFF00FF;

9. Set the TimingAref, TimingRow, TimingData and TimingPower registers according to memory AC parameters. 
DMC0_TimingAref = 0x00000618 ; //7.8us * 200MHz = 1560 = 0x0168
DMC0_ TimingRow = 0x2B34438A
DMC0_TimingData = 0x24240000; //DDR
DMC0_TimingPower = 0x0BDC0343;

10. If QoS scheme is required, set the QosControl0~15 and QosConfig0~15 registers. 
11. Wait for the PhyStatus0.ctrl_locked bit-fields to change to ‘1’. Check whether PHY DLL is locked.
while((DMC0_PhyStatus0 & 0x04) != 0x04);

12. PHY DLL compensates the changes of delay amount caused by Process, Voltage and Temperature (PVT) 
variation during memory operation. Therefore, PHY DLL should not be off for reliable operation. It can be off 
except runs at low frequency. If off mode is used, set the PhyControl0.ctrl_force bit-field to correct value 
according to the PhyStatus0.ctrl_lock_value[9:2] bit-field to fix delay amount. Clear the 
PhyControl0.ctrl_dll_on bit-field to turn off PHY DLL. 
13. Confirm whether stable clock is issued minimum 200us after power on 
14. Issue a NOP command using the DirectCmd register to assert and to hold CKE to a logic high level.
15. Wait for minimum 400ns.

 

16. Issue a PALL command using the DirectCmd register. 
DMC0_DIRECTCMD = 0x07000000;
DMC0_DIRECTCMD = 0x01000000; //PALL command

17. Issue an EMRS2 command using the DirectCmd register to program the operating parameters. 
DMC0_DIRECTCMD = 0x00020000;

18. Issue an EMRS3 command using the DirectCmd register to program the operating parameters. 
DMC0_DIRECTCMD = 0x00030000;

19. Issue an EMRS command using the DirectCmd register to enable the memory DLLs. 

20. Issue a MRS command using the DirectCmd register to reset the memory DLL. 
21. Issue a PALL command using the DirectCmd register. 
22. Issue two Auto Refresh commands using the DirectCmd register. 
23. Issue a MRS command using the DirectCmd register to program the operating parameters without resetting 
the memory DLL. 
24. Wait for minimum 200 clock cycles. 
25. Issue an EMRS command using the DirectCmd register to program the operating parameters. If OCD 
calibration is not used, issue an EMRS command to set OCD Calibration Default. After that, issue an EMRS 
command to exit OCD Calibration Mode and to program the operating parameters. 
26. If there are two external memory chips, perform steps 14~25 for chip1 memory device.

27. Set the ConControl to turn on an auto refresh counter. 28. If power down modes is required, set the 
MemControl registers.

 真的搞死了,后面的一点都不懂,先暂时stop吧,再看这真要崩溃了,,,,等学习一段之后再看看吧,下面的是搜的资料和原网址。。。。╮(╯▽╰)╭

 

 

接下来的14-25步的SDRAM有些就让人摸不着头脑了,因为说得不详细(因为详细了可就有的说了涉及的知识非常多,
不过做的不好的就是没有提示在哪里可以得到相关资料),而且寄存器的配置说明讲额也不是很清楚

cmd_type和cmd_chip 按照相关的命令设置就可以了,而后面的 cmd_bank cmd_addr 就说的不清不楚了,根本就不知道该如何配置,如:17. Issue an EMRS2 command using the DirectCmd register to program the operating parameters.,表中明明没有与EMSR2的命令啊!!
原来这几个项基本上是为MRS和EMRS这两个命令服务的,这两个命令操作这几个寄存器:模式寄存器(MSR)、扩展模式寄存器(1)(EMRS(1))、扩展模式寄存器(2)(EMRS(2))、扩展模式寄存器(3)(EMRS(3)),所以EMSR2命令其实是表示使用EMSR命令对扩展模式寄存器(2)进行操作,其他操作类似

编程(扩展)模式寄存器
为了增强使用灵活性, 突发长度, 突发类型, /CAS延迟, DLL 复位功能, 写恢复时间(WR) 都是可以定义的变量。通过预先编程模式寄存器就可以设定它们. 除
此之外, DLL 禁止功能, 驱动电阻, 附加 CAS 延迟, ODT(终结电阻), 单线选通, 和 OCD(片外驱动电阻调整) 同样也是可以定义的变量,通过预先编程扩展
模式寄存器就可以设定它们. 模式寄存器或者扩展模式寄存器的内容可以通过对他们进行重新设定来改变它们 .如果用户只是想改变寄存器中某些特定的位,
也必须通过MRS或EMRS命令对全部寄存器位进行重新设定。
MRS, EMRS和t DLL 复位这些命令并不会影响存储阵列的内容,这意味着上电后的任意时间执行初始化操作不会改变存储的内容 。(资料上的解释,了解一下)
到这里,应该可以猜测表中cmd_bank cmd_addr 这两栏的作用了,cmd_bank这栏决定了使用哪一个MRS和EMRS命令,如MRS、EMSR1或EMSR2或EMSR3;cmd_add这一项的每一位则对应了相应的设置,具体使用下面继续介绍。(参考了一份”DDR2 SDRAM操作时序规范“的资料,我才弄明白了这回事,下面有应用资料内容)

DDR2 SDRAM 模式寄存器设定 (MRS)
模式寄存器中的数据控制着 DDR2 SDRAM的操作模式.它控制着 CAS 延迟, 突发长度, 突发顺序, 测试模式, DLL复位, WR等各种选项,支持着 DDR2
SDRAM 的各种应用. 模式寄存器的默认值没有被定义, 所以上电之后必须按规定的时序规范来设定模式寄存器的值. 通过将 CS, RAS, CAS, WE, BA0 ,
BA1置低来发布模式寄存器设定命令, 操作数通过地址脚 A0 ~ A15同步送出. DDR2 SDRAM 在写模式寄存器之前,应该通过拉高CKE而完成了所有簇的裕充
电。模式寄存器设定命令的命令周期 (tMRD)必须满足完成对模式寄存器的写操作。在进行正常操作时,只要所有的簇都已经处于预充电完成状态,模式寄存
器都可以使用同一命令重新设定. 模式寄存器不同的位表示不同的功能. A0 ~ A2 设定突发长度是4还是8。 突发长度的译码规则与DDR SDRAM相同. A3定义
了突发地址顺序。A4 ~ A6定义了CAS延迟。. DDR2不支持半时钟延迟。 A7 设定测试模式. A8设定 DLL 复位。 对通常的 MRS操作,A7必须设定为低。


从上面的表格就很清楚了,BA2、BA1、BA0对应的是cmd_bank 栏,A15-A0则对应了cmd_addr ;

 

 DDR2 SDRAM 扩展模式寄存器设定
EMRS(1)
扩展模式寄存器(1) 存储着激活或禁止DLL的控制信息, 输出驱动强度, ODT 值的选择 和附加延迟等信息. 扩展寄存器(1)的默认值没有被定义, 因此,
上电之后,扩展模式寄存器(1)的值必须按正确的步骤来设定。 写扩展模式寄存器(1)是通过拉低CS, RAS, CAS, WE ,置袄 BA0, 同时控制地址线
A0 ~ A13的状态。 在写扩展模式寄存器(1)之前,DDR2 SDRAM 应该通过将 CKE拉高完成所有簇的预充电。扩展模式寄存器(1)设定命令的命令周
期  (tMRD)必须满足完成对扩展模式寄存器(1)的写操作。在进行正常操作时,只要所有的簇都已经处于预充电完成状态,扩展模式寄存器(1)都可以使
用同一命令重新设定.. A0控制着DLL 激活或禁止。 A1被用于激活数据输出驱动能力为一半。A3~A5 决定着附加延迟, A2和 A6 用语 ODT 值的选定,
A7~A9 用于控制 OCD, A10 被用于禁止  DQS#, A11 被用于 RDQS 的激活。
DLL 激活/禁止
对通常的操作, DLL必须被激活。在上电初始化过程中,必须激活  DLL, 在开始正常操作时,要先关闭DLL。在进入自我刷新操作时,DLL会被自动禁止,
当结束自我刷新时,DLL会被自动激活。一旦 DLL被激活(随之将复位),为了使外部时钟和内部始终达到同步,在发布读命令之前必须至少要过200个
时钟周期。没有等待同步可能会导致tAC 或 tDQSCK参数错误。
EMRS(2)
扩展模式寄存器r(2)控制着刷新和相关的特性。扩展模式寄存器(2)的默认值没有被定义, 因此在上电后,必须按规定的时序对扩展模式寄存器 (2) 进行设定。通
过拉低S, RAS, CAS, WE,置高 BA1 拉低 BA0来发布扩展模式寄存器(2)的设定命令。同时控制地址线A0 ~ A15的状态. 在写扩展模式寄存器(2)之前,
DDR2 SDRAM 应该通过将 CKE拉高完成所有簇的预充电。扩展模式寄存器(2)设定命令的命令周期  (tMRD)必须满足完成对扩展模式寄存器(2)的写
操作。在进行正常操作时,只要所有的簇都已经处于预充电完成状态,扩展模式寄存器(2)都可以使用同一命令重新设定.

 

有了上面的知识提示,应该就可以比较没有障碍得对SDRAM进行初始化,资料中的SDRAM的初始化过程与DATASHEET里面的步骤基本相同,贴上来:

上电和初始化时序
1. 对于上电和初始化来说,下列时序是必须的。(应该说的是DATASHEET里面的第1步)
供电且保持CKE 低于 0.2*VDDQ , ODT*1 要处于低电平状态 (所有的其余脚可以都没有定义.) 电源上升沿不可以有任何翻转,上升沿时间不能大于 200mS;
并且要求在电压上升沿过程中满足, VDD>VDDL>VDDQ且 VDD-VDDQ<0.3 volts.
- VDD
*2, VDDL
*2 和 VDDQ必须由同一个电源芯片供电, 并且
- VTT 最大只能到 0.95 V, 并且
- Vref 要时刻等于 VDDQ/2.,紧跟VDDQ变化。
或者
-在给 VDDL上电的同时或之前就给VDD
*2
.上电
-在给  VDDQ上电的同时或之前就给VDDL
*2
上电
-在给VTT & VREF上电的同时或之前就给VDDQ上电.
上面的两个条件至少要满足一个。
2. 开始时钟信号并保持信号稳定.
3.在稳定电源和时钟(CK, /CK)之后至少200s, 然后发布 NOP 或者取消选定命令  &拉高CKE.
4. 等待至少 400ns然后发布预充电所有簇命令.在等待的400ns过程中要发布NOP或者取消选定命令.
5. 发布 EMRS(2)命令. (EMRS(2) 命令, 需要将 BA0拉低, 将 BA1拉高.)
6. 发布 EMRS(3) 命令. (为了发布EMRS(3)命令,将 BA0和 BA1拉高.)
7.发布 EMRS命令以激活 DLL. (为了发布'DLL激活' 命令,将 A0拉低, BA0拉高 并且将 BA1-2和 A13-A15置低.)
8. 发布MRS命令实现  “DLL复位”
*2.
(为了发布DLL 复位命令, 需要将 A8拉高 并使 BA0-1为低)
9. 发布预充电所有簇命令。
10. 至少发布两次自动刷新命令.
11. 将 A8拉低,发布模式寄存器设定命令(MRS)对芯片进行初始化操作. (也就是不对 DLL复位,编程芯片的操作参数)
12.在第8步之后至少过200个时钟周期,执行OCD 校准 ( 片外驱动电阻调校 ).
如果不使用OCD校准, EMRS OCD 校准模式结束命令 (A9=A8=A7=0) 必须在EMRS OCD默认命令 (A9=A8= A7=1)之后发布,用来设定EMRS的其它操
作参数。
13. 现在, DDR2 SDRAM 就准备好可以进行普通的操作了。.
*1) 为了保证 ODT关闭, VREF必须有效 并且 ODT脚必须拉低.
*2) 如果 VDDL或VDD 的电平值在正常操作过程中人为改变, (例如e, 为了 VDD 相交测试, 或者节省功率)
则必须执行“DLL 复位”.

[1] [2]
关键字:Smart210  学习记录  内存初始化 引用地址:Smart210学习记录-------内存初始化

上一篇:Smart210学习记录-------文件操作
下一篇:Smart210学习记录-------linux内核模块

推荐阅读最新更新时间:2026-03-25 00:48

Smart210学习记录-------linux内核模块
Linux 驱动工程师需要牢固地掌握 Linux 内核的编译方法以为嵌入式系统构建可运行的 Linux 操作系统映像。在编译 LDD6410 的内核时,需要配置内核,可以使用下面命令中的 一个: #make config(基于文本的最为传统的配置界面,不推荐使用) #make menuconfig(基于文本菜单的配置界面) #make xconfig(要求 QT 被安装) #make gconfig(要求 GTK+被安装) 在配置Linux 2.6内核所使用的make config、make menuconfig、make xconfig和make gconfig这 4 种方式中,最值得推荐的是 make menuconfig,它
[单片机]
Smart210学习记录----beep linux字符设备驱动
今天搞定了beep linux字符设备驱动,心里还是很开心的,哈哈。。。但在完成的过程中却遇到了一个非常棘手的问题,花费了我大量的时间,,,, 还是把问题描述一下吧,好像这个问题很普遍的,网上许多解决方法,但是我还是没看懂,只能慢慢找,,, 我在insmod字符设备是,出现了一下提示信息 这里只列出主要部分: Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c0004000 *pgd=00000000 Internal error: Oops: 7 Modules lin
[单片机]
Smart210学习记录------nor flash驱动
nor flash驱动与nand flash驱动的差别不大,只是设置不同的结构体而已,, nor flash驱动代码: #include linux/module.h #include linux/types.h #include linux/kernel.h #include linux/init.h #include linux/slab.h #include linux/device.h #include linux/platform_device.h #include linux/mtd/mtd.h #include linux/mtd/map.h #include linux/mtd/parti
[单片机]
第四章之S5PV210内存初始化
1,既然UART可以打印出信息来,那我们可以打印内存中的值。在506行添加如下代码: 1 2 /***UART transmit function by xu ***/ 3 display_addr_dat: 4 5 ldr r0, 6 7 ldr r1,=0xE2900020 8 9 ldr r2,=0x30 10 str r2, @UTXH0='0' 11 12 ldr r2,=0x78 13 str r2, @UTXH0='x' 14 15 ldr r3,=28 16 17 display_loop_count: 18
[单片机]
第四章之S5PV210<font color='red'>内存</font><font color='red'>初始化</font>
C51和MDK的ROM大小及变量绝对地址初始化
#1. C51的ROM大小 Keil编译完之后,显示的Program Size: data=9.0 xdata=8 const=15 code=180,则 The Total ROM(const + code + code-gap + const-gap) is 199BYTE 实际生成的bin文件大小: 在.MAP中的C O D E M E M O R Y 中 code-gap为0,cosnt-gap为4,则const + code + const-gap=15 + 180 + 4 = 199,刚好和实际生成的bin文件大小一致。 #2. C51的ROM大小优化 如果实际编译显示的const + code远小于实际的Bi
[单片机]
C51和MDK的<font color='red'>ROM</font>大小及变量绝对地址<font color='red'>初始化</font>
如何禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位
笔记: (1)如何禁止KEIL初始化RAM为零? 1. 在KEIL Noinit 打钩 2. 1 另须对需要热启动保持的变量用__at关键字指定某个区域,否则还是没用 (#include absacc.h ) 2 或者__attribute__((zero_init)) 关键字 .bss段 int test1=1; __attribute__((zero_init)) int test2; int test3 __at(0x20001000); 查看MAP文件 test1 0x20000000 Data 4 main.o(.data) tes
[单片机]
如何禁止KEIL<font color='red'>初始化</font><font color='red'>RAM</font>为零& 如何判断是软复位还是上电复位
bootloader中关于flash擦除写和ram初始化的有关问题
最近在做飞思卡尔16位单片机的在线升级bootloader程序。有2个问题不太清楚,请教下论坛里的高人。 1.bootloader程序中,对存放应用程序的flash空间进行擦除和写入新的应用程序以完成升级。比较特别的是,需要将flash操作代码拷贝到ram中执行,这是为什么?bootloader程序所在flash空间设置为被保护状态,不会误擦除,而且运行到哪个函数自然会把函数压栈到RAM里执行吧?为什么还要特地拷贝到RAM里呢? 2.单片机上电初始化后,RAM存储初始化全局变量,这些全局变量是从调试器烧进去的S19文件中获取的吗?每次程序都是从bootloader的main函数开始执行,确定不是升级状态后跳转到应用程序重映射的re
[单片机]
[smart210] firstled.s 代码分析及编译分析
平台:smart210(tiny210v2) CPU:S5PV210 目标:led灯按照一定频率闪烁 1.代码如下(如果不能编译,请去掉注释): .globl _start _start: ldr r1, =0xE0200280 //config the GPJ2CON as output ldr r0, =0x00001111 str r0, mov r2, #0x1000 //r2=8 led_blink: ldr r1, =0xE0200284 //set the GPJ2DAT as 0,4 leds would light on! mov r0, #0x
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved