/* sdram regisers */
#definemem_ctl_base0x48000000// bwscon的地址
#definesdram_base0x30000000// sdram的起始地址
/* sdram 13个寄存器的值*/
/*定义了一个数组,把13个寄存器的设置值存到一个数组里面*/
unsignedlongconstmem_cfg_val[]={//注意unsignedlongconst的含义…
0x22111110,//bwscon
0x00000700,//bankcon0
0x00000700,//bankcon1
0x00000700,//bankcon2
0x00000700,//bankcon3
0x00000700,//bankcon4
0x00000700,//bankcon5
0x00018005,//bankcon6
0x00018005,//bankcon7
0x008e07a3,//refresh
0x000000b2,//banksize
0x00000030,//mrsrb6
0x00000030,//mrsrb7
};
/*设置控制sdram的13个寄存器*/
/* for循环总共13次,刚好对13个寄存器赋值完毕*/
void memsetup()
{
inti = 0;
unsignedlong*p = (unsignedlong *)mem_ctl_base;
for(; i < 13; i )
p[i] = mem_cfg_val[i];
}
用arm汇编语言设置sdram的惯用方法
@******************************************************************************
@ file:head.s
@功能:设置sdram,将程序复制到sdram,然后跳到sdram继续执行
@******************************************************************************
.equmem_ctl_base,0x48000000
.equsdram_base,0x30000000
.text
.global _start
_start:
bldisable_watch_dog
blmemsetup
blcopy_steppingstone_to_sdram
ldrpc,=set_sp@跳到sdram中继续执行
halt_loop:
bhalt_loop
memsetup:
@ initialize the static memory
@ set memory control registers
movr1,#mem_ctl_base
adrlr2,mem_cfg_val@ adrl用于搬运地址
movr3, #0x0@给r3清零(自己加上的一条指令)
addr3,r1, #52@ 52 == 4*13
1:
ldrr4,[r2], #4
strr4,[r1], #4
cmpr1,r3
bne1b@每次递增4个字节,共循环13次(设置13个寄存器)
movpc,lr




热门文章

