在飞思卡尔iMX31上,如何将SDRAM地址转换为CPU地址?

Ye *_*Liu 5 embedded microcontroller assembly arm

我是iMX31和嵌入式系统的新手,请帮助我理解从SDRAM地址到ARM CPU地址的转换,特别是在SDRAM控制器的"特殊"命令模式下.

这是我有问题的SDRAM初始化代码:

    ldr r0, ESDCTL_BASE_W
    mov r2, #SDRAM_BASE_ADDR /* 0x80000000 */

    ldr r1, =0x92100000 /* Precharge */
    str r1, [r0]
    ldr r1, =0x0
    ldr r12, =0x80000F00
    str r1, [r12]

    ldr r1, =0xA2100000 /* Auto-refresh */
    str r1, [r0]
    ldr r1, =0x0
    str r1, [r2]

    ldr r1, SDRAM_0xB2100000 /* Load Mode Register */
    str r1, [r0]
    ldr r1, =0x0
    strb r1, [r2, #0x33]

    ldr r1, =0xFF
    ldr r12, =0x81000000
Run Code Online (Sandbox Code Playgroud)

我的RAM是Micron LPDDR MT46H64M32LF,这段代码很好地遵循初始化程序,但在PRECHARGE步骤中,地址0x80000F00来自何处?

从iMX31参考手册中我了解到,在PRECHARGE步骤中,我需要将SDRAM引脚设置A10为HIGH,从而产生PRECHARGE ALL.以下是来自RM的PRECHARGE的文字:

...在此模式下,对SDRAM/LPDDR地址空间的访问(读或写)将产生预充电命令周期.SDRAM/LPDDR地址位A10确定单个存储体或所有存储体是否由命令预充电.访问SDRAM/LPDDR地址A10为低电平的地址将仅对存储区地址选择的存储区进行预充电,如图19-75所示.相反,A10为高电平的访问将为所有存储区预充电,而不管存储区地址,...请注意,A10是SDRAM引脚,而不是A10位ARM地址总线.将SDRAM A10转换为相应的ARM地址取决于内存配置.

这是"特殊"模式下多路复用地址总线的另一个文本:

在"特殊"模式中,例如,预充电模式(SMODE = 1)或负载模式寄存器(SMODE = 3)没有地址转换,是指CPU地址A0在所有存储器宽度映射在MA0.例如,为了驱动MA10位(对于precharge all命令),应该设置CPU A10位(对于16位或32位外部器件).相同的逻辑对于加载模式寄存器命令有效,如第19.5.4.1节"SDRAM初始化"中的初始化例程示例所示.

根据上面的文字并假设A0是第一位0x80000000,将A10设置为1应该给出地址0x80000400,而不是0x80000F00代码中的地址.为什么???有什么与DDR的特点有关吗?如何在SDRAM引脚和ARM CPU地址之间进行正确的转换?

更新:我在这里展示的代码片段应该与DDR一起使用.对于SDRAM,它实际上使用0x80000400预充电.