5.1.3 SDRAM代码样例
下面是13个存储寄存器的设定范例
ldr r0, =SMRDATA
ldmia r0, {r1-r13}
ldr r0, =0x01c80000 ; BWSCON Address
stmia r0, {r1-r13}
SMRDATA DATA
DCD 0x22221210 ; BWSCON
DCD 0x00000600 ; GCS0
DCD 0x00000700 ; GCS1
DCD 0x00000700 ; GCS2
DCD 0x00000700 ; GCS3
DCD 0x00000700 ; GCS4
DCD 0x00000700 ; GCS5
DCD 0x0001002a ; GCS6, EDO DRAM(Trcd=3, Tcas=2, Tcp=1, CAN=10bit)
DCD 0x0001002a ; GCS7, EDO DRAM
DCD 0x00960000 + 953 ; Refresh(REFEN=1, TREFMD=0, Trp=3, Trc=5, Tchr=3)
DCD 0x0 ; Bank Size, 32MB/32MB
DCD 0x20 ; MRSR 6(CL=2)
DCD 0x20 ; MRSR 7(CL=2)
注:在此我们解释主要的指令
LDR大范围的地址读取伪指令
LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中。
a) 语法格式
LDR{cond} 寄存器,=[expr|label-expr]
其中, cond为可选的指令执行的条件。
寄存器为目标寄存器
Expr 为32位常量。编译器将根据expr的取值情况,如下处理LDR为指令:
u 当expr表示的地址值没有超过MOV或MVN指令中地址的取值范围时,编译器用合适的MOV或者MVN指令代替该LDR为指令。
u 当expr表示的地址值超过了MOV或者MVN指令的取值范围时,编译器将该常数放在数据缓冲区中,同时用一条基于PC的LDR指令读取该常数。
Label-expr为基于PC的地址表达式或者是外部表达式。当Label-expr为基于PC的地址表达式时,编译器将label-expr表示的数值放在数据缓冲区中,同时用一条PC的LDR指令读取该值。当Label-expr为外部表达式,或者非当前段的表达式时,汇编编译器将目标文件中插入连接重定位伪操作,这样连接器将在连接时,生成该地址。
b) 示例
例1:将0xff0读取到R1中
LDR R1,=0xff0
汇编后将得到:
MOV R1,0xff0
例2:将0xfff读取到R1中。
LDR R1,=0XFFF
汇编后将得到:
LDR R1,[pc,OFFSET_TO_LPOOL]
…
LPOOL DCD 0xFFF
例3:将外部地址ADDR1读取到R1中。
LDR R1,=ADDR1
汇编后将得到:
LDR R1,[PC,OFFSET_TO_LPOOL]
…
LPOOL DCD ADDR1
使用汇编语言读写RAM(ARMSDRAM_test_asm/ARMSDRAM.mcp)
;*******************************************************************************
;* 名称: cRWramtest
;* 功能: 使用汇编语言读写已初始化的RAM 区***************************************
AREA Block,CODE,READONLY
;程序入口标志
ENTRY
start
LDR r2,=0x0C010000 ;字长读
LDR r3,=0x55AA55AA
STR r3,[r2] ;字长写
LDR r2,=0x0C010004
LDRH r3,[r2] ;半字读
LDR r3,=0x55AA
STRH r3,[r2],#2 ;半字写
STRH r3,[r2]
LDR r2,=0x0C010008
LDRB r3,=0xAA ;字节读
STRB r3,[r2],#1 ;字节写
LDRB r3,=0x55
STRB r3,[r2],#1
LDRB r3,=0xAA
STRB r3,[r2],#1
LDRB r3,=0x55
STRB r3,[r2]
End
|