打印
[ARM9、LPC]

LPC4357 SDRAM内存调试

[复制链接]
4048|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
testmb1|  楼主 | 2014-10-6 19:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 testmb1 于 2014-10-6 19:15 编辑

我用的 CPU 是 LPC4357 ,内存 IC 是 MT48LC4M32B2P,用的是 IAR 开发环境。想把程序直接下载到 SDRAM 来调试,我的做法是将需要调试的文件下载到 SDRAM ,这需要一个初始化 SDRAM 的 MAC文件,在编写 MAC 文件时遇到的问题是,程序可以直接下载到 SDRAM 里,也已通过程序的正确性验证,但是程序执行时就跑飞了,我把 run to main 的选项去掉时,再执行,程序停在 0X00000000 处,这是启动区的映射位置,这里的值是 SP 的值 ,0X00000004 处的是 PC 的值,但当我查看 CPU 里面的当前寄存器的 SP 和 PC 的值时,都为 0X00000000 ,只要手动把这两个值修改为 0X00000000 和 0X00000004 处的值,程序就可以正常运行了!我想用代码自动修改这两个值,但是不成功。但把程序下载到 SRAM 时就是正常的。请问有知道这个什么原因吗?或者知道解决方法的呢?
附上现在测试用的工程,会弄的朋友请帮我修改一下这个工程也可以~!

2.png (120.94 KB )

手动修改后的正确值

手动修改后的正确值

1.png (122.94 KB )

错误的值

错误的值

SDRAMTest.rar

235.54 KB

测试工程

相关帖子

沙发
aozima| | 2014-10-6 20:50 | 只看该作者
本帖最后由 aozima 于 2014-10-6 20:51 编辑

看看IAR的调试脚本如何写,在这个脚本里面可以修改CPU的一些状态。
可以自己写一个把SP和PC设置好

如果是想用代码,可以在其boot的存储器中写这段代码。
不过这段代码运行时,SDRAM还没初始化也没加载APP呢。

另外,你的SDRAM在哪配置的?

使用特权

评论回复
板凳
testmb1|  楼主 | 2014-10-6 21:55 | 只看该作者
aozima,你说的 IAR 的调试脚本,指的是那些?怎么修改代码可以粘出来吗?
还有,我的 SDRAM 里的配置在附件的工程里啊!你可以看看!
__var __mac_temp_STAT;

__PLL0(){

  //Reset, BASE_M4_CLK = IRC
  __writeMemory32(0X01000800,0x4005006C,"Memory");
  
  //OSC Enable
  __writeMemory32(__readMemory32(0x40050018,"Memory")& (~(1<<0)),0x40050018,"Memory");
  __delay(100);
  
  //Set PLL 96MHz
  __writeMemory32(0X00000001,0x40050044,"Memory");
  __writeMemory32(0X065F2100,0x40050044,"Memory");

  //wait PLL lock
  do
  {
   __mac_temp_STAT = __readMemory32(0x40050040,"Memory");
  }
  while((__mac_temp_STAT & 1) == 0);
  
  //CGU_BASE_M4_CLK = PLL1
  __writeMemory32(0x09000800,0x4005006C,"Memory");
  
  __writeMemory32(__readMemory32(0x4004312C,"Memory")&(~(1<<16)),0x4004312C,"Memory");  //CREG6 EMC_CLK_DIV = 0
  __writeMemory32(__readMemory32(0x40051430,"Memory")| (1<<0),0x40051430,"Memory");     //CLK_M4_EMC_CFG Enable
  do
  {
   __mac_temp_STAT = __readMemory32(0x40051434,"Memory");       //CCU1_CLK_M4_EMC_STAT
  }
  while((__mac_temp_STAT & 1) == 0);

  __writeMemory32(__readMemory32(0x40051478,"Memory")| (1<<0),0x40051478,"Memory");     //CLK_M4_EMCDIV Enable
  do
  {
   __mac_temp_STAT = __readMemory32(0x4005147C,"Memory");       //CCU1_CLK_M4_EMCDIV_STAT
  }
  while((__mac_temp_STAT & 1) == 0);
}

__Setup(){
  
  //Disable EMC
  __writeMemory32(0x00000000,0x40005000,"Memory");
  
  //Configure EMC port pins
  __writeMemory32(0X000000F3,0x4008609C,"Memory");  /* P1_7:  D0 */
  __writeMemory32(0X000000F3,0x400860A0,"Memory");  /* P1_8:  D1 */
  __writeMemory32(0X000000F3,0x400860A4,"Memory");  /* P1_9:  D2 */
  __writeMemory32(0X000000F3,0x400860A8,"Memory");  /* P1_10: D3 */
  __writeMemory32(0X000000F3,0x400860AC,"Memory");  /* P1_11: D4 */
  __writeMemory32(0X000000F3,0x400860B0,"Memory");  /* P1_12: D5 */
  __writeMemory32(0X000000F3,0x400860B4,"Memory");  /* P1_13: D6 */
  __writeMemory32(0X000000F3,0x400860B8,"Memory");  /* P1_14: D7 */
  __writeMemory32(0X000000F2,0x40086290,"Memory");  /* P5_4:  D8 */
  __writeMemory32(0X000000F2,0x40086294,"Memory");  /* P5_5:  D9 */
  __writeMemory32(0X000000F2,0x40086298,"Memory");  /* P5_6:  D10 */
  __writeMemory32(0X000000F2,0x4008629C,"Memory");  /* P5_7:  D11 */
  __writeMemory32(0X000000F2,0x40086280,"Memory");  /* P5_0:  D12 */
  __writeMemory32(0X000000F2,0x40086284,"Memory");  /* P5_1:  D13 */
  __writeMemory32(0X000000F2,0x40086288,"Memory");  /* P5_2:  D14 */
  __writeMemory32(0X000000F2,0x4008628C,"Memory");  /* P5_3:  D15 */
  __writeMemory32(0X000000F2,0x40086688,"Memory");  /* PD_2:  D16 */
  __writeMemory32(0X000000F2,0x4008668C,"Memory");  /* PD_3:  D17 */
  __writeMemory32(0X000000F2,0x40086690,"Memory");  /* PD_4:  D18 */
  __writeMemory32(0X000000F2,0x40086694,"Memory");  /* PD_5:  D19 */
  __writeMemory32(0X000000F2,0x40086698,"Memory");  /* PD_6:  D20 */
  __writeMemory32(0X000000F2,0x4008669C,"Memory");  /* PD_7:  D21 */
  __writeMemory32(0X000000F2,0x400866A0,"Memory");  /* PD_8:  D22 */
  __writeMemory32(0X000000F2,0x400866A4,"Memory");  /* PD_9:  D23 */
  __writeMemory32(0X000000F3,0x40086714,"Memory");  /* PE_5:  D24 */
  __writeMemory32(0X000000F3,0x40086718,"Memory");  /* PE_6:  D25 */
  __writeMemory32(0X000000F3,0x4008671C,"Memory");  /* PE_7:  D26 */
  __writeMemory32(0X000000F3,0x40086720,"Memory");  /* PE_8:  D27 */
  __writeMemory32(0X000000F3,0x40086724,"Memory");  /* PE_9:  D28 */
  __writeMemory32(0X000000F3,0x40086728,"Memory");  /* PE_10: D29 */
  __writeMemory32(0X000000F3,0x4008672C,"Memory");  /* PE_11: D30 */
  __writeMemory32(0X000000F3,0x40086730,"Memory");  /* PE_12: D31 */

  __writeMemory32(0X000000F3,0x40086124,"Memory");  /* P2_9:  A0 */
  __writeMemory32(0X000000F3,0x40086128,"Memory");  /* P2_10: A1 */
  __writeMemory32(0X000000F3,0x4008612C,"Memory");  /* P2_11: A2 */
  __writeMemory32(0X000000F3,0x40086130,"Memory");  /* P2_12: A3 */
  __writeMemory32(0X000000F3,0x40086134,"Memory");  /* P2_13: A4 */
  __writeMemory32(0X000000F2,0x40086080,"Memory");  /* P1_0:  A5 */
  __writeMemory32(0X000000F2,0x40086084,"Memory");  /* P1_1:  A6 */
  __writeMemory32(0X000000F2,0x40086088,"Memory");  /* P1_2:  A7 */
  __writeMemory32(0X000000F3,0x40086120,"Memory");  /* P2_8:  A8 */
  __writeMemory32(0X000000F3,0x4008611C,"Memory");  /* P2_7:  A9 */
  __writeMemory32(0X000000F2,0x40086118,"Memory");  /* P2_6:  A10 */
  __writeMemory32(0X000000F2,0x40086108,"Memory");  /* P2_2:  A11 */
  __writeMemory32(0X000000F2,0x40086104,"Memory");  /* P2_1:  A12 */
  __writeMemory32(0X000000F2,0x40086100,"Memory");  /* P2_0:  A13 */
  __writeMemory32(0X000000F1,0x40086320,"Memory");  /* P6_8:  A14 */

  // Byte enables
  __writeMemory32(0x000000F3,0x40086090,"Memory");  // P1_4  BLS 0
  __writeMemory32(0x000000F1,0x40086318,"Memory");  // P6_6  BLS 1
  __writeMemory32(0x000000F2,0x400866B4,"Memory");  // PD_13 BLS 2
  __writeMemory32(0x000000F2,0x400866A8,"Memory");  // PD_10 BLS 3
  
  __writeMemory32(0X000000F3,0x40086324,"Memory");  /* P6_9:  DYCS0 */
  __writeMemory32(0X000000F3,0x40086098,"Memory");  /* P1_6:  WE */
  __writeMemory32(0X000000F3,0x40086310,"Memory");  /* P6_4:  CAS */
  __writeMemory32(0X000000F3,0x40086314,"Memory");  /* P6_5:  RAS */
  
  //Configure EMC clock-out pins
  __writeMemory32(0X000000F0,0x40086C00,"Memory");  /* CLK0 */
  __writeMemory32(0X000000F0,0x40086C04,"Memory");  /* CLK1 */
  __writeMemory32(0X000000F0,0x40086C08,"Memory");  /* CLK2 */
  __writeMemory32(0X000000F0,0x40086C0C,"Memory");  /* CLK3 */
  
  //CKEOUT0 DQMOUT0 DQMOUT1 DQMOUT2 DQMOUT3
  __writeMemory32(0X000000F3,0x4008632C,"Memory");  /* P6_11: CKEOUT0 */
  __writeMemory32(0X000000F3,0x40086330,"Memory");  /* P6_12: DQMOUT0 */
  __writeMemory32(0X000000F3,0x40086328,"Memory");  /* P6_10: DQMOUT1 */
  __writeMemory32(0X000000F2,0x40086680,"Memory");  /* PD_0:  DQMOUT2 */
  __writeMemory32(0X000000F3,0x40086734,"Memory");  /* PE_13: DQMOUT3 */

  __writeMemory32(0X000000F3,0x4008608C,"Memory");  // OE,  SFSP1_3
  __writeMemory32(0X000000F3,0x40086094,"Memory");  // CS0, SFSP1_5
  __writeMemory32(0X000000F3,0x40086098,"Memory");  // WE,  SFSP1_6
  
  // enable CS0 and setup the timing
  // 90ns 32-bit Flash on CS0
  __writeMemory32(0x00000001,0x40005000,"Memory");  /*EMC_CONTROL (EMC Enable) */
  
  __writeMemory32(0x00000082,0x40005200,"Memory");  // CS0: 32 bit, WE
  __writeMemory32(0x00000002,0x40005208,"Memory");  // CS0: WAITOEN = 2
  __writeMemory32(0x0000000B,0x4000520C,"Memory");  // CS0: WAITRD  = 11

  //Set EMC clock output delay
  //EMCDELAYCLK (2.5.0 ns EMC clock out delay)
  __writeMemory32(0x00005555,0x40086D00,"Memory");
  
  __writeMemory32(0x00000001,0x40005000,"Memory");  /*EMC_CONTROL (EMC Enable) */
  __writeMemory32(0x00000000,0x40005008,"Memory");  /*EMC_CONFIG (Little-endian, Clock Ratio 1:1) */
  __writeMemory32(0X00005500,0x40005100,"Memory");  /*DYNAMICCONFIG0 */
  __writeMemory32(0x00000303,0x40005104,"Memory");  /*DYNAMICRASCAS0( Latency: RAS 3, CAS 3 CCLK cyc.)*/
  __writeMemory32(0x00000001,0x40005028,"Memory");  /*DYNAMICREADCONFIG (Command delayed by 1/2 CCLK) */

  __writeMemory32(1,0x40005030,"Memory");  //DYNAMICRP
  __writeMemory32(3,0x40005034,"Memory");  //DYNAMICRAS
  __writeMemory32(6,0x40005038,"Memory");  //DYNAMICSREX
  __writeMemory32(1,0x4000503C,"Memory");  //DYNAMICAPR
  __writeMemory32(5,0x40005040,"Memory");  //DYNAMICDAL
  __writeMemory32(1,0x40005044,"Memory");  //DYNAMICWR
  __writeMemory32(5,0x40005048,"Memory");  //DYNAMICRC
  __writeMemory32(5,0x4000504C,"Memory");  //DYNAMICRFC
  __writeMemory32(6,0x40005050,"Memory");  //DYNAMICXSR
  __writeMemory32(1,0x40005054,"Memory");  //DYNAMICRRD
  __writeMemory32(2,0x40005058,"Memory");  //DYNAMICMRD

  __delay(100);
  __writeMemory32(0x00000183,0x40005020,"Memory");      /*DYNAMICCONTROL (Issue NOP command) */
  __delay(10);
  __writeMemory32(0x00000103,0x40005020,"Memory");      /*DYNAMICCONTROL (Issue PALL command) */
  __delay(1);
  __writeMemory32(0x00000002,0x40005024,"Memory");      /*DYNAMICREFRESH */
  __delay(10);
  __writeMemory32(0x0000006E,0x40005024,"Memory");      /*DYNAMICREFRESH */
  __delay(10);
  __writeMemory32(0x00000083,0x40005020,"Memory");      /*DYNAMICCONTROL (Issue MODE command) */
  __readMemory32(0x2800C800,"Memory");
  __delay(10);
  __writeMemory32(0x00000003,0x40005020,"Memory");      /*DYNAMICCONTROL (Issue NORMAL command) */
  
  //DYNAMICCONFIG0 (Enable buffer)
  __writeMemory32(__readMemory32(0x40005100,"Memory") | (1 << 19),0x40005100,"Memory");

  __delay(200);
}

execUserReset()
{
  __message "execUserReset\n";
  __Setup();
  __writeMemory32(0X28000000,0x40043100,"Memory");      //Set CREG_M4MEMMAP
  __message "execUserReset Finish\n";
}

execUserPreload(){
  __message "execUserPreload\n";
  __PLL0();     //Set PLL0
  __Setup();
  __message "execUserPreload Finish\n";
}

使用特权

评论回复
地板
aozima| | 2014-10-8 10:27 | 只看该作者
testmb1 发表于 2014-10-6 21:55
aozima,你说的 IAR 的调试脚本,指的是那些?怎么修改代码可以粘出来吗?
还有,我的 SDRAM 里的配置在附 ...

在这脚本最后把SP和PC更新下就可以RUN了。

使用特权

评论回复
5
testmb1|  楼主 | 2014-10-8 10:44 | 只看该作者
本帖最后由 testmb1 于 2014-10-8 10:46 编辑

testmb1 发表于 2014-10-6 21:55
aozima,你说的 IAR 的调试脚本,指的是那些?怎么修改代码可以粘出来吗?
还有,我的 SDRAM 里的配置在附 ...


在这脚本最后把SP和PC更新下就可以RUN了。


不好意思!我不是很会使用 IAR,我不会设置啊!可以粘出来吗?

使用特权

评论回复
6
aozima| | 2014-10-8 10:45 | 只看该作者
testmb1 发表于 2014-10-8 10:44
不好意思!我不是很会使用 IAR,我不会设置啊!可以粘出来吗?

1. 没用过,也从没写过
2. 查IAR的文档养于上面脚本的部分,然后自己写。
3. 最简单的是找下有没其它示例也有用这种方式,照猫画虎估计是最快的。

使用特权

评论回复
7
testmb1|  楼主 | 2014-10-8 10:49 | 只看该作者
好的!谢谢帮忙!

使用特权

评论回复
8
huangxz| | 2015-3-17 23:55 | 只看该作者
aozima 发表于 2014-10-8 10:27
在这脚本最后把SP和PC更新下就可以RUN了。

帮忙到家啊,怎么更新SP和PC啊?

使用特权

评论回复
9
vansi1989| | 2015-6-13 11:02 | 只看该作者
你好,求助4357sdram问题,自己画的板子,32位方式从0x28000000开始往里写数据,总是会出错,而且有规律的错,比如0x28000040,0x28000080,0x280000c0,0x28000100,0x28000140可能会错,到底为什么啊

使用特权

评论回复
10
rongwinzip| | 2015-6-25 00:50 | 只看该作者
vansi1989 发表于 2015-6-13 11:02
你好,求助4357sdram问题,自己画的板子,32位方式从0x28000000开始往里写数据,总是会出错,而且有规律的 ...

感觉内存与cpu之间有线没连好

使用特权

评论回复
11
lovelymnk| | 2015-7-3 23:20 | 只看该作者
有2 种可能:1.LPC4357有虚焊;2.SDRAM虚焊。手工焊接的板子经常会有虚焊。

使用特权

评论回复
12
vansi1989| | 2015-7-4 15:32 | 只看该作者
lovelymnk 发表于 2015-7-3 23:20
有2 种可能:1.LPC4357有虚焊;2.SDRAM虚焊。手工焊接的板子经常会有虚焊。

十楼的问题是我碰到的,难道我这也是虚焊吗?焊了四块,都是这样的现象。用的是32位的sdram----48LC4M32B2-128Mbit,和官方的开发板一样的。测试时,每次写一个32b的数据(0x55aa55aa),从0x2800 0000开始写入,当写入到第16个数据时,不会出错,再往后写,到第32、48、64(呈等差数列的规律)个数据的时候就可能出错,用jlink调试可以看出一般错误位低8位数据为0,并且jlink提示无法访问这个地址,然后jlink挂掉,板子重新上电才行。这是什么原因呢?

无标题.png (36.79 KB )

4357地址映射图

4357地址映射图

使用特权

评论回复
13
vansi1989| | 2015-7-29 20:32 | 只看该作者
我用的lpc4357,里面有4个CLK引脚,当全部配置为EMC_CLK0、EMC_CLK1、EMC_CLK2、EMC_CLK3就不会出现此问题,之前我把CLK2引脚配置成SDCLK功能了,改过就好了,希望能给遇到这个问题的朋友帮上忙。这样配置引脚肯定是不合适的,我后面会再查查到底为什么?
问题查到了,一直查到4357的勘误手册,这是mcu的bug,勘误手册有说明

捕获.PNG (171.61 KB )

捕获.PNG

使用特权

评论回复
14
赵小伟神| | 2015-10-28 21:35 | 只看该作者
貌似手册里有说过的四个时钟必须配置成emc_clk,在16位数据线或者是32位数据线的情况下,话说我也是被这个问题坑了好久,我用的是16位的sdram,和开发板的还不一样,找了n久的问题,

使用特权

评论回复
15
赵小伟神| | 2015-10-28 21:37 | 只看该作者
还有手册上有说的ba0和ba1的问题,可以注意下,那种等差数列的错误,个人感觉是地址线的问题,最大可能是cas,ras的问题,

使用特权

评论回复
16
bd7qwmcu| | 2016-4-8 21:31 | 只看该作者
强烈关注结果,我也遇到问题,好久了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

12

帖子

0

粉丝