zerg 发表于 2018-3-13 17:07:06

LPC1778 SDRAM调试程序

项目上用的MCU(LPC1778),要求 SDRAM运行程序,查了很多资料,实现MCU 内部flash 跳转至SDRAM运行程序

前前后后,参考了几个帖子,非常感谢这几个帖子中的调试经验啊啊啊啊:
链接放不上......{:sweat:} {:sweat:} {:sweat:}

直接上图(keil的 配置):

3.SDRAM调试 加载的脚本文件如下:
3.1.1SDRAM驱动文件 (SDRAM.ini):
FUNC void PinSel(int p1, int n1, int f1)
{
    _WDWORD(0x4002C000 + (p1 * 32 + n1) * 4, (1 << 9) | f1);
}


FUNC void InitSDRAM(void)
{
    int i;
    PinSel(2,16,1);
    PinSel(2,17,1);
    PinSel(2,18,1);
    PinSel(2,20,1);
    PinSel(2,24,1);
    PinSel(2,28,1);
    PinSel(2,29,1);

    for(i = 0; i < 16; i++)
      PinSel(3,i,1);
         
    for(i = 0; i < 15; i++)
      PinSel(4,i,1);

    PinSel(4,24,1);
    PinSel(4,25,1);


    _WDWORD(0x400FC1DC, (8 << 16)|(8 << 8)|(0xA << 1));   
    _sleep_(8);
    // Initialize EMC
    _WDWORD(0x2009C000, 0x00000001);   // CONTROL=1 = Enable EMC
    _WDWORD(0x2009C008, 0x00000000);   // CONFIG=0
    _WDWORD(0x2009C100, 0x00000280);   // DYNAMICCONFIG0
    _WDWORD(0x2009C104, 0x00000202);   // DYNAMICRASCAS0
                                       
    _WDWORD(0x2009C028, 0x00000001);   // DYNAMICREADCONFIG
                                       
    _WDWORD(0x2009C030, 0x00000001);   // DYNAMICRP
    _WDWORD(0x2009C034, 0x00000002);   // DYNAMICRAS
    _WDWORD(0x2009C038, 0x00000001);   // DYNAMICREX
    _WDWORD(0x2009C03C, 0x00000000);   // DYNAMICAPR
    _WDWORD(0x2009C040, 0x00000003);   // DYNAMICDAL
    _WDWORD(0x2009C044, 0x00000002);   // DYNAMICWR
    _WDWORD(0x2009C048, 0x00000003);   // DYNAMICRC
    _WDWORD(0x2009C04C, 0x00000003);   // DYNAMICRFC
    _WDWORD(0x2009C050, 0x00000001);   // DYNAMICXSR
    _WDWORD(0x2009C054, 0x00000000);   // DYNAMICRRD
    _WDWORD(0x2009C058, 0x00000002);   // DYNAMICMRD
    _sleep_(100);                                 
    _WDWORD(0x2009C020, 0x00000183);   // DYNAMICCONTROL - NOP
    _sleep_(100);
    _WDWORD(0x2009C020, 0x00000103);   // DYNAMICCONTROL - PRECHARGE_ALL

    _sleep_(100);                                    
    _WDWORD(0x2009C024, 0x00000046);   // DYNAMICREFRESH = 1D                                 
    _WDWORD(0x2009C020, 0x00000083);   // DYNAMICCONTROL - MODE
    _sleep_(200);                                 
    _RDWORD(0xA0000000 | (0x23<<11));// Write 16-bit SDRAM Mode register burst 8- this is a read as requested by the SDRAM spec
                                       
    _WDWORD(0x2009C020, 0x00000000);   // DYNAMICCONTROL - NORMAL
                                       
    _WDWORD(0x2009C100, (1 << 19) | 0x00000280);   // DYNAMICCONFIG0
    _sleep_(100);               


   
}

FUNC void Clock_Setup (void) {
      _WDWORD(0x400FC1A0, 0x00000021);                        // Enable the crystal oscillator
//      while((_RDWORD(0x400FC1A0) & (1<<6)) == 0);      // delay wait for oscillator to start
      _sleep_ (100);                              // Wait for main oscillator to stabilize      
    _WDWORD(0x400FC10C, 0x00000001);                        // select crystal oscillator
      _WDWORD(0x400FC084, 0x00000028);                        // Configure PLL0 to multiply x 10 for 120 MHz operation from 12 MHz crystal
      _WDWORD(0x400FC080, 0x00000001);                        // PLL0 Enable
      _WDWORD(0x400FC08C, 0x000000AA);                        //
      _WDWORD(0x400FC08C, 0x00000055);                        //
      
//      while((_RDWORD(0x400FC088) & (1<<10)) == 0);      // Wait for PLOCK0
      _sleep_ (100);                              // Wait for PLOCK0
      _WDWORD(0x400FC0A4, 0x0000002B);                        // Configure PLL0 to multiply x 10 for 120 MHz operation from 12 MHz crystal
      _WDWORD(0x400FC0A0, 0x00000001);                        // PLL0 Enable
      _WDWORD(0x400FC0AC, 0x000000AA);                        //
      _WDWORD(0x400FC0AC, 0x00000055);                        //
      _sleep_ (100);   
      _WDWORD(0x400FC104, 0x00000102);                        //PLL0 not divide as the cpuclock
      _WDWORD(0x400FC100, 0x00000000);                        //cpuclock / 2 as the emcclock
      _WDWORD(0x400FC1A8, 0x00000004);                        //cpuclock / 2 as the pclock

      _WDWORD(0x400FC0C4, 0x00008800);                        //emcclock gpio enable

      _WDWORD(0x400FC1B0, 0x00000000);                        //120M support
}
3.1.2 加载的脚本(RAM.ini):
INCLUDE SDRAM.ini

FUNC void mpu_region_setup(unsigned int a_addr,
                     unsigned int a_region,
                     unsigned int a_size,
                     unsigned int a_ap,
                     unsigned int a_mem_attrib,
                     unsigned int a_srd,
                     unsigned int a_XN,
                     unsigned int a_enable )
{
    // Setup procedure for each region
    unsigned int temp;
    temp = (a_addr & 0xFFFFFFE0) | (a_region & 0xF) | 0x10 ;
    _WDWORD(0xE000ED9C, temp);                                                                         // RBAR
    temp = ((a_XN & 0x1)<<28) | ((a_ap & 0x7)<<24) | ((a_mem_attrib & 0x3F)<<16) | ((a_srd&0xFF)<<8) | ((a_size & 0x1F)<<1)| (a_enable & 0x1) ;
    _WDWORD(0xE000EDA0, temp);                                                                         // RASR
    _WDWORD(0xE000ED24, 1<<18);                                                                 // usage fault enable
    _WDWORD(0xE000ED94, 5);                                                                         // MPU enable
}

FUNC void Setup (unsigned int region) {
    region &= 0xFF000000;
        //    _WDWORD(0x40043100, 0);                               // Set the shadow pointer to zero (can't map SDRAM to 0)
    SP = _RDWORD(region);                                                     // Setup Stack Pointer
    PC = _RDWORD(region + 4);                                                   // Setup Program Counter
    _WDWORD(0xE000ED08, region);                              // Set the vector table offset
}



Clock_Setup();
InitSDRAM();
LOAD%L INCREMENTAL                                                                                        // Download
mpu_region_setup( 0xA0000000,0,0x16,3,7,0,0,1);

Setup(0xA0000000);                                              // Setup for Running




3.1.3 调试注意:
        1.外设、IO(SDRAM) 请勿重新初始化 ,会造成程序重启
        2.SDRAM 调试不能下载操作,得在调试模式调试代码
        3.不同的SDRAM器件,需阅读数据手册,重新配置,上面的代码配置的(主频72M、IS42S16400F)
        4.重要的代码,推荐强制定位到MCU内部 SRAM区域

liang16888 发表于 2018-7-20 11:44:31

如果要改成lpc1857 用sdram 是要修改那里?

zerg 发表于 2018-7-26 16:22:53

liang16888 发表于 2018-7-20 11:44
如果要改成lpc1857 用sdram 是要修改那里?

没接触过这款MCU,应该和1778 差不多吧,初始化流程,port,clock,emc ...
页: [1]
查看完整版本: LPC1778 SDRAM调试程序