搜索
bottom↓
回复: 3

LPC2478在启动代码里设置SDRAM,就不可以吗?

[复制链接]

出0入0汤圆

发表于 2011-12-14 10:49:11 | 显示全部楼层 |阅读模式
我有1个板子,硬件已经调试好,不用怀疑,用的Lpc2478主芯片,外挂2MB的SDRAM,options里勾上RAM1(ADDR=0xA0000000,SIZE=0x200000),在启动代码不初始化,在系统启动后开始初始化SDRAM接口,可以测试SDRAM通过。但是把初始化内容放在启动代码里设置就不行,请教如何设置?
#include <LPC24xx.H>

#define INT32U unsigned long
#define uint8_t unsigned char


// 硬件端口定义:
// BEEP: P0.0
#define BEEP                (1<<0)
#define BeepOFF()          FIO0SET |= BEEP
#define BeepON()         FIO0CLR |= BEEP

void delay_Ns (int idly)
{
    int i;
   
    for(; idly > 0; idly--) {
        for (i = 0; i < 5000; i++);
    }
}

void  sysDelayNS(INT32U  uiDly)
{  
    INT32U  i;
    for(; uiDly > 0; uiDly--){
        for(i = 0; i < 5000; i++);
    }
}
void  SDRAMInit( void )
{  
    volatile INT32U i, dummy ;

    LCD_CTRL = 0x00;
        sysDelayNS(10);

        PCONP |= 1 << 11;
   
    /*
    * 使能SDRAM总线连接
    */
#if 0
    PINSEL4   |= 0x50000000;//SRAM(CS2,CS3)
    PINSEL5   |= 0x05010555;//SDRAM(CS0,CS1)
    PINSEL6   |= 0x55555555;//D0~D15
    PINSEL8   |= 0x15555555;//A0~A15
    PINSEL9   |= 0x50550000;//A16~A23 , /OE , /WE , BLS0 , BLS1 , /CS0 , /CS1;
    EMC_CTRL = 0x00000001;                                                    /* Disable Address mirror       */
#else
        //原程序
    PINSEL4   |= 0x50000000;//SRAM(CS2,CS3)
    PINSEL5   |= 0x05050555;//SDRAM(CS0,CS1)
    PINSEL6   |= 0x55555555;//D0~D15
    PINSEL8   |= 0x55555555;//A0~A15
    PINSEL9   |= 0x50555555;//A16~A23 , /OE , /WE , BLS0 , BLS1 , /CS0 , /CS1;
    EMC_CTRL = 0x00000001;                                                    /* Disable Address mirror       */

#endif
    /*
     * 设置SDRAM访问时序.
     */
    EMC_DYN_RP        = 1;
    EMC_DYN_RAS       = 2;
    EMC_DYN_SREX      = 1;
    EMC_DYN_APR       = 1;
    EMC_DYN_DAL       = 5;
    EMC_DYN_WR        = 2;
    EMC_DYN_RC        = 3;
    EMC_DYN_RFC       = 3;
    EMC_DYN_XSR       = 5;
    EMC_DYN_RRD       = 1;
    EMC_DYN_MRD       = 2;

    EMC_DYN_RD_CFG = 1;                                           /*  Command delayed strategy    */

    /*
     * Default setting,
     * RAS latency 3 CCLKs,
     * CAS latenty 3 CCLKs.
     */
    EMC_DYN_RASCAS0   = 0x00000303;

    /*
     * 64MB, 1Mx16,
     * 4 banks, row=12,
     * column=8
     */
    EMC_DYN_CFG0   = 0x00000280;
    for (i = 0; i < 0x80; i++) {
    }

    /*
     * Mem clock enable,
     * CLKOUT runs, send command:
     * NOP
     */
    EMC_DYN_CTRL   = 0x00000183;
    for (i = 0; i < 0x80; i++) {
    }

    /*
     * Send command:
     * PRECHARGE-ALL,
     * shortest possible refresh period
     */
    EMC_DYN_CTRL   = 0x00000103;
    for (i = 0; i < 0x80; i++) {
    }


    /*
     * set 32 CCLKs
     * between SDRAM refresh
     * cycles
     */
    EMC_DYN_RFSH   = 0x00000004;
    for (i = 0; i < 0x80; i++) {                                        /*  wait 128 AHB clock cycles   */
    }

    /*
     * set 45 x 16CCLKs=720CCLK=15us
     * between SDRAM refresh
     * cycles
     */
    EMC_DYN_RFSH   = 45;

    /*
     * To set mode register in SDRAM,
     * enter mode by issue  MODE command, after finishing,
     * bailout and back to NORMAL mode.
     * Mem clock enable, CLKOUT runs, send command: MODE
     */
    EMC_DYN_CTRL   = 0x00000083;
    dummy               = *((volatile int *)(0xA0019800));
    EMC_DYN_CTRL   = 0x00000000;                                   /*  Send command: NORMAL        */
    EMC_DYN_CFG0   = 0x00080280;                                   /*  Enable buffer               */
    for (i = 0; i < 0x80; i++) {
    }

}

#define TEST_ADDR         0xA011FF00                /* 测试起始地址                                */
#define SIZE                100                                /* 测试100个SDRAM空间                */

int main(void)
{
        INT32U i;
        uint8_t * p_uint8_t = (uint8_t *)TEST_ADDR;

        PINSEL0  = 0x00;
        SCS |= 0x01;
        FIO0DIR |= BEEP;
        BeepON();
        delay_Ns(100);
        BeepOFF();

        SDRAMInit();                   // 启动代码里的设置和这里是一样的值。

// 测试SDRAM连接是否正常
    p_uint8_t = (uint8_t *)TEST_ADDR;
        for (i=0;i < SIZE;i++)
                *p_uint8_t++ = (uint8_t)i;

    p_uint8_t = (uint8_t *)TEST_ADDR;
    for(i=0; i<SIZE; i++)
    {
        if( *p_uint8_t != (uint8_t)i )
        {
            while(1);
        }
        p_uint8_t++;
    }
// end

        while(1) {
                BeepON();
                delay_Ns(500);
                BeepOFF();
                delay_Ns(500);
                }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2011-12-23 21:15:43 | 显示全部楼层
在SDRAM中运行是需要2段独立代码的,不知道的初始化运行,又是开始运行的指的是那段代码?

出0入0汤圆

发表于 2011-12-24 17:11:16 | 显示全部楼层
围观中,我来学习的

出0入0汤圆

发表于 2011-12-25 23:20:31 | 显示全部楼层
没仔细看楼主的程序,不过楼主可以看下,在你初始化C语言前,是不是已经建立好了RW段和ZI段,不然的话,没有搭建好C环境,只能用汇编来实现初始化
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 10:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表