1. 程式人生 > >專題8-記憶體初始化

專題8-記憶體初始化

對於記憶體:

SRAM一般作為cpu的墊腳石(儲存較快,不需要重新整理)
DRAM:分為SDRAM、DDR 、DDR2(需要重新整理,儲存相對較慢)

2440的記憶體是64M,是由兩個32M的記憶體晶片與處理器連接合成的。處理器共有27根地址線,可以訪問2的27次方,即128M記憶體,由於有8個片選端,即總共可以訪問128*8=1G的記憶體。對於2440,cpu的低16位地址線分別連線兩塊32M的記憶體晶片,32位的資料線的前16位與後16位分別連線兩塊記憶體的資料線,即一個時鐘週期最多可以同時傳送32bit的資料。
這裡寫圖片描述
檢視datasheet的memory controler可以發現,bank0為cpu的墊腳石,一般bank6與bank7作為記憶體區域,起始地址為0x30000000。此時需要配置儲存控制暫存器,包括配置資料匯流排寬度

是否等待控制等。
因為比方說,*0x30008000=0x5;
0x30008000屬於哪一個bank,行地址、列地址是什麼——需要儲存控制器做一個分解與解析,再對該記憶體處(norflash、網絡卡、記憶體等)寫入相應值。
這裡寫圖片描述

按照datasheet的儲存控制器配置以下7個暫存器:
這裡寫圖片描述
程式碼如下:

#define mem_contrl 0x48000000  % BWSCON:Bus width & wait status control register
init_sdram:
    ldr r0, =mem_contrl 
    add r3, r0, #4*13
    adrl r1, mem_data  %adrl與adr指令類似,為偽指令其載入的地址範圍要寬,為32
0: ldr r2, [r1], #4 str r2, [r0], #4 cmp r0, r3 bne 0b %不等於0跳轉到0處,b表示向前跳轉 mov pc, lr mem_data: .long 0x22000000 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00018001 .long 0x00018001 .long 0x008c04f5 .long 0x000000b1 .long 0x00000030 .long 0x00000030