2011-03-31 61 views
2

我正在開發一個基於iMX31平臺的新主板,該主板有一個 單片機,來自Micron的256MB LPDDR(MT46H64M32LFCM-6),我用NAND到 啓動主板(BOOT [4 :0] = 00001)。我們知道,一旦RedBoot開始運行,它將首先初始化系統,然後將其代碼的前2KB從NAND複製到DDR,然後跳轉到DDR的內存位置,然後從那裏運行代碼。但在我的情況下,更改爲程序櫃檯只需 將我的主板變成無聲磚。以下是代碼片段我說 約:RedBoot不能從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的價值也是正確的。

請大家幫忙,謝謝!

+1

你是如何處理你的緩存?你在使用它嗎?在嘗試執行新代碼之前刷新它嗎?如果它已打開,請嘗試關閉緩存並查看是否有幫助。 – Splat 2011-04-01 03:10:59

+0

@Splat在CPU初始化期間,L2緩存被禁用。 – 2011-04-01 15:30:11

+0

是否包含啓用了RAM的內存範圍?如果沒有,它會拋出異常,你可能還沒有設置。 – 2011-04-30 11:51:09

回答

1

ARM不僅停止,所以確定執行實際上在哪裏繼續會很有用。它將是以下兩個地方之一:

  1. 您寫入PC的PC值。這可能會或可能不會在你期望的地方。如果可能的話,使用調試器來驗證R0實際上是您期望的SDRAM中的位置。
  2. 一個異常,可能是異常異常,如預取中止。這意味着存儲在PC中的指令位於由於MMU的權限或配置問題(SDRAM?)而無法訪問的內存位置。

我會在中斷向量上設置「陷阱」,使它們自行循環。通過這種方式,您可以在「掛起」會告訴您發生了什麼事後看到PC指向的任何位置。

在組裝它看起來像這樣:

B _reset /* Reset */ 
B . /* Undefined Instruction */ 
B . /* Software Interrupt*/ 
B . /* Prefetch Abort*/ 
B . /* Data Abort*/ 
B . /* Reserved*/ 
B . /* IRQ*/ 
B . /* FIQ*/ 

在內存(00000000)開始就找到該代碼並重新運行程序。如果它掛起在0x0000000C(預取中止)或0x000000010(數據中止),那麼它可能是SDRAM配置或MMU權限。如果它掛在別的地方,那麼加載PC的代碼會出現問題,可能是加載了錯誤的地址。

希望有幫助!