当前位置: 代码迷 >> 综合 >> S3C2440-SDRAM
  详细解决方案

S3C2440-SDRAM

热度:0   发布时间:2024-01-21 13:00:58.0

哈尔滨理工大学软件工程专业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个控制寄存器。

  1. BWSCON总线宽度与等待状态控制寄存器
  2. BANKCON0~BANKCON7,BANK控制寄存器
  3. REFRESH,刷新控制寄存器
  4. BANKSIZE寄存器
  5. MRSRB6,MRSRB7,模式寄存器集寄存器

下面完成一个程序让跑马灯程序在0x0地址运行,如果是Nandflash启动,也就是在steppingstone中运行,把它搬到SDRAM中运行。程序还是有问题有待于改进。

  1. SADD  EQU 0x30000000  
  2. BWSCONS  EQU 0x48000000  
  3.     AREA |DATA|,CODE,READONLY  
  4.     ENTRY  
  5.     IMPORT LedMain  
  6.     bl disableWTD  
  7.     bl initmem  
  8.     bl Copy_Sdram  
  9.     ldr pc,=on_sdram  
  10.       
  11. on_sdram  
  12.     ldr sp,=0x34000000  
  13.     bl LedMain  
  14. disableWTD  
  15.     mov r1,#0x53000000  
  16.     mov r2,#0  
  17.     str r2,[r1]  
  18.     mov pc,lr  
  19.       
  20. initmem  
  21.     ldr r1,=SDRAM_add  
  22.     ldr r2,=BWSCONS  
  23.     add r3,r2,#52  
  24. cp1  
  25.     ldr r4,[r1],#4  
  26.     str r4,[r2],#4  
  27.     cmp r2,r3  
  28.     bne cp1  
  29.     mov pc,lr  
  30.       
  31. Copy_Sdram  
  32.     mov r1,#0  
  33.     add r2,r1,#4096  
  34.     ldr r4,=SADD  
  35. cp2   
  36.     ldr r3,[r1],#4  
  37.     str r3,[r4],#4    
  38.     cmp r1,r2  
  39.     bne cp2  
  40.     mov pc,lr  
  41.       
  42.     ALIGN 4  
  43.       
  44. SDRAM_add  
  45.     DCD 0x22011110    ;BWSCON  
  46.     DCD 0x00000700    ;BANKCON0  
  47.     DCD 0x00000700    ;BANKCON1  
  48.     DCD 0x00000700    ;BANKCON2  
  49.     DCD 0x00000700    ;BANKCON3  
  50.     DCD 0x00000700    ;BANKCON4  
  51.     DCD 0x00000700    ;BANKCON5  
  52.     DCD 0x00018005    ;BANKCON6  
  53.     DCD 0x00018005    ;BANKCON7  
  54.     DCD 0x008c07a3    ;REFRESH  
  55.     DCD 0x000000b1    ;BANKSIZE  
  56.     DCD 0x00000030    ;MRSRB6  
  57.     DCD 0x00000030    ;MRSRB7  
  58.       
  59.     END  
  60.       
 

 

  1. #define GPFCON (*(volatile unsigned *)0x56000050) 
  2. #define GPFDAT (*(volatile unsigned *)0x56000054) 
  3. #define GPFUP (*(volatile unsigned *)0x56000058)  
  4. int LedMain()  
  5. {  
  6.       
  7.     void Delay(unsigned int);  
  8.     unsigned char ledtab[]={0xf7,0xef,0xdf,0xbf};  
  9.     int i;  
  10.     GPFUP&=0XFFFFFF87;       //使能上拉F3-6   
  11.     GPFCON&=0XC03f;  
  12.     GPFCON|=0X1540;          //将F3-6设为输出口   
  13.     while(1)  
  14.     {  
  15.         for(i=0;i<4;i++)  
  16.         {  
  17.             GPFDAT=ledtab[i];  
  18.             Delay(670);  
  19.         }  
  20.     }  
  21.     return(0);  
  22.       
  23. }  
  24.   
  25. void Delay(unsigned int x )  
  26. {  
  27.     unsigned int i,j,k;  
  28.     for(i=0;i<=x;i++)  
  29.         for(j=0;j<=0xff;j++)  
  30.             for(k=0;k<=0xff;k++);  
  31. }  

  相关解决方案