s3c2440裸机-内存控制器(五、SDRAM编程实现)

配置内存控制器-SDRAM编程配置

2440内存控制器共有13个寄存器。

BANK0--BANK5只需要设置BWSCON和BANKCONx(x为0~5)两个寄存器;
BANK6、BANK7外接SDRAM时,除BWSCON和BANKCONx(x为6、7)外,还要设置REFRESH、BANKSIZE、MRSRB6、MRSRB7等4个寄存器。

下面分别说明各个寄存起的设置:

1.位宽和等待控制寄存器BWSCON(BUSWIDTH&WAITCONTROLREGISTER)

我们SDRAM的位宽为32,DW6[25:24]设置成10, 没有使用等待信号,所以WS6[26]=0。 bank7跟随bank6的配置,
因此BWSCON寄存器的值为:0x22000000。

2.BANK控制寄存器BANKCON6(BANKCONTROLREGISTER)

在8个BANK中,只有BANK6和BANK7可以外接SRAM或SDRAM.

MT[16:15]:设置BANK是ROM/SRAM还是DRAM,我们用的SDRAM,属于DRAM。
Trcd[3:2]:行地址和列地址间隔多长时间,看SDRAM芯片手册时间间隔Trcd>18ns,我们HCLK=100MHZ,clocks为10ns,所以设置为2clocks即可。

SCAN[1:0]:SDRAM的列地址位数,上面的图片已经查看sdram手册分析过,列地址位数为9。
综上所述,本开发板中BANKCON6设为0x017001

3.刷新控制寄存器REFRESH(REFRESHCONTROLREGISTER)

REFEN[23]:设置开启SDRAM的刷新功能。
TREFMD[22]:SDRAM的刷新模式,0=CBR/AutoRefresh,选择自动刷新。

Trp[21:20]:根据sdram手册Trp>18ns, 设为0(2 clocks)即可。
Tsrc[19:18]: Tsrc = Trc - Trp = Trc-20, 根据sdram手册Trc>=60,我们取Trc =70, 则Tsrc= 50ns(5clocks)即可。
RefreshCounter[10:0]:Refresh period = (211-refresh_count+1)/HCLK,
RefreshCount = 211 + 1 - 100*Refresh period,看SDRAM手册“8192 refresh cycles/64ms”, Refresh period= 64000us/8192 = 7.8us,
RefreshCount取推荐值1269= 0x4f5.
综上,REFRESH寄存器设为0x8404F5。

4.BANKSIZE寄存器REFRESH(BANKSIZEREG ISTER)

BURST_EN[7]:0=ARM核禁上突发传输,1=ARM核支持突发传输(推荐);
SCKEEN[5]:0=不使用SCKE信号令SDRAM进入省电模式,1=使用SCKE信号令SDRAM进入省电模式(推荐);
SCLK-EN[4]:0=时刻发出SCLK信号,1=仅在访问SDRAM期间发出SCLK信号(推荐);
BK76MAP[2:0]:配置banksize成64M
因此,BANKSIZE寄存器设为0xB1。

5.SDRAM模式设置寄存器MRSRBx6(SDRAM MODE REGISTER SET REGISTER)

CL[6:4]:表示发出行、列地址后,等多久才返回收到数据, 看SDRAM手册发现Tcas >=18ns,所以配置成2 clocks即可。
MRSRB6寄存器设置为0x20。

代码如下:

void sdram_init(void)
{
    BWSCON = 0x22000000;

    BANKCON6 = 0x18001;
    BANKCON7 = 0x18001;

    REFRESH  = 0x8404f5;

    BANKSIZE = 0xb1;

    MRSRB6   = 0x20;
    MRSRB7   = 0x20;
}

int sdram_test(void)
{
    volatile unsigned char *p = (volatile unsigned char *)0x30000000;//sdram base addr
    int i;

    // write sdram
    for (i = 0; i < 1000; i++)
        p[i] = 0x55;

    // read sdram
    for (i = 0; i < 1000; i++)
        if (p[i] != 0x55)
            return -1;

    return 0;
}
int main(void)
{
    uart0_init();

    sdram_init();

    if (sdram_test() == 0)
        led_test();

    return 0;
}

测试结果:
当进行sdram_init后可已访问0x3000_0000地址的内容,led流水灯闪烁。
不初始化sdram_init,运行程序卡死。

原文地址:https://www.cnblogs.com/fuzidage/p/12024056.html

时间: 2024-08-29 18:28:58

s3c2440裸机-内存控制器(五、SDRAM编程实现)的相关文章

s3c2440内存控制器与SDRAM基本测试

前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求. 第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存器来控制的. 第三类是内存接口,cpu发出的地址可以直接传递给这种设备如nor flash,sdram,网卡.注意nand flash不属于这种类型. 关于SDRAM,可以参考这篇文章,这对于了解sdram很重要,非常有必要阅读一波.(点击查看)

s3c2440裸机-代码重定位(2.编程实现代码重定位)

代码重定位(2.编程实现代码重定位) 1.引入链接脚本 我们上一节讲述了为什么要重定位代码,那么怎么去重定位代码呢? 上一节我们发现"arm-linux-ld -Ttext 0 -Tdata 0x30000000"这种方式编译出来的bin文件有800多M,这肯定是不行的,那么需要怎么把.data段重定位到sdram呢? 可以通过AT参数指定.data段在编译时的存放位置,我们发现这样指定太不方便了,而且不好确定要放在bin文件的哪个位置.这里就要引入链接脚本,它可以帮我们解决这个不必要

s3c2440裸机编程-内存控制器(一、内存接口概念)

1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nand控制器等... 1.不同类型的控制器: (1)GPIO控制器属于门电路,不涉及到时序,相对简单. (2)串口控制器属于协议类接口,类似的协议类接口还有iic.iis.spi等. (3)前面的GPIO/门电路接口.协议类接口,都不会把地址输出到外部设备,仅仅只是将地址写入到相应的控制器. 接下来的内

s3c2440裸机编程-内存控制器(二、不同位宽设备的连接)

不同位宽设备的连接 我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的. 8bit rom与CPU地址线的连接 8bit*2 rom与CPU地址线的连接 8bit*4 rom与CPU地址线的连接 16bit rom与CPU地址线的连接 16bit*2 rom与CPU地址线的连接 从上面的图中,我们知道可以对2片位宽为8bit的外设扩展级联成1个16bit的外设,同理可用4片位宽为8bit的外设进行级联成1个32bit的外设... 从上面的图中,我们还看见一个规律: 当外设总线位

嵌入式Linux裸机开发(五)——SDRAM初始化

嵌入式Linux裸机开发(五)--SDRAM初始化 一.SDRAM初始化流程 S5PV210有两个独立的DRAM控制器,一个最大支持512MB,一个最大支持1024MB,但两个控制器必须支持相同类型的内存. 根据三星S5PV210文档可知,DDR2类型内存的初始化流程如下: 1.提供稳压电源给内存控制器和内存芯片,内存控制器必须保持CLE在低电平,此时就会提供稳压电源.注:当CKE引脚为低电平时,XDDR2SEL应该处于高电平 2.根据时钟频率正确配置PhyControl0.ctrl_start

s3c2440裸机编程-时钟编程(二、配置时钟寄存器)

s3c2440裸机编程-时钟编程(二.配置时钟寄存器) 1.2440时钟时序 下图是2440时钟配置时序: 1.上电后,nRESET复位信号拉低,此时cpu还无法取指令工作. 2.nRESET复位信号结束后变为高电平,此时cpu开始工作.此时cpu主频FCLK=osc. 3.此时可以配置PLL,经过lock time后,FCLK倍频成新的时钟. 2.如何配置时钟 在参考手册的特性里介绍了S3C2440的工作频率,Fclk最高400MHz,Hclk最高136MHz,Pclk最高68MHz.那么 我

s3c2440裸机编程-时钟编程(一、2440时钟体系介绍)

1.总线框架 下图是2440的总线框架,其中有AHB(Advanced High performance Bus)高速总线,APB(Advanced Peripheral Bus)外围总线. 不同总线对应不同的时钟. SOC <-> FCLK AHB <-> HCLK APB <-> PCLK 其中: 1.使用AHB总线的有:LCD控制器.usb控制器.中断控制器.内存控制器等... 2.使用APB总线的有:i2c.spi.timer.gpio.adc等...具体上图.

存储控制器和SDRAM 实验

S3C2440 存储控制器(memory controller)提供了訪问外部设备所需的信号,这是一种通过总线形式来訪问扩展的外设. S3C2440  的存储器控制器有下面的特性: 支持小字节序.大字节序(通过软件选择) 每一个BANK的地址空间为128MB.总共1GB(8 BANKs) 可编程控制的总线位宽(8/16/32 -bit).只是 BANK0 仅仅能选择两种位宽(16/32 -bit) 总共8个BANK. BANK0 ~ BANK5 能够支持外接 ROM,SRAM等,BANK6 ~

【转载】s3c2440裸机开发调试环境(MDK4.6,Jlink v8,mini2440)

用于arm裸机程序开发的IDE基本有 以下3个:MDK,IAR,还有ADS.具体它们的具体情况在这里我就不多说了,百度一下就明白了.由于之前开发c51,stm32时候都使用了MDK开发环境,而且MDK的界面确实看起来舒服多了,所以我选择了MDK作为我的s3c2440裸机开发的IDE.以下主要介绍一下如何使用MDK配合J-link来调试基于s3c2440的开发板. 首先,我们需要下载的有以下2样: MDK J-link 驱动 我的开发环境:windows 7 64位,J-linkv8,mini24