SDRAM初始化过程如下:
1、加电
2、延迟指定时间,从第一个sdram的clk开始,通常为100us。具体值请参考SDRAM手册
3、延迟一些自动刷新周期,通常为两个
4、设置自动刷新寄存器
5、等待一定时间以后开始写模式寄存器
以下程序以L7205SDB为例
AREA STARTUP ,CODE, READONLY
ENTRY
4 {$ n! y4 ^& ]% W4 I7 bstart
;关中断
LDR R4,=0X90001000
MVN R5,#0
STR R5,[R4,#0X0C]
STR R5,[R4,#0X10C]
$ x! V. }6 X1 w' T; O;延时
LDR R4,=0XFF
01 SUBS R4,R4,#0X01
BNE %B01 ;%B01表示向后搜索标号01
;1)NEXT寄存器
LDR R4,=0X80050004
LDR R5,=0X05FD4717
STR R5,[R4]
2 G# m4 E9 }- l7 I1 J3 ~& f+ P; r' l- Q;2)运行寄存器
LDR R4,=0X8005000C
LDR R5,=0X014717
STR R5,[R4]
2 J- [! @! {: y4 C1 @/ p1 D3 _; @;3)命令寄存器
LDR R4,=0X80050010
LDR R5,=0X01
STR R5,[R4]
;4)设置enable
LDR R4, =0X80050030
LDR R5,[R4]
0RR R5,R5,#0X4
STR R5,[R4]
;5)延时200us
MOV R4,#0X1000
15 SUBS R4, R4,#1
BNE %B15
;6)使能slot1、slot2的7、3位
LDR R4,=0XD0000000
LDR R5,[R4]
ADD R5,R5,#0X88
STR R5,[R4]
$ `; f5 J' N# E;7)refresh timer
LDR R4,=0XD0000004
LDR R5,=0X8
STR R5,[R4]
;8)auto refresh enable 23位
LDR R4,=0XD0000000
LDR R5,[R4]
ADD R5,R5,#(1<<23)
STR R5,[R4]
;9)延时1us
MOV R4,#0X16
15 SUBS R4,R4,#1
BNE %B15
;10)设置模式寄存器
LDR R4,=0XE0000000+(3<<11)+(2<<15)
LDR R5,[R4]
ADD R5,R5,#(1<<24)
STR R5,[R4]
;11)WD,WM位
LDR R4,=0XD0000000
LDR R5,=0X00EF00CE
ORR R5,R5,#0X30000
STR R5,[R4]
;12)refresh timer
LDR R4,=0XD0000000
LDR R5,=0X200
STR R5,[R4,#4]
;13)timer buffer register
LDR R4,=0XD0000000
LDR R5,=0X55
STR R5,[R4,#0X8]
+ x0 b1 C0 t$ A4 Z;14)禁止MMU
MOV R4,#0X0
MCR P15,0,R4,C1,C0,0
;15)halt
MOV R4,#0X0 ;这个无意义
; S0 G8 ]% _' U, ^0 B% b;16)设置MMU
SETUPMMU R4,R5,R2,R3,R9,R7 ;通过SETUPMMU宏来设置MMU
) R. F5 A1 d P;17)halt
MOV R4,#0X0
;18)重映射
UNMAPROM R4,R5 ;通过宏UMMAPROM来把R5映射到地址R4即0X0处
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)
* w( y# K8 k. y* NDisableMMU 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虚拟存储空间的地址映射关系。
* p$ |+ {! c) |; n6 j! JMACRO
$label SETUPMMU $base,$desc,$tmp,$tmp2,$cnt,$indx
) b# Q, d7 p8 l) EROUT
;用于调试时增加可读性
[ O=0 ;IF
NOP
NOP
] ;ENDIF
& X9 J4 s7 j9 p8 e;禁止MMU
MOV $tmp,#DisableMMU
WriteCP15_Control $tmp
# q; @, t+ s* w;自动识别系统中SDRAM大小,并把结果保存到系统中特定位置
AutoSizeSDRAM $tmp,$tmp2,$base,$desc,$cnt,$indx
( s8 j7 a& @" yMOVS $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
: S, P4 m4 O2 u6 i) I% U0 c( g01 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, A8 Y: b6 X9 Z8 \2 s3 b
LDR $indx,=VirtualPagetableBase9 I/ S! X8 S" @4 W, s1 a) k C
LDR $tmp,=0xfff00000
AND $indx,$tmp,$index ;读取虚拟地址的高12位! f+ G) U! [2 M5 \+ l" _
ORR $desc,$desc,$indx ;得到(高12+存储访问属性)
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)
/ @: `9 p) J. c; v- h5 {5 q! A. c03 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)
) c/ n! D5 P4 C' g/ Z" P04 STR $desc ,[$indx],#4
ADD $desc,$desc,#(1<<20)
SUBS $cnt ,$cnt ,#1
BNE %B04
/ ?7 k: E6 [# ^# Y/ 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)
05 STR $desc ,[$indx],#4
ADD $desc,$desc,#(1<<20)
SUBS $cnt ,$cnt ,#1
BNE %B05
7 j# r+ h& ^, C* d1 j2 R+ V$ W;清空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
;等待流水线上指令执行完
NOP
NOP
NOP
NOP
NOP
MEND
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) | Powered by Discuz! X3.2 |