s3c2440 SDRAM实验

来源:互联网 发布:java 线程死锁 编辑:程序博客网 时间:2024/06/06 00:03

由于S3C2440得内部只有4kb SRAM, 所以运行不了大于4kb以上的代码, 需要外接SDRAM才能实现。

  1. 内部原理
  2. SDRAM构成:

需要了解查看芯片手册行地址和列地址、刷新周期,每个BANK大小:
这里写图片描述
这里写图片描述

s3c2440控制器的外设地址如下:S3C2440A Memory Map after Reset
从图中可以看出每个BANK地址空间为128M ,BANK1~BANK5只可以接SROM(SROM means SROM or SRAM type memory),BANK6、BANK7既可以接SROM,还可以接SDRAM,起始地址为:0x30000000,这两个BANk可以软件选择其大小。
实验选择的两个32M的16 位的SDRAM组成一个32位宽度64M的内部存储器,如图:这里写图片描述

实验代码如下:

#define MEM_CTL_BASE    0x48000000void memsetup(void){        int i;        volatile    unsigned long *p = (unsigned long *)MEM_CTL_BASE;        const   sdram_reg_config_val[] = {             0x22011110,    //BWSCON             0x00000700,    //BANKCON0             0x00000700,    //BANKCON1             0x00000700,    //BANKCON2             0x00000700,    //BANKCON3             0x00000700,    //BANKCON4             0x00000700,    //BANKCON5             0x00018005,    //BANKCON6             0x00018005,    //BANKCON7             0x008C07A3,    //REFRESH             0x000000B1,    //BANKSIZE             0x00000030,    //MRSRB6             0x00000030,    //MRSRB7        };        for (i =  0; i < 13; i++)        {                p[i] = sdram_reg_config_val[i];        }}void copy_steppingstone_to_sdram(void){        unsigned int    *pdwSrc = (unsigned int*)0;        unsigned int  *pdwDes = (unsigned int*)0x30000000;        while(pdwSrc < (unsigned int*)4096)        {            *pdwDes++ = *pdwSrc++;          }}

值得注意的是刷新周期计算:
这里写图片描述
这里未使用PLL, SDRAM时钟频率等于晶振时钟频率12M,
刷新周期:64ms/8k = 7.8125us.
R_CNT = 2^11 +1 -12*7.8125=1955;
REFRESH = 0X008C0000 + 1955 = 0X008C07A3;

其它寄存器内容则可在芯片手册查看。