[ARM9、LPC] LPC4357 SDRAM内存调试

[复制链接]
4651|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 时就是正常的。请问有知道这个什么原因吗?或者知道解决方法的呢?
附上现在测试用的工程,会弄的朋友请帮我修改一下这个工程也可以~!

本帖子中包含更多资源

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

×
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 里的配置在附件的工程里啊!你可以看看!
  1. __var __mac_temp_STAT;

  2. __PLL0(){

  3.   //Reset, BASE_M4_CLK = IRC
  4.   __writeMemory32(0X01000800,0x4005006C,"Memory");
  5.   
  6.   //OSC Enable
  7.   __writeMemory32(__readMemory32(0x40050018,"Memory")& (~(1<<0)),0x40050018,"Memory");
  8.   __delay(100);
  9.   
  10.   //Set PLL 96MHz
  11.   __writeMemory32(0X00000001,0x40050044,"Memory");
  12.   __writeMemory32(0X065F2100,0x40050044,"Memory");

  13.   //wait PLL lock
  14.   do
  15.   {
  16.    __mac_temp_STAT = __readMemory32(0x40050040,"Memory");
  17.   }
  18.   while((__mac_temp_STAT & 1) == 0);
  19.   
  20.   //CGU_BASE_M4_CLK = PLL1
  21.   __writeMemory32(0x09000800,0x4005006C,"Memory");
  22.   
  23.   __writeMemory32(__readMemory32(0x4004312C,"Memory")&(~(1<<16)),0x4004312C,"Memory");  //CREG6 EMC_CLK_DIV = 0
  24.   __writeMemory32(__readMemory32(0x40051430,"Memory")| (1<<0),0x40051430,"Memory");     //CLK_M4_EMC_CFG Enable
  25.   do
  26.   {
  27.    __mac_temp_STAT = __readMemory32(0x40051434,"Memory");       //CCU1_CLK_M4_EMC_STAT
  28.   }
  29.   while((__mac_temp_STAT & 1) == 0);

  30.   __writeMemory32(__readMemory32(0x40051478,"Memory")| (1<<0),0x40051478,"Memory");     //CLK_M4_EMCDIV Enable
  31.   do
  32.   {
  33.    __mac_temp_STAT = __readMemory32(0x4005147C,"Memory");       //CCU1_CLK_M4_EMCDIV_STAT
  34.   }
  35.   while((__mac_temp_STAT & 1) == 0);
  36. }

  37. __Setup(){
  38.   
  39.   //Disable EMC
  40.   __writeMemory32(0x00000000,0x40005000,"Memory");
  41.   
  42.   //Configure EMC port pins
  43.   __writeMemory32(0X000000F3,0x4008609C,"Memory");  /* P1_7:  D0 */
  44.   __writeMemory32(0X000000F3,0x400860A0,"Memory");  /* P1_8:  D1 */
  45.   __writeMemory32(0X000000F3,0x400860A4,"Memory");  /* P1_9:  D2 */
  46.   __writeMemory32(0X000000F3,0x400860A8,"Memory");  /* P1_10: D3 */
  47.   __writeMemory32(0X000000F3,0x400860AC,"Memory");  /* P1_11: D4 */
  48.   __writeMemory32(0X000000F3,0x400860B0,"Memory");  /* P1_12: D5 */
  49.   __writeMemory32(0X000000F3,0x400860B4,"Memory");  /* P1_13: D6 */
  50.   __writeMemory32(0X000000F3,0x400860B8,"Memory");  /* P1_14: D7 */
  51.   __writeMemory32(0X000000F2,0x40086290,"Memory");  /* P5_4:  D8 */
  52.   __writeMemory32(0X000000F2,0x40086294,"Memory");  /* P5_5:  D9 */
  53.   __writeMemory32(0X000000F2,0x40086298,"Memory");  /* P5_6:  D10 */
  54.   __writeMemory32(0X000000F2,0x4008629C,"Memory");  /* P5_7:  D11 */
  55.   __writeMemory32(0X000000F2,0x40086280,"Memory");  /* P5_0:  D12 */
  56.   __writeMemory32(0X000000F2,0x40086284,"Memory");  /* P5_1:  D13 */
  57.   __writeMemory32(0X000000F2,0x40086288,"Memory");  /* P5_2:  D14 */
  58.   __writeMemory32(0X000000F2,0x4008628C,"Memory");  /* P5_3:  D15 */
  59.   __writeMemory32(0X000000F2,0x40086688,"Memory");  /* PD_2:  D16 */
  60.   __writeMemory32(0X000000F2,0x4008668C,"Memory");  /* PD_3:  D17 */
  61.   __writeMemory32(0X000000F2,0x40086690,"Memory");  /* PD_4:  D18 */
  62.   __writeMemory32(0X000000F2,0x40086694,"Memory");  /* PD_5:  D19 */
  63.   __writeMemory32(0X000000F2,0x40086698,"Memory");  /* PD_6:  D20 */
  64.   __writeMemory32(0X000000F2,0x4008669C,"Memory");  /* PD_7:  D21 */
  65.   __writeMemory32(0X000000F2,0x400866A0,"Memory");  /* PD_8:  D22 */
  66.   __writeMemory32(0X000000F2,0x400866A4,"Memory");  /* PD_9:  D23 */
  67.   __writeMemory32(0X000000F3,0x40086714,"Memory");  /* PE_5:  D24 */
  68.   __writeMemory32(0X000000F3,0x40086718,"Memory");  /* PE_6:  D25 */
  69.   __writeMemory32(0X000000F3,0x4008671C,"Memory");  /* PE_7:  D26 */
  70.   __writeMemory32(0X000000F3,0x40086720,"Memory");  /* PE_8:  D27 */
  71.   __writeMemory32(0X000000F3,0x40086724,"Memory");  /* PE_9:  D28 */
  72.   __writeMemory32(0X000000F3,0x40086728,"Memory");  /* PE_10: D29 */
  73.   __writeMemory32(0X000000F3,0x4008672C,"Memory");  /* PE_11: D30 */
  74.   __writeMemory32(0X000000F3,0x40086730,"Memory");  /* PE_12: D31 */

  75.   __writeMemory32(0X000000F3,0x40086124,"Memory");  /* P2_9:  A0 */
  76.   __writeMemory32(0X000000F3,0x40086128,"Memory");  /* P2_10: A1 */
  77.   __writeMemory32(0X000000F3,0x4008612C,"Memory");  /* P2_11: A2 */
  78.   __writeMemory32(0X000000F3,0x40086130,"Memory");  /* P2_12: A3 */
  79.   __writeMemory32(0X000000F3,0x40086134,"Memory");  /* P2_13: A4 */
  80.   __writeMemory32(0X000000F2,0x40086080,"Memory");  /* P1_0:  A5 */
  81.   __writeMemory32(0X000000F2,0x40086084,"Memory");  /* P1_1:  A6 */
  82.   __writeMemory32(0X000000F2,0x40086088,"Memory");  /* P1_2:  A7 */
  83.   __writeMemory32(0X000000F3,0x40086120,"Memory");  /* P2_8:  A8 */
  84.   __writeMemory32(0X000000F3,0x4008611C,"Memory");  /* P2_7:  A9 */
  85.   __writeMemory32(0X000000F2,0x40086118,"Memory");  /* P2_6:  A10 */
  86.   __writeMemory32(0X000000F2,0x40086108,"Memory");  /* P2_2:  A11 */
  87.   __writeMemory32(0X000000F2,0x40086104,"Memory");  /* P2_1:  A12 */
  88.   __writeMemory32(0X000000F2,0x40086100,"Memory");  /* P2_0:  A13 */
  89.   __writeMemory32(0X000000F1,0x40086320,"Memory");  /* P6_8:  A14 */

  90.   // Byte enables
  91.   __writeMemory32(0x000000F3,0x40086090,"Memory");  // P1_4  BLS 0
  92.   __writeMemory32(0x000000F1,0x40086318,"Memory");  // P6_6  BLS 1
  93.   __writeMemory32(0x000000F2,0x400866B4,"Memory");  // PD_13 BLS 2
  94.   __writeMemory32(0x000000F2,0x400866A8,"Memory");  // PD_10 BLS 3
  95.   
  96.   __writeMemory32(0X000000F3,0x40086324,"Memory");  /* P6_9:  DYCS0 */
  97.   __writeMemory32(0X000000F3,0x40086098,"Memory");  /* P1_6:  WE */
  98.   __writeMemory32(0X000000F3,0x40086310,"Memory");  /* P6_4:  CAS */
  99.   __writeMemory32(0X000000F3,0x40086314,"Memory");  /* P6_5:  RAS */
  100.   
  101.   //Configure EMC clock-out pins
  102.   __writeMemory32(0X000000F0,0x40086C00,"Memory");  /* CLK0 */
  103.   __writeMemory32(0X000000F0,0x40086C04,"Memory");  /* CLK1 */
  104.   __writeMemory32(0X000000F0,0x40086C08,"Memory");  /* CLK2 */
  105.   __writeMemory32(0X000000F0,0x40086C0C,"Memory");  /* CLK3 */
  106.   
  107.   //CKEOUT0 DQMOUT0 DQMOUT1 DQMOUT2 DQMOUT3
  108.   __writeMemory32(0X000000F3,0x4008632C,"Memory");  /* P6_11: CKEOUT0 */
  109.   __writeMemory32(0X000000F3,0x40086330,"Memory");  /* P6_12: DQMOUT0 */
  110.   __writeMemory32(0X000000F3,0x40086328,"Memory");  /* P6_10: DQMOUT1 */
  111.   __writeMemory32(0X000000F2,0x40086680,"Memory");  /* PD_0:  DQMOUT2 */
  112.   __writeMemory32(0X000000F3,0x40086734,"Memory");  /* PE_13: DQMOUT3 */

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

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

  133.   __writeMemory32(1,0x40005030,"Memory");  //DYNAMICRP
  134.   __writeMemory32(3,0x40005034,"Memory");  //DYNAMICRAS
  135.   __writeMemory32(6,0x40005038,"Memory");  //DYNAMICSREX
  136.   __writeMemory32(1,0x4000503C,"Memory");  //DYNAMICAPR
  137.   __writeMemory32(5,0x40005040,"Memory");  //DYNAMICDAL
  138.   __writeMemory32(1,0x40005044,"Memory");  //DYNAMICWR
  139.   __writeMemory32(5,0x40005048,"Memory");  //DYNAMICRC
  140.   __writeMemory32(5,0x4000504C,"Memory");  //DYNAMICRFC
  141.   __writeMemory32(6,0x40005050,"Memory");  //DYNAMICXSR
  142.   __writeMemory32(1,0x40005054,"Memory");  //DYNAMICRRD
  143.   __writeMemory32(2,0x40005058,"Memory");  //DYNAMICMRD

  144.   __delay(100);
  145.   __writeMemory32(0x00000183,0x40005020,"Memory");      /*DYNAMICCONTROL (Issue NOP command) */
  146.   __delay(10);
  147.   __writeMemory32(0x00000103,0x40005020,"Memory");      /*DYNAMICCONTROL (Issue PALL command) */
  148.   __delay(1);
  149.   __writeMemory32(0x00000002,0x40005024,"Memory");      /*DYNAMICREFRESH */
  150.   __delay(10);
  151.   __writeMemory32(0x0000006E,0x40005024,"Memory");      /*DYNAMICREFRESH */
  152.   __delay(10);
  153.   __writeMemory32(0x00000083,0x40005020,"Memory");      /*DYNAMICCONTROL (Issue MODE command) */
  154.   __readMemory32(0x2800C800,"Memory");
  155.   __delay(10);
  156.   __writeMemory32(0x00000003,0x40005020,"Memory");      /*DYNAMICCONTROL (Issue NORMAL command) */
  157.   
  158.   //DYNAMICCONFIG0 (Enable buffer)
  159.   __writeMemory32(__readMemory32(0x40005100,"Memory") | (1 << 19),0x40005100,"Memory");

  160.   __delay(200);
  161. }

  162. execUserReset()
  163. {
  164.   __message "execUserReset\n";
  165.   __Setup();
  166.   __writeMemory32(0X28000000,0x40043100,"Memory");      //Set CREG_M4MEMMAP
  167.   __message "execUserReset Finish\n";
  168. }

  169. execUserPreload(){
  170.   __message "execUserPreload\n";
  171.   __PLL0();     //Set PLL0
  172.   __Setup();
  173.   __message "execUserPreload Finish\n";
  174. }
aozima 发表于 2014-10-8 10:27 | 显示全部楼层
testmb1 发表于 2014-10-6 21:55
aozima,你说的 IAR 的调试脚本,指的是那些?怎么修改代码可以粘出来吗?
还有,我的 SDRAM 里的配置在附 ...

在这脚本最后把SP和PC更新下就可以RUN了。
 楼主| 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,我不会设置啊!可以粘出来吗?
aozima 发表于 2014-10-8 10:45 | 显示全部楼层
testmb1 发表于 2014-10-8 10:44
不好意思!我不是很会使用 IAR,我不会设置啊!可以粘出来吗?

1. 没用过,也从没写过
2. 查IAR的文档养于上面脚本的部分,然后自己写。
3. 最简单的是找下有没其它示例也有用这种方式,照猫画虎估计是最快的。
 楼主| testmb1 发表于 2014-10-8 10:49 | 显示全部楼层
好的!谢谢帮忙!
huangxz 发表于 2015-3-17 23:55 | 显示全部楼层
aozima 发表于 2014-10-8 10:27
在这脚本最后把SP和PC更新下就可以RUN了。

帮忙到家啊,怎么更新SP和PC啊?
vansi1989 发表于 2015-6-13 11:02 | 显示全部楼层
你好,求助4357sdram问题,自己画的板子,32位方式从0x28000000开始往里写数据,总是会出错,而且有规律的错,比如0x28000040,0x28000080,0x280000c0,0x28000100,0x28000140可能会错,到底为什么啊
rongwinzip 发表于 2015-6-25 00:50 | 显示全部楼层
vansi1989 发表于 2015-6-13 11:02
你好,求助4357sdram问题,自己画的板子,32位方式从0x28000000开始往里写数据,总是会出错,而且有规律的 ...

感觉内存与cpu之间有线没连好
lovelymnk 发表于 2015-7-3 23:20 | 显示全部楼层
有2 种可能:1.LPC4357有虚焊;2.SDRAM虚焊。手工焊接的板子经常会有虚焊。
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挂掉,板子重新上电才行。这是什么原因呢?

本帖子中包含更多资源

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

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

本帖子中包含更多资源

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

×
赵小伟神 发表于 2015-10-28 21:35 | 显示全部楼层
貌似手册里有说过的四个时钟必须配置成emc_clk,在16位数据线或者是32位数据线的情况下,话说我也是被这个问题坑了好久,我用的是16位的sdram,和开发板的还不一样,找了n久的问题,
赵小伟神 发表于 2015-10-28 21:37 | 显示全部楼层
还有手册上有说的ba0和ba1的问题,可以注意下,那种等差数列的错误,个人感觉是地址线的问题,最大可能是cas,ras的问题,
bd7qwmcu 发表于 2016-4-8 21:31 | 显示全部楼层
强烈关注结果,我也遇到问题,好久了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部