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


    前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求。

    第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存器来控制的。

    第三类是内存接口,cpu发出的地址可以直接传递给这种设备如nor flash,sdram,网卡。注意nand flash不属于这种类型。

    关于SDRAM,可以参考这篇文章,这对于了解sdram很重要,非常有必要阅读一波。

    《高手进阶,终极内存技术指南(完整/进阶版)》

    这篇文章能够让你了解sdram这个内存介质。

    然后,查看2440的芯片资料:

    2440已经有针对sdram的控制器,2440可以直接通过地址线和sdram通信。

    关于寄存器方面的东西就不再贴出来了。需要注意的是,操作sdram还是比较繁琐的,时序要求需要根据2440手册和所对应的sdram芯片手册进行配置。

    现在,我们开始编写程序。

    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;
        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;
    }

    上面是sdram的初始化和测试,直接通过地址访问sdram,我们对sdram进行写入,并且再读出来,看看是否相等。这样可以测试是否成功配置sdram。

    #include "s3c2440_soc.h"
    
    #include "init.h"
    
    int main(void)
    {
    
    
        sdram_init();
    
        if (sdram_test() == 0)
            led_test();
        
        return 0;
    }

    如果测试通过,返回0,led被点亮,屏蔽掉sdram初始化之后,led不会再闪烁。

    昨天实验到这里的时候以为韦老大代码有bug,其实是由于下载器有时候保持一直连接会让新下载的程序无响应,可以拔下下载器或再重启单板就可以看到现象了。

    需要注意的是,如同sdram 这样的内存,访问地址时加上volatile能够让你少点烦恼。。。

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    129. Sum Root to Leaf Numbers
    117. Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/7858121.html
Copyright © 2020-2023  润新知