用C語(yǔ)言和ARM匯編語(yǔ)言設(shè)置SDRAM的慣用方法
/* SDRAM regisers */
本文引用地址:http://m.butianyuan.cn/article/201611/317091.htm#defineMEM_CTL_BASE0x48000000// BWSCON的地址
#defineSDRAM_BASE0x30000000// SDRAM的起始地址
/* SDRAM 13個(gè)寄存器的值*/
/*定義了一個(gè)數(shù)組,把13個(gè)寄存器的設(shè)置值存到一個(gè)數(shù)組里面*/
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
};
/*設(shè)置控制SDRAM的13個(gè)寄存器*/
/* for循環(huán)總共13次,剛好對(duì)13個(gè)寄存器賦值完畢*/
void memsetup()
{
inti = 0;
unsignedlong*p = (unsignedlong *)MEM_CTL_BASE;
for(; i < 13; i++)
p[i] = mem_cfg_val[i];
}
用ARM匯編語(yǔ)言設(shè)置SDRAM的慣用方法
@******************************************************************************
@ File:head.s
@功能:設(shè)置SDRAM,將程序復(fù)制到SDRAM,然后跳到SDRAM繼續(xù)執(zhí)行
@******************************************************************************
.equMEM_CTL_BASE,0x48000000
.equSDRAM_BASE,0x30000000
.text
.global _start
_start:
bldisable_watch_dog
blmemsetup
blcopy_steppingstone_to_sdram
ldrpc,=set_sp@跳到SDRAM中繼續(xù)執(zhí)行
halt_loop:
bhalt_loop
memsetup:
@ initialize the static memory
@ set memory control registers
movr1,#MEM_CTL_BASE
adrlr2,mem_cfg_val@ adrl用于搬運(yùn)地址
movr3, #0x0@給r3清零(自己加上的一條指令)
addr3,r1, #52@ 52 == 4*13
1:
ldrr4,[r2], #4
strr4,[r1], #4
cmpr1,r3
bne1b@每次遞增4個(gè)字節(jié),共循環(huán)13次(設(shè)置13個(gè)寄存器)
movpc,lr
評(píng)論