哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2010/12/14/6075190.aspx
我板子的SDRAM是64M,从0x30000000~0x33ffffff,被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++);
- }