我板子的SDRAM是64M,从0x30000000″0x3fffffff,被BANK6选中。
//64MB
// 0x30000000 ” 0x30ffffff : Download Area (16MB) Cacheable
// 0x31000000 ” 0x33feffff : Non-Cacheable Area
// 0x33ff0000 ” 0x33ff47ff : Heap & RW Area
// 0x33ff4800 ” 0x33ff7fff : FIQ ” User Stack Area
// 0x33ff8000 ” 0x33fffeff : Not Useed Area
// 0x33ffff00 ” 0x33ffffff : Exception & ISR Vector Table
我的开发板要求在0x32000000这个地址运转,也便是在Non-Cacheable Area这段内存区域。SDRAM内部是一个存储阵列,阵列就好像表格相同,将数据“填进去”。和表格的检索原理相同,先指定一个行(Row),再指定一个列(Column),就可以精确的找到所需求的存单元格,这便是SDRAM寻址的基本原理。这个单元格被成为存储单元,这个表格便是逻辑BANK(Logic Bank,下文称L-Bank),SDRAM一般含有4个L-Bank。SDRAM有13个操控寄存器。
BWSCON总线宽度与等候状况操控寄存器
BANKCON0″BANKCON7,BANK操控寄存器
REFRESH,改写操控寄存器
BANKSIZE寄存器
MRSRB6,MRSRB7,形式寄存器集寄存器
下面完结一个程序让跑马灯程序在0x0地址运转,如果是Nandflash发动,也便是在steppingstone中运转,把它搬到SDRAM中运转。程序仍是有问题有待于改善。
SADD EQU 0x30000000
BWSCONS EQU 0x48000000
AREA |DATA|,CODE,READONLY
ENTRY
IMPORT LedMain
bl disableWTD
bl initmem
bl Copy_Sdram
ldr pc,=on_sdram
on_sdram
ldr sp,=0x34000000
bl LedMain
disableWTD
mov r1,#0x53000000
mov r2,#0
str r2,[r1]
mov pc,lr
initmem
ldr r1,=SDRAM_add
ldr r2,=BWSCONS
add r3,r2,#52
cp1
ldr r4,[r1],#4
str r4,[r2],#4
cmp r2,r3
bne cp1
mov pc,lr
Copy_Sdram
mov r1,#0
add r2,r1,#4096
ldr r4,=SADD
cp2
ldr r3,[r1],#4
str r3,[r4],#4
cmp r1,r2
bne cp2
mov pc,lr
ALIGN 4
SDRAM_add
DCD 0x22011110 ;BWSCON
DCD 0x00000700 ;BANKCON0
DCD 0x00000700 ;BANKCON1
DCD 0x00000700 ;BANKCON2
DCD 0x00000700 ;BANKCON3
DCD 0x00000700 ;BANKCON4
DCD 0x00000700 ;BANKCON5
DCD 0x00018005 ;BANKCON6
DCD 0x00018005 ;BANKCON7
DCD 0x008c07a3 ;REFRESH
DCD 0x000000b1 ;BANKSIZE
DCD 0x00000030 ;MRSRB6
DCD 0x00000030 ;MRSRB7
END
#define GPFCON (*(volatile unsigned *)0x56000050)
#define GPFDAT (*(volatile unsigned *)0x56000054)
#define GPFUP (*(volatile unsigned *)0x56000058)
int LedMain()
{
void Delay(unsigned int);
unsigned char ledtab[]={0xf7,0xef,0xdf,0xbf};
int i;
GPFUP&=0XFFFFFF87; //使能上拉F3-6
GPFCON&=0XC03f;
GPFCON|=0X1540; //将F3-6设为输出口
while(1)
{
for(i=0;i<4;i++)
{
GPFDAT=ledtab[ i];
Delay(670);
}
}
return(0);
}
void Delay(unsigned int x )
{
unsigned int i,j,k;
for(i=0;i<=x;i++)
for(j=0;j<=0xff;j++)
for(k=0;k<=0xff;k++);
}