DDR2(SDRAM)初始化 28个步骤总结

2024-02-02 23:38

本文主要是介绍DDR2(SDRAM)初始化 28个步骤总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

S5PV210 DDR2初始化 28个步骤总结


首先在初始化DDR之前,引入一个关于DRAM Drive Strength的概念----DRAM Drive Strength(也被称为:driving strength),表示“DRAM驱动强度”。这个参数用来控制内存数据总线的信号强度,数值越高代表信号强度越高,增加信号强度可以提高超频的稳定性。但是并非信号强度高就一定好。
所以,这里我们需要配置这个Drive Striegth,DDR2内存的所有线都需要配置,这里我们从地址线开始看,所有的引脚驱动强度都要设置:

设置方式:从Xm1ADDR[0:7]对应的是PM1_0寄存器,然后查找PM1_0寄存器的地址

 可以看到MP1_0DRV的地址是0xE02003CC,R/W,作用用来设置驱动强度的寄存器,起始值为0xAAAA,可以看出通过设置这个寄存器,我们把Xm1ADDR[0:7]8根地址总线的驱动强度都设置为2x

 

同样 Xm1ADDR[8:15]对应的是PM1_1寄存器,然后查找PM1_1寄存器的地址,地址为0xE02003EC,值设置为0xAAAA,即对应地址总线驱动强度为2x

剩余的按照上面一次类推,注意最后一个MP1_8的设置,值需要设置到MP1_8[4]即可,完成DMC0的驱动强度设置。

 

平台:S5PV210

DDR: 兼容 三星的一块芯片——NT5TU64M16GG-DDR2-1G-G-R18-Consumer

 

//---------28个步骤如下

step1.  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.

为了提供稳定的电源给控制器和内存设备,

控制器必须确保CKE维持低电平。

然后提供一个稳定的时钟。注意:XDDR2SEL需保持高来维持CKE为低

说明:XDDR2SEL在电路图设计中,一般直接拉到了VCC。

01310e11-c458-4303-8f52-769943535af8[9](图中NC表示没焊接)

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

根据时钟的频率,设置PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc 字段为正确的值。

设置PhyControl0.ctrl_dll_on字段为1开启PHY DLL。

7ae554c2-4e3d-4b42-9db1-4bdd08f65827[12]

ldr r1, =0x00101000 @PhyControl0 DLL parameter setting, manual 0x00101000

str r1, [r0, #DMC_PHYCONTROL0]

说明:

1、PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc 手册上说(This value should be 0x10 );ctrl_start_point 其实是开始相移的地方,ctrl_inc 每次相移的格数。

2、PhyControl0.ctrl_dll_on为1,开启dll。但是demo程序中此时并未打开dll,而是把打开这步骤放在了靠后的地方。

3、PhyControl0.ctrl_dfdqs为1,开启差分信号功能(具体需看硬件,支持差分,还是单端)

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step3. DQS Cleaning: Set the PhyControl1.ctrl_shiftc  and PhyControl1.ctrl_offsetc bit-fields to correct value according to clock frequency and memory tAC parameters.

DQS清除:设置the PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc

位字段,根据时钟频率和内存TAC参数。

DQS Cleaning 示意图如下:

497d21ad-c870-4aca-a601-e9e53decd2f3[4]

DQS Cleaning,其实就是想中和调板级的一些延时,如PCB延时等~~

ldr r1, =0x00000086 @PhyControl1 DLL parameter setting, LPDDR/LPDDR2 Case

str r1, [r0, #DMC_PHYCONTROL1]

bbb43490-e31e-406e-8bd8-e6c1b740d530[4]

说明:

1、ctrl_shiftc是粗调,通过控制器的DLL调整DQS的相移。(0x6 when DDR2 @200MHz)

2、ctrl_offsetc是精调,在ctrl_shiftc的基础上通过控制器的DLL调整DQS的相移。

3、ctrl_ref 是DLL同步完成之后需要的一个延时。默认是4这设置成8.

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step4. Set the PhyControl0.ctrl_start bit-field to ‘1’.  

开启PhyControl0.ctrl_start 位

96b8a15c-5551-4eed-9072-3bd7569c1747[4]

在dame代码中此时才打开ctrl_dll_on

ldr r1, =0x00101002 @PhyControl0 DLL on

str r1, [r0, #DMC_PHYCONTROL0]

然后打开ctrl_start

ldr r1, =0x00101003 @PhyControl0 DLL start

str r1, [r0, #DMC_PHYCONTROL0]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在配置,并开启之后,还需要等待一段时间,让DLL工作稳定的,在手册中到了第12步才去检查DLL是否稳定,而在damo程序中将

11和12步的内容提前到了第4步的后面,这样做主要是为了结构上的统一,也就是是一次性将DLL配置完。

而手册里那样做是为了节省配置时间,可以在配置其他的过程中等待DLL稳定。我们就先按照damo程序顺序进行分析,将12步提到前面来~~

step11 and step12

step11 .  Wait for the PhyStatus0.ctrl_locked  bit-fields to change to ‘1’. Check whether PHY DLL is locked.

step12 .   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.

7dc2b8e9-c867-4571-8f34-8eb035eec960[4]

find_lock_val:

ldr r1, [r0, #DMC_PHYSTATUS] @Load Phystatus register value

and r2, r1, #0x7

cmp r2, #0x7 @Loop until DLL is locked

bne find_lock_val

如果PhyStatus0的第3位全部为1,就表示我们之前配置的DLL按照我们设置的偏移(相对CLK的),已经工作稳定了。DLL为了完成这个过程,首先得不停的采集

clk,然后再不停的微调,这个过程是非常耗电的。所以在调整完成之后,DLL不需要在去跟踪clk了而是记录与CLK之前的一个差值,再保持这个差值即可,于是有了下面的程序:

and r1, #0x3fc0      @读出PhyStatus0的[13:14]

mov r2, r1, LSL #18     @左移18位,将PhyStatus0的[13:14]放到PhyControl0[31:24]

orr r2, r2, #0x100000     @恢复PhyControl0.ctrl_inc的值

orr r2 ,r2, #0x1000     @恢复PhyControl0.ctrl_istart_point的值

orr r1, r2, #0x3 @恢复PhyControl0低2位的值

str r1, [r0, #DMC_PHYCONTROL0] @存之

这段代码的含义就是把PhyStatus0的[13:14]为读出,将这段数据放到PhyControl0[31:24].

PhyStatus0的[13:14]的值是锁定完成后DQS与CLK的一个差值,把这个差值读出来之后放到PhyControl0[31:24],那么控制器就不再通过跟踪clk的方式,

而是通过固定延时的方式产生这个差值。

1dcea715-550d-43bd-aac3-bdc948e8b83e[4]

说明:

1、DQS是DLL根据clk产生的信号,这个信号也被称之为数据眼,DQS的主要作用就是告诉控制器何时读/写数据。确保数据的稳定接收和发送。

小节:

    到了这里,所以关于DLL的部分就配置完了,主要用到的寄存器只有3个:PhyControl0,PhyControl1,和PhyStatus0。

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

12步之后再才开始之前的第5步:

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

设置ConControl,此时应关闭自刷新计数器。

707e9763-331a-4b12-8a25-7536348045e0[4]

ldr r1, =0x0FFF2010 @ConControl auto refresh off

str r1, [r0, #DMC_CONCONTROL]

其中aref_en为0时就表示关闭自刷新计数器。

rd_fetch的设置是针对FIFO的读取时间的,设置成2更保险一点~~(默认值是1)

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

配置MemControl比较重要的就是以下这几位,突发长度,chip个数,总线宽度,内存类型。

其中一个MCD最多可以控制两个chip,这里根据开发板情况进行选择,这里num_chip位设置为1.

f7e3618d-8465-4591-a40e-b757fae1bead[4]

d84f9e30-2df9-4258-b5df-25b94ed35c80[4]

#define DMC0_MEMCONTROL 0x00202400  // MemControl BL=4, 1Chip, DDR2 Type, dynamic self

ldr r1, =DMC0_MEMCONTROL @MemControl BL=4, 1 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off

str r1, [r0, #DMC_MEMCONTROL]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

e1e7858a-d449-4817-9c89-189d9397aa73[4]

#define DMC0_MEMCONFIG_0 0x20F01323 // MemConfig0

ldr r1, =DMC0_MEMCONFIG_0 @MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed

str r1, [r0, #DMC_MEMCONFIG0]

这个寄存器的每一位都比较重要:

1、chip_base DRR的映射地址,默认0x2000_0000

ead4a6bd-6a1d-40fe-84b1-7e37e740b7d9[4]

2、chip_mask 确定一个chip的映射范围大小。1表示屏蔽,0表示不屏蔽。

如chip_mask  = F0表示屏蔽高4位,那么映射大小就是:

0X0~0X0FFF_FFFF,也就是256M

如chip_mask  = E0表示屏蔽高3位,那么映射大小就是:

0X0~0X1FFF_FFFF,也就是512M

3、chi_map表示内存的排列方式:(一般选择0,线性排列)

004f1e4a-d794-42b9-95b0-f8ff28d9fd3a[4]

4、chip_col 表示列的位数

5、chip_row表示行的位数

6、chip_bank 表示一块芯片的bank数

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step8. Set the PrechConfig  and PwrdnConfig registers.

现在可以开始配置PrechConfig预充电寄存器和 Pwrdown寄存器,但是damo程序中把 PwrdnConfig registers.的

配置放到了最后一步,所以这里先只讲述PrechConfig的配置。

971ecd99-05b3-4663-992e-a49add69b4bc[4]

ldr r1, =0xFF000000 @PrechConfig

str r1, [r0, #DMC_PRECHCONFIG]

这个寄存器用的其实是默认值,具体位的含义可以参考手册.

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step9. Set the TimingArefTimingRowTimingData and TimingPower registers according to memory AC  parameters. 

9.1 TimingAref

706d5a7e-e859-4949-ba6e-d7fb295735cc[4]

d4b36233-9c73-4136-ab92-02cc16d7e186[4]

#define DMC0_TIMINGA_REF 0x00000618

ldr r1, =DMC0_TIMINGA_REF @TimingAref

str r1, [r0, #DMC_TIMINGAREF]

因为ddr是需要不断的刷新保持数据的,而这个刷新间隔不能太长,一般ddr这个间隔时间参数就是7.8us,具体时间查看ddr手册。也就是说最长7.8us必须刷新一次。我们不能直接把7.8us告诉arm,必须转换成时钟周期数告诉给arm。及把时钟周期数放到TimingAref.t_refi字段即可。那么周期如何算?首先你得知道此时提供MCD的时钟是多大,比如是133M,那么周期数就是7.8 us * 133 MHz = 1038 = 0x40E;如果时钟是200M那么周期数就是7.8 us * 200MHz = 1,560= 0x618;

9.2 TimingRow,这个寄存器主要是配置一些ddr时序参数了,这些参数需要到具体型号的ddr手册中去一个个的找~~(当然同样,时间要转换为时钟周期数)

98945e96-837d-4d64-8bd0-720eae3ff7d9[4]

#define DMC0_TIMING_ROW 0x28233287 // TimingRow for @200MHz

ldr r1, =DMC0_TIMING_ROW @TimingRow for @200MHz

str r1, [r0, #DMC_TIMINGROW]

9.3 TimingData 这个寄存器和上面寄存器一样,需要到具体型号的ddr手册中去一个个的找

74871ad7-031a-4d29-8faa-dea916e24d8f[4]

其中需要注意的是cl,也就是CAS,

281bf73e-e649-47ae-9615-560fb89be812[4]

ddr手册中明确说明CAS可以配置为3,4,5,6这几个时钟周期。值得注意的是,目前我们配置的ddr控制器的CAS,之后还需配置ddr芯片本身的CAS。

所以,我们必须确保这两个CAS一致!

还有就是对于DDR2而言e6c2e3fe-8209-42f1-a266-71a66e520e1e[4],所以wl这参数不用配置。但是对于低功耗的ddr就必须配置了。

#define DMC0_TIMING_DATA 0x23240304 // TimingData CL=3

ldr r1, =DMC0_TIMING_DATA @TimingData CL=3

str r1, [r0, #DMC_TIMINGDATA]

9.4 TimingPower 也是一样

6a47a8dc-6292-4ecc-9ce8-e9ecc8e8a9da[4]

#define    DMC0_TIMING_PWR        0x09C80232    // TimingPower

ldr r1, =DMC0_TIMING_PWR @TimingPower

str r1, [r0, #DMC_TIMINGPOWER]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step10 If QoS scheme is required, set the QosControl0~15 and QosConfig0~15 registers.

现在不用Qos,跳过了~~。。。

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step11 and step12  被移到了第5步之前了~~

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step13.  Confirm whether stable clock is  issued minimum 200us after power on

由于step11 and step12被提到前面了,所以现在可以不等了~~

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step14~26 这些都是配置ddr芯片(而不是ddr控制器了),都是通过XXX寄存器向ddr芯片发送命令。

step14. Issue a NOP command using the DirectCmd register to assert and to hold CKE to a logic high level.

ldr r1, =0x07000000 @DirectCmd chip0 Deselect

str r1, [r0, #DMC_DIRECTCMD]

发送nop指令将CKE置高

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step15.  Wait for minimum 400ns.

因为此前CKE一直为高,所以这里无需再等。

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step16. Issue a PALL command using the DirectCmd register.

ldr r1, =0x01000000 @DirectCmd chip0 PALL

str r1, [r0, #DMC_DIRECTCMD]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

step17. Issue an  EMRS2 command using the DirectCmd register to program the operating p

该寄存器作用不大,全部置0

b357a2ac-405c-4602-9285-ef9554c681f8[4]

ldr r1, =0x00020000 @DirectCmd chip0 EMRS2

str r1, [r0, #DMC_DIRECTCMD]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

18. Issue an  EMRS3 command using the DirectCmd register to program the operating p

7ba48b2a-5907-4c0d-ae40-5aae0561e910[4]

ldr r1, =0x00030000 @DirectCmd chip0 EMRS3

str r1, [r0, #DMC_DIRECTCMD]

以上四个步骤对应下图:

57ed1770-cd14-4c7b-919a-27c8e10998fd[6]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

这说的EMRS 就是EMRS1.

5685825b-7be9-40ff-a1f5-8845c79a8952[4]

15a56d8e-3690-4cf1-85bc-0b50694ff19b[4]

这里感觉主要就是A10设置为1,禁止了差分的DQS,而使用单端。

8f36402a-48aa-4375-b93e-6cf6ef3c7a18[4]

ldr r1, =0x00010400 @DirectCmd chip0 EMRS1 (MEM DLL on, DQS# disable)

str r1, [r0, #DMC_DIRECTCMD]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

20. Issue a MRS command using the DirectCmd register to reset the memory DLL.

这一步配置MRS寄存器就很重要了~~

dfc134bf-056b-4da3-95d7-033f7e2fce5c[4]

A8为1,是因为该步骤说明中明确指明要——reset the memory DLL.

3c4a677f-9ffe-4926-ae4e-29da4ed4295b[4]

ldr r1, =0x00000542 @DirectCmd chip0 MRS (MEM DLL reset) CL=4, BL=4

str r1, [r0, #DMC_DIRECTCMD]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

21. Issue a PALL command using the DirectCmd register.

再次发送一个PALL指令,和16步一样

ldr r1, =0x01000000 @DirectCmd chip0 PALL

str r1, [r0, #DMC_DIRECTCMD]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

22. Issue two Auto Refresh commands using the  DirectCmd register.

连续发送两个 Auto Refresh指令

ldr r1, =0x05000000 @DirectCmd chip0 REFA

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x05000000 @DirectCmd chip0 REFA

str r1, [r0, #DMC_DIRECTCMD]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

23. Issue a MRS command using the DirectCmd register to program the operating para

the memory DLL.

该步和第20步相同,也是写MRS,唯一的不同是A8这个为不同此时置位1,也就是不再复位DLL。

ldr r1, =0x00000442 @DirectCmd chip0 MRS (MEM DLL unreset)

str r1, [r0, #DMC_DIRECTCMD]

92df4231-a092-46ce-af42-16c49aed4190[4]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

24.  Wait for minimum 200 clock cycles.

damo程序中并未等待~~

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

25. Issue an  EMRS  command using the DirectCmd register to program the  operating pa

  calibration is not used, issue an EMRS  command to set OCD Calibration Default. Aft

  command to exit OCD Calibration Mode  and to program the operating parameters.

7d09843e-6e8b-41e6-ab3f-276fb63c4d41[4]

通过写两次EMRS1配置OCD校准,可以看到第一次将OCD_Corr写成111,之后又写成000

113a6704-92ca-4b60-9973-eaac9690fd70[4]

ldr r1, =0x00010780 @DirectCmd chip0 EMRS1 (OCD default)

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00010400 @DirectCmd chip0 EMRS1 (OCD exit)

str r1, [r0, #DMC_DIRECTCMD]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

26. If there are two external memory chips, perform steps 14~25 for chip1 memory device.

如果DMC控制的是两个chip那么还需要配置一次chip1,就是把14~25重复一遍,只不过cmd_chip这个位要置1.

也就是说,到了这一步,关于ddr芯片的配置全部结束了。

ldr r1, =0x07100000 @DirectCmd chip1 Deselect

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x01100000 @DirectCmd chip1 PALL

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00120000 @DirectCmd chip1 EMRS2

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00130000 @DirectCmd chip1 EMRS3

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00110400 @DirectCmd chip1 EMRS1 (MEM DLL on, DQS# disable)

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00100542 @DirectCmd chip1 MRS (MEM DLL reset) CL=4, BL=4

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x01100000 @DirectCmd chip1 PALL

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x05100000 @DirectCmd chip1 REFA

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x05100000 @DirectCmd chip1 REFA

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00100442 @DirectCmd chip1 MRS (MEM DLL unreset)

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00110780 @DirectCmd chip1 EMRS1 (OCD default)

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00110400 @DirectCmd chip1 EMRS1 (OCD exit)

str r1, [r0, #DMC_DIRECTCMD]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

27. Set the ConControl to turn on an auto refresh counter.

到了这一步再次回到ddr控制器的配置。

这一步和第5步只有一处不同,就是aref_en,这里开启了ddr控制器的自刷新功能。

292ebdb4-6fd3-4f60-82a5-ad0040dee742[4]

ldr r1, =0x0FF02030 @ConControl auto refresh on

str r1, [r0, #DMC_CONCONTROL]

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

28. If power down modes is required, set the MemControl registers.

还记得第8部吗? Set the PrechConfig  and PwrdnConfig registers. 当时damo只配置了PrechConfig 而没有配置PwrdnConfig ,而在这里

damo程序对PwrdnConfig 进行了配置。但基本就是按默认值配置的。

0d530da7-b2f8-42af-94e3-e155cb5a4273[4]

ldr r1, =0xFFFF00FF @PwrdnConfig

str r1, [r0, #DMC_PWRDNCONFIG]

程序再次设置了MemControl,这和第6步完全相同。这个步骤的本意是如果需要power down modes那么就去设置MemControl去使能相应的为,但是damo程序不想

power down modes这个功能,所以即使配置了PrechConfig也只是“做个样子”。

50741f46-e3b9-4d57-b5a0-8c33db30603e[4]

e2ae71c9-6610-402e-99a8-61bf828c47c3[4]

e7da02ae-c57a-4d46-aea7-adf7d958f280[4]

MemControl

ldr r1, =0x00202400 @MemControl BL=4, 1 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off

str r1, [r0, #DMC_MEMCONTROL]

 

最后,总结一下值得注意的地方:

1、damo程序和手册的顺序不是完全一致的,总体来说damo程序是为了程序结构看起来更好做了一些小调整。

2、step1~step13 是对DDR控制器的配置。

step14~step26 是对DDR芯片寄存器进行配置。

step27和28,又再次配置了DDR控制器。

3、 在step1~step13中,前半部分主要是对ddr控制器的DLL进行配置,后半部部分是告诉控制器一些关于ddr的内存的型号大小以及时序参数。

4、step14~step26,主要是通过arm的DirectCmd寄存器对ddr的几个寄存器进行配置。这些寄存器分别是MRS,EMRS1  ,EMRS2  ,EMRS3. 这些被称之为DDR的模式寄存器。

5、模式寄存器用地址线传输数据,而不是数据线,因为所以的memory device地址线共享,这样传送就能一步到位。

6、如何通过arm的DirectCmd寄存器,配置ddr的模式寄存器:

57ed1770-cd14-4c7b-919a-27c8e10998fd[7]

当com_type字段为0时表示要配置ddr的模式寄存器,具体配置那个模式寄存器再看cmd_bank字段,

当cmd_bank = 0 表示配置MRS

当cmd_bank = 1表示配置EMRS1(注意EMRS1就是arm手册中说的EMRS)

当cmd_bank = 2表示配置EMRS2

当cmd_bank = 3表示配置EMRS3


转自:http://www.cnblogs.com/douzi2/

转自:http://www.cnblogs.com/biaohc/p/6346949.html

这篇关于DDR2(SDRAM)初始化 28个步骤总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672352

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel