EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SDRAM初始化过程如下: 1、加电 2、延迟指定时间,从第一个sdram的clk开始,通常为100us。具体值请参考SDRAM手册 3、延迟一些自动刷新周期,通常为两个 4、设置自动刷新寄存器 5、等待一定时间以后开始写模式寄存器 以下程序以L7205SDB为例 AREA STARTUP ,CODE, READONLY ENTRY ; f+ R9 D% h; u0 ^% V' i
start ;关中断 LDR R4,=0X90001000 MVN R5,#0 STR R5,[R4,#0X0C] STR R5,[R4,#0X10C]
; B) q! q4 `% W" N2 V/ Q ;延时 LDR R4,=0XFF 01 SUBS R4,R4,#0X01 BNE %B01 ;%B01表示向后搜索标号01
$ |9 P" U& v- ?7 i J5 @ ;1)NEXT寄存器 LDR R4,=0X80050004 LDR R5,=0X05FD4717 STR R5,[R4] 6 ^1 ~2 w# A# y- f! [3 ]
;2)运行寄存器 LDR R4,=0X8005000C LDR R5,=0X014717 STR R5,[R4] 4 g4 L. ]& L6 ~% z
;3)命令寄存器 LDR R4,=0X80050010 LDR R5,=0X01 STR R5,[R4] ( {2 }( W+ F$ H8 c2 q. Y# Y
;4)设置enable LDR R4, =0X80050030 LDR R5,[R4] 0RR R5,R5,#0X4 STR R5,[R4]
, ?; e. e( }1 p& T" [2 E ;5)延时200us MOV R4,#0X1000 15 SUBS R4, R4,#1 BNE %B15 & x& a7 G7 K6 Y7 H4 g* j
;6)使能slot1、slot2的7、3位 LDR R4,=0XD0000000 LDR R5,[R4] ADD R5,R5,#0X88 STR R5,[R4] 9 E" C* ^! l, X* Y
;7)refresh timer LDR R4,=0XD0000004 LDR R5,=0X8 STR R5,[R4]
! I) _! G1 F9 ^" T ;8)auto refresh enable 23位 LDR R4,=0XD0000000 LDR R5,[R4] ADD R5,R5,#(1<<23) STR R5,[R4]
1 J/ Z p% G' x0 ?: E8 D ;9)延时1us MOV R4,#0X16 15 SUBS R4,R4,#1 BNE %B15 - |% b; Z, V& J: ?& h5 ~" Z
;10)设置模式寄存器 LDR R4,=0XE0000000+(3<<11)+(2<<15) LDR R5,[R4] ADD R5,R5,#(1<<24) STR R5,[R4] ! w0 T: \. h4 Z
;11)WD,WM位 LDR R4,=0XD0000000 LDR R5,=0X00EF00CE ORR R5,R5,#0X30000 STR R5,[R4]
+ F7 S. Z0 R4 J) }: P$ C ;12)refresh timer LDR R4,=0XD0000000 LDR R5,=0X200 STR R5,[R4,#4]
+ L" ` {7 y. Q9 q ~9 a ;13)timer buffer register LDR R4,=0XD0000000 LDR R5,=0X55 STR R5,[R4,#0X8] / E9 a7 G0 ^6 |# E
;14)禁止MMU MOV R4,#0X0 MCR P15,0,R4,C1,C0,0
) m' X* T5 Q7 D ;15)halt MOV R4,#0X0 ;这个无意义
. X) d( x* c" h2 {) ?# @/ Q/ m- \2 X ;16)设置MMU SETUPMMU R4,R5,R2,R3,R9,R7 ;通过SETUPMMU宏来设置MMU ' b& p: u: a$ _. m4 |6 u% ?
;17)halt MOV R4,#0X0 ; a+ }) O O' O; d9 M$ V1 F; t9 w
;18)重映射 UNMAPROM R4,R5 ;通过宏UMMAPROM来把R5映射到地址R4即0X0处
: E! j* H8 d, }8 E, Y7 l1 ]haltthere ;19)halt MOV R4,#0X0 Config32 EQU 0X0 MMUOn EQU 0X01 CacheOn EQU 0X04 WriteBufferOn EQU 0X08 PageTableSize EQU (1<<14) SDRAM_Bank1_High EQU (0XF1000000) SDRAM_Bank2_High EQU (0XF2000000) SDRAM_Bank1_Low EQU (0XF0000000) SDRAM_Bank2_Low EQU (0XF1000000) PageTableBase2 EQU SDRAM_Bank2_High-PageTableSize PageTableBase1 EQU SDRAM_Bank1_High-PageTableSize PageTableEntryCount EQU (0X1000) VirtualPageTableBase EQU PageTableBase2 IOCS0Base EQU (0X24000000) IOCS0Size EQU (0X4000000) IOCS1Base EQU (0X10000000) IOCS0Size EQU (0X4000000) SRAMBase EQU (0X60000000)
/ g$ ~5 d' a/ B. \; E* x' q5 uDisableMMU EQU (Config32:OR:0X40) EnableMMU32 EQU (Config32:OR:0X40:OR:MMUOn) EnableMMUCW32 EQU (Config32:OR:0X40:OR:MMUOn:OR:CacheOn:OR:WriteBufferOn) ;宏SETUPMMU生成一级页表,建立以1MB为单位的4G虚拟存储空间的地址映射关系。 7 P2 N+ g% S2 v M2 t) L: P; H
MACRO $label SETUPMMU $base,$desc,$tmp,$tmp2,$cnt,$indx
0 _# n, }3 x6 DROUT ;用于调试时增加可读性 [ O=0 ;IF NOP NOP ] ;ENDIF
& ~( ?' ~' u( P' X# E;禁止MMU MOV $tmp,#DisableMMU WriteCP15_Control $tmp 9 P4 `. \4 p0 S1 O, G
;自动识别系统中SDRAM大小,并把结果保存到系统中特定位置 AutoSizESDRAM $tmp,$tmp2,$base,$desc,$cnt,$indx
& }+ u4 ^1 n. a5 z e0 S) T MOVS $tmp2,$tmp,LSR #16 EOR $cnt ,$tmp,$tmp2,LSL #16 LDRNE $base ,=PageTableBase2 LDREQ $base,=PageTableBase1 STR $tmp2, [$base,#-4] STR $cnt ,[$base,#-8] ;保存一级页表的物理地址 STR $base ,[$base,#-12] ;计算扩展槽1中SDRAM的起始地址,以便使SDRAM1和SDRAM2地址连续 ;address=Bank 1 base address +Total possible size of bank1-actual size of bank 1 ;address =0xF0000000+16MB-Size LDR $indx ,=SDRAM_Bank1_High SUB $indx,$indx,$cnt,LSL #20 ;保存该起始地址 STR $indx, [$base,#-16] ;建立4G的虚拟地址空间到物理空间的映射关系 ;各块的存储访问属性设置成uncached、unbuffered ;各块的域标识设置成domain 0 客户类型 ;各块的存储访问权限设置成允许所有权限 LDR $desc,=MMU_STD_ACCESS MOV $indx ,$base LDR $cnt ,=PageTableEntryCount 9 B( O: ?2 T; [$ v9 c" g. [$ C
01 STR $desc ,[$indx],#4 ADD $desc,$desc,#(1<<20) SUBS $cnt ,$cnt ,#1 BNE %B01 ;建立包含页表的页存储的地址映射关系 ;该页默认的虚拟空间在扩展槽2的高端16KB的区域 ;如果系统扩展槽2中有SDRAM存在,则该存储页的地址映射关系不变 ;如果系统扩展槽2中没有SDRAM存在,则将该存储页映射到扩展槽1的高端 LDR $desc,=MMU_STD_ACCESS
* Y; J4 k9 E1 M( A; m* _2 K( Z LDR $indx,=VirtualPagetableBase, q7 V( r8 j9 I0 j- R" P( d
LDR $tmp,=0xfff00000
# w: P, O# ]2 ~. V AND $indx,$tmp,$index ;读取虚拟地址的高12位* f( d4 J, Z% f. x, h6 I" W
ORR $desc,$desc,$indx ;得到(高12+存储访问属性)
- F8 U5 c) C$ v" o2 n% X ADD $indx,$base,$base,lsr #(20) STR $desc,[$indx] ;建立CS0选择的静态存储器的虚拟地址空间到物理地址空间的映射关系 ;CS0选择的SDRAM的物理地址空间为0X24000000 ;现在将虚拟空间0X0映射到0X24000000 ;各块得存储访问属性设置成cacheable、bufferable ;各块的与标识设置为domain 0客户属性 ;各块的存储访问权限设置成允许所有权限 LDR $desc, =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT) LDR $indx, =IOCS0Base LDR $tmp, =0xFFF00000 AND $indx,$tmp,$indx ORR $desc,$desc,$indx ;得到(高12+存储访问属性) ADD $indx ,$base,$indx,LSR #20 LDR $cnt ,=(IOCS0Size>>20) & g; v1 S- T- e/ V4 Q/ X- J5 c
03 STR $desc ,[$indx],#4 ADD $desc,$desc,#(1<<20) SUBS $cnt ,$cnt ,#1 BNE %B03 ;建立CS1选择的静态存储器的虚拟地址空间到物理地址空间的映射关系 ;CS1选择的SDRAM的物理地址空间为0X1000 0000 ;现在将虚拟空间0X0映射到0X1000 0000 ;各块得存储访问属性设置成cacheable、bufferable ;各块的与标识设置为domain 0客户属性 ;各块的存储访问权限设置成允许所有权限 LDR $desc, =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT) LDR $indx, =IOCS1Base LDR $tmp, =0xFFF00000 AND $indx,$tmp,$indx ORR $desc,$desc,$indx ;得到(高12+存储访问属性) ADD $indx ,$base,$indx,LSR #20 LDR $cnt ,=(IOCS1Size>>20) 6 f; b7 O* L- x& r
04 STR $desc ,[$indx],#4 ADD $desc,$desc,#(1<<20) SUBS $cnt ,$cnt ,#1 BNE %B04 ' N$ I4 ]4 ~, ]5 k8 y
;建立片内SRAM的虚拟地址空间到物理地址空间的映射关系 ;SRAM的物理地址空间为0X60000000 ;现在将虚拟空间0X0映射到0X60000000 ;各块得存储访问属性设置成cacheable、bufferable ;各块的与标识设置为domain 0客户属性 ;各块的存储访问权限设置成允许所有权限 LDR $desc, =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT) LDR $indx, =SRAMBase LDR $tmp, =0xFFF00000 AND $indx,$tmp,$indx ORR $desc,$desc,$indx ;得到(高12+存储访问属性) ADD $indx ,$base,$indx,LSR #20 LDR $cnt ,=(SRAMSize>>20)
2 y4 q- Q) j ]/ j2 ]6 u, O1 `05 STR $desc ,[$indx],#4 ADD $desc,$desc,#(1<<20) SUBS $cnt ,$cnt ,#1 BNE %B05 l6 v0 s/ w9 v, ^# H: O. s7 i
;清空cache以及写缓冲区 ;重新使能MMU ;设置域访问控制寄存器为domain 0 ;其他域没有任何访问权限 LDR $tmp, =0x5555 5555 WriteCP15_DAControl $tmp WriteCP15_TTBase $base MOV $tmp ,#0 ;清空cache CP15_FlushIDC $tmp ;清空TLB CP15_FlushTLB $tmp ;重新使能cache和写缓冲区 MOV $tmp , #EnableMMUCW32 WriteCP15_Control $tmp
, v) s# }6 A% l7 D7 T! a, b ;等待流水线上指令执行完 NOP NOP NOP NOP NOP MEND
& P6 u/ ^# \& n1 Z5 }! l" A, k |