搜索
bottom↓
回复: 2

LPC1778 SDRAM调试程序

[复制链接]

出0入0汤圆

发表于 2018-3-13 17:07:06 | 显示全部楼层 |阅读模式
项目上用的MCU(LPC1778),要求 SDRAM运行程序,查了很多资料,实现MCU 内部flash 跳转至SDRAM运行程序

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

直接上图(keil的 配置):

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


  5. FUNC void InitSDRAM(void)  
  6. {  
  7.     int i;  
  8.     PinSel(2,16,1);  
  9.     PinSel(2,17,1);  
  10.     PinSel(2,18,1);  
  11.     PinSel(2,20,1);  
  12.     PinSel(2,24,1);  
  13.     PinSel(2,28,1);  
  14.     PinSel(2,29,1);  
  15.   
  16.     for(i = 0; i < 16; i++)  
  17.         PinSel(3,i,1);  
  18.          
  19.     for(i = 0; i < 15; i++)  
  20.         PinSel(4,i,1);  
  21.   
  22.     PinSel(4,24,1);  
  23.     PinSel(4,25,1);  


  24.     _WDWORD(0x400FC1DC, (8 << 16)|(8 << 8)|(0xA << 1));   
  25.     _sleep_(8);
  26.     // Initialize EMC
  27.     _WDWORD(0x2009C000, 0x00000001);   // CONTROL=1 = Enable EMC
  28.     _WDWORD(0x2009C008, 0x00000000);   // CONFIG=0
  29.     _WDWORD(0x2009C100, 0x00000280);   // DYNAMICCONFIG0
  30.     _WDWORD(0x2009C104, 0x00000202);   // DYNAMICRASCAS0
  31.                                        
  32.     _WDWORD(0x2009C028, 0x00000001);   // DYNAMICREADCONFIG
  33.                                        
  34.     _WDWORD(0x2009C030, 0x00000001);   // DYNAMICRP
  35.     _WDWORD(0x2009C034, 0x00000002);   // DYNAMICRAS
  36.     _WDWORD(0x2009C038, 0x00000001);   // DYNAMICREX
  37.     _WDWORD(0x2009C03C, 0x00000000);   // DYNAMICAPR
  38.     _WDWORD(0x2009C040, 0x00000003);   // DYNAMICDAL
  39.     _WDWORD(0x2009C044, 0x00000002);   // DYNAMICWR
  40.     _WDWORD(0x2009C048, 0x00000003);   // DYNAMICRC
  41.     _WDWORD(0x2009C04C, 0x00000003);   // DYNAMICRFC
  42.     _WDWORD(0x2009C050, 0x00000001);   // DYNAMICXSR
  43.     _WDWORD(0x2009C054, 0x00000000);   // DYNAMICRRD
  44.     _WDWORD(0x2009C058, 0x00000002);   // DYNAMICMRD
  45.     _sleep_(100);                                   
  46.     _WDWORD(0x2009C020, 0x00000183);   // DYNAMICCONTROL - NOP
  47.     _sleep_(100);
  48.     _WDWORD(0x2009C020, 0x00000103);   // DYNAMICCONTROL - PRECHARGE_ALL

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


  59.    
  60. }

  61. FUNC void Clock_Setup (void) {
  62.         _WDWORD(0x400FC1A0, 0x00000021);                        // Enable the crystal oscillator
  63. //        while((_RDWORD(0x400FC1A0) & (1<<6)) == 0);        // delay wait for oscillator to start
  64.         _sleep_ (100);                              // Wait for main oscillator to stabilize        
  65.     _WDWORD(0x400FC10C, 0x00000001);                        // select crystal oscillator
  66.         _WDWORD(0x400FC084, 0x00000028);                        // Configure PLL0 to multiply x 10 for 120 MHz operation from 12 MHz crystal
  67.         _WDWORD(0x400FC080, 0x00000001);                        // PLL0 Enable
  68.         _WDWORD(0x400FC08C, 0x000000AA);                        //
  69.         _WDWORD(0x400FC08C, 0x00000055);                        //
  70.         
  71. //        while((_RDWORD(0x400FC088) & (1<<10)) == 0);        // Wait for PLOCK0
  72.         _sleep_ (100);                              // Wait for PLOCK0
  73.         _WDWORD(0x400FC0A4, 0x0000002B);                        // Configure PLL0 to multiply x 10 for 120 MHz operation from 12 MHz crystal
  74.         _WDWORD(0x400FC0A0, 0x00000001);                        // PLL0 Enable
  75.         _WDWORD(0x400FC0AC, 0x000000AA);                        //
  76.         _WDWORD(0x400FC0AC, 0x00000055);                        //
  77.         _sleep_ (100);   
  78.         _WDWORD(0x400FC104, 0x00000102);                        //PLL0 not divide as the cpuclock
  79.         _WDWORD(0x400FC100, 0x00000000);                        //cpuclock / 2 as the emcclock
  80.         _WDWORD(0x400FC1A8, 0x00000004);                        //cpuclock / 2 as the pclock

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

  82.         _WDWORD(0x400FC1B0, 0x00000000);                        //120M support
  83. }
复制代码

3.1.2 加载的脚本(RAM.ini):
  1. INCLUDE SDRAM.ini

  2. FUNC void mpu_region_setup(unsigned int a_addr,
  3.                        unsigned int a_region,
  4.                        unsigned int a_size,
  5.                        unsigned int a_ap,
  6.                        unsigned int a_mem_attrib,
  7.                        unsigned int a_srd,
  8.                        unsigned int a_XN,
  9.                        unsigned int a_enable )
  10. {
  11.     // Setup procedure for each region
  12.     unsigned int temp;
  13.     temp = (a_addr & 0xFFFFFFE0) | (a_region & 0xF) | 0x10 ;
  14.     _WDWORD(0xE000ED9C, temp);                                                                         // RBAR
  15.     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) ;
  16.     _WDWORD(0xE000EDA0, temp);                                                                         // RASR
  17.     _WDWORD(0xE000ED24, 1<<18);                                                                 // usage fault enable
  18.     _WDWORD(0xE000ED94, 5);                                                                         // MPU enable
  19. }

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



  27. Clock_Setup();
  28. InitSDRAM();
  29. LOAD  %L INCREMENTAL                                                                                        // Download  
  30. mpu_region_setup( 0xA0000000,0,0x16,3,7,0,0,1);

  31. Setup(0xA0000000);                                              // Setup for Running


复制代码


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2018-7-20 11:44:31 | 显示全部楼层
如果要改成lpc1857 用sdram 是要修改那里?

出0入0汤圆

 楼主| 发表于 2018-7-26 16:22:53 | 显示全部楼层
liang16888 发表于 2018-7-20 11:44
如果要改成lpc1857 用sdram 是要修改那里?

没接触过这款MCU,应该和1778 差不多吧,初始化流程,port,clock,emc ...
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 21:48

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

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