我正在开发一款基于iMX31平台的新主板,这款主板有一个 Micron的单芯片256MB LPDDR(MT46H64M32LFCM-6)和我使用NAND来实现 启动电路板(BOOT [4:0] = 00001)。
我们知道,一旦RedBoot开始运行,它将首先初始化系统,然后复制 其代码的第一个2KB从NAND到DDR,然后跳转到内存位置 DDR并从那里运行代码。但在我的情况下,改为程序计数器只是 把我的板变成了一块无声的砖。以下是我正在谈论的代码片段 约:
1: ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
blo 1b
/* Jump to SDRAM */
ldr r1, CONST_0x0FFF
and r0, pc, r1 /* offset of pc */
ldr r1, MXC_REDBOOT_ROM_START
add r1, r1, #0x10
add pc, r0, r1
nop
nop
nop
nop
...
一旦add pc, r0, r1
被执行,整个事情就会停止。我已经验证了我的DDR
初始化是正确的(所有时序参数,ROW = 14,COL = 10和数据总线
size = x32),我已经运行了几次没有失败的内存测试,所以我很漂亮
对控制器和内存芯片本身很有信心。在RedBoot,一切
看起来和工作正常,直到我必须手动设置程序计数器的值
在DDR内存映射范围内的某个地方。
我已经在这里呆了几天了,我仔细检查了我复制到DDR的数据 与NAND中的相同,PC的价值也是正确的。
请帮助,谢谢!
答案 0 :(得分:1)
ARM并没有停止,因此确定执行实际继续的位置会很有用。它将是两个地方之一:
我会在中断向量上设置'陷阱',使它们循环到自己。通过这种方式,您可以在“挂起”之后看到PC指向的任何地方将告诉您发生了什么。
在装配中它看起来像这样:
B _reset /* Reset */
B . /* Undefined Instruction */
B . /* Software Interrupt*/
B . /* Prefetch Abort*/
B . /* Data Abort*/
B . /* Reserved*/
B . /* IRQ*/
B . /* FIQ*/
只需在内存开头(0x00000000)找到此代码,然后重新运行程序。如果它挂起在0x0000000C(预取中止)或0x000000010(数据中止),则可能是SDRAM配置或MMU权限。如果它挂在其他地方那么加载PC的代码有问题,可能是用错误的地址加载它。
希望有所帮助!