說白了 2440的控制器可以理解為stm32里面的FMSC 大同小異
可以外部尋址1GB的范圍黎做。是CPU和外部外設通訊的中間總線裝置浇垦。?
例如網(wǎng)卡 SDRAM擴展串口等都是通過這個控制器去連接CPU
現(xiàn)在開始學習SDRAM的內(nèi)容
SDRAM 我們用的是EM63A165TS
1. NOR FLASH 和 NAND FLASH 程序啟動方式
當用nor Flash的時候:0 地址是指向nor flash 里面讀取指令
當用nand flash的的時候: 會把nand flash的前4K的代碼復制到內(nèi)部4k內(nèi)存里面
在2440里面 bank 7和bank6必須大小相等
bank1 的大小因為是連接在boot引腳上 所以需要用硬件(OM1 和OM2 引腳去調(diào)節(jié) 位寬)
BWSCON:? 每四個位控制一個bank 最高4位對應bank7?
(1)组橄。 STx:設置啟動禁止SDRAM 的數(shù)據(jù)掩碼引腳 對于SDRAM 這個位應該是0 對于SRAM應該是1
(2)。WSx:是否使用儲存器Wait信號
(3)DWx: 使用bank的位寬?
在這里 我們的SDRAM連到了BANK6 (CS6)
其中 UB/LB 是表示高8位和低8位
Bank6的起始地址是0x3000_000
BANKCONx:
控制BANK0~BANK5 外接設備的訪問時序琴锭, 使用默認的0x0700?
控制BANK6~BANK7:(1) BANK MT([15:16])但是為00 的時候是SRAM 11的時候是SDRAM
當設置成00 的時候 后面的設置和Bank0~bank5 的設置一樣
當設置成01的時候:
Trcd[3:2]: RAS to CAS delay 行到列之間的延遲 應該設置為1
SCAN【1:0】: SDRAM的列地址位數(shù) (本芯片是9位)所以是01
REFRESH:
SDRAM必須開啟刷新功能
22位: 自動刷新
21位: 0
20:0
19:18: 默認值11
10:0:( 2^11 - refresh_count+1)/HCLK
BANKSIZE:?
7: 突發(fā)傳輸
6: 使用SCKE令SDRAM進入省電模式
4: 盡在訪問SDRAM的時候發(fā)出SCLK信號
2:0: bank6/7的大小是可以變化的 這里是64MB
這就是設置的方法?
程序:
@*************************************************************************
@ File:head.S
@ 功能:設置SDRAM紊搪,將程序復制到SDRAM,然后跳到SDRAM繼續(xù)執(zhí)行
@*************************************************************************? ? ?
.equ? ? ? ? MEM_CTL_BASE,? ? ? 0x48000000
.equ? ? ? ? SDRAM_BASE,? ? ? ? 0x30000000
.text
.global _start
_start:
? ? bl? disable_watch_dog? ? ? ? ? ? ? @ 關閉WATCHDOG,否則CPU會不斷重啟
? ? bl? memsetup? ? ? ? ? ? ? ? ? ? ? ? @ 設置存儲控制器
? ? bl? copy_steppingstone_to_sdram? ? @ 復制代碼到SDRAM中
? ? ldr pc, =on_sdram? ? ? ? ? ? ? ? ? @ 跳到SDRAM中繼續(xù)執(zhí)行
on_sdram:
? ? ldr sp, =0x34000000? ? ? ? ? ? ? ? @ 設置堆棧??因為makefile里面一開始指向的是300000 前面的幾? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?行都是占用堆棧的(每條指令+4)俐巴。骨望。所以這里的指針指向的? 是main的地址。? 內(nèi)存是64MB所以是棧頂?
? ? bl? main
halt_loop:
? ? b? halt_loop
disable_watch_dog:
? ? @ 往WATCHDOG寄存器寫0即可
? ? mov r1,? ? #0x53000000
? ? mov r2,? ? #0x0
? ? str r2,? ? [r1]
? ? mov pc,? ? lr? ? ? @ 返回
copy_steppingstone_to_sdram:
? ? @ 將Steppingstone的4K數(shù)據(jù)全部復制到SDRAM中去
? ? @ Steppingstone起始地址為0x00000000欣舵,SDRAM中起始地址為0x30000000
? ? mov r1, #0
? ? ldr r2, =SDRAM_BASE
? ? mov r3, #4*1024
1:?
? ? ldr r4, [r1],#4? ? @ 從Steppingstone讀取4字節(jié)的數(shù)據(jù)擎鸠,并讓源地址加4
? ? str r4, [r2],#4? ? @ 將此4字節(jié)的數(shù)據(jù)復制到SDRAM中,并讓目地地址加4
? ? cmp r1, r3? ? ? ? ? @ 判斷是否完成:源地址等于Steppingstone的未地址缘圈?
? ? bne 1b? ? ? ? ? ? ? @ 若沒有復制完劣光,繼續(xù)
? ? mov pc,? ? lr? ? ? @ 返回
memsetup:
? ? @ 設置存儲控制器以便使用SDRAM等外設
? ? mov r1,? ? #MEM_CTL_BASE? ? ? @ 存儲控制器的13個寄存器的開始地址
? ? adrl? ? r2, mem_cfg_val? ? ? ? @ 這13個值的起始存儲地址
? ? add r3,? ? r1, #52? ? ? ? ? ? @ 13*4 = 54
1:?
? ? ldr r4,? ? [r2], #4? ? ? ? ? ? @ 讀取設置值,并讓r2加4
? ? str r4,? ? [r1], #4? ? ? ? ? ? @ 將此值寫入寄存器糟把,并讓r1加4
? ? cmp r1,? ? r3? ? ? ? ? ? ? ? ? @ 判斷是否設置完所有13個寄存器
? ? bne 1b? ? ? ? ? ? ? ? ? ? ? ? ? @ 若沒有寫成绢涡,繼續(xù)
? ? mov pc,? ? lr? ? ? ? ? ? ? ? ? @ 返回
.align 4
mem_cfg_val:
? ? @ 存儲控制器13個寄存器的設置值
? ? .long? 0x22011110? ? ? @ BWSCON
? ? .long? 0x00000700? ? ? @ BANKCON0
? ? .long? 0x00000700? ? ? @ BANKCON1
? ? .long? 0x00000700? ? ? @ BANKCON2
? ? .long? 0x00000700? ? ? @ BANKCON3?
? ? .long? 0x00000700? ? ? @ BANKCON4
? ? .long? 0x00000700? ? ? @ BANKCON5
? ? .long? 0x00018005? ? ? @ BANKCON6
? ? .long? 0x00018005? ? ? @ BANKCON7
? ? .long? 0x008C07A3? ? ? @ REFRESH
? ? .long? 0x000000B1? ? ? @ BANKSIZE
? ? .long? 0x00000030? ? ? @ MRSRB6
? ? .long? 0x00000030? ? ? @ MRSRB7