SDRAM模式寄存器设置失败

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

SDRAM模式寄存器设置失败

1,715 Views
ljun_cdut
Contributor I

 LPC1788 由Bootloader跳转到APP时,调试发现程序死在SDRAM初始化,设置SDRAM模式寄存器位置即这条语句:

Dummy = *((volatile uint32_t *)(SDRAM_BASE | (0x33<<12)));  /* Mode Register Setting */,其中SDRAM是MT48LC16M16A2P-6A,Bootloader和APP程序硬件初始化中都对SDRAM进行了初始化,并且初始化函数相同,调试也发现SDRAM初始化一次,程序正常运行。

请问有遇到过同类的情况吗?SDRAM模式寄存器不能多次设置吗?求解

Labels (1)
0 Kudos
6 Replies

1,546 Views
jeremyzhou
NXP Employee
NXP Employee

Hi 君 罗,

非常感谢使用NXP产品,很高兴为你提供技术支持!
首先,我想你介绍一下debug过程,还有你把SDRAM初始化过程是放在程序(Bootloader和APP)中那个位置,最后,你有单独调试过APP吗,它是否能正常工作。

Have a great day,
TIC

 

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos

1,546 Views
ljun_cdut
Contributor I

bootloader进入Main函数之后就进行外设初始化过程如下

void HW_Init(void)
{
       I_GPIO_Init();

      #if (SYS_TICK_MS>0)
         I_SYSTICK_Init();
      #endif
      #if H_EEPROM
         I_EEPROM_Init();
      #endif
      #if H_SDRAM
         I_SDRAMInit();
      #endif
      #if H_FS_USBDisk
         f_mount(&fs_USB,"2:",0);
      #endif
      #if H_LCD
            I_LCD_Init();
      #endif
}

APP进入Main之后也同样是对外设进行初始化如下:

void HW_Init(void)
{
      I_GPIO_Init();
      #if H_EEPROM
         I_EEPROM_Init();
      #endif
      #if (SYS_TICK_MS>0)
         I_SYSTICK_Init();
      #endif
      #if H_SDRAM
         I_SDRAMInit();
      #endif
      #if H_FS_SDCARD
         f_mount(&fs_SD,"1:",0);

      #endif
      #if H_FS_USBDisk
         f_mount(&fs_USB,"2:",0);
      #endif
      #if H_LCD
         I_LCD_Init();
      #endif
      #if HANDLE_CONTROLLER
         I_SPI_BUS_Init();
      #endif
      Rtc_Init();
      ModBus_Init();

      Chip_EEPROM_Init(LPC1788_EEPROM);
}

单独调试APP是可以正常工作的,请问有什么情况可能会导致这样的问题?谢谢

0 Kudos

1,546 Views
jeremyzhou
NXP Employee
NXP Employee

Hi 君 罗,

感谢回复。
查看了MT48LC16M16A2P数据手册发现,SDRAM Mode register在被首次赋值或重新赋值时,需要一个前提: 'all banks are idle'。
所以我建议你在跳转application之前,将EMC Control register中的E位置0。

pastedImage_1.png
So please give a try.

Have a great day,
TIC

 

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
----------------------------------------------------------------------------------------------------------------------

0 Kudos

1,546 Views
ljun_cdut
Contributor I

你好

      我已经在bootloader, EMC register中使能位置0 ,目前测试正常,这个地方我想知道,这种方式与关闭EMC 外设电源有什么区别?因为进入APP,在时钟稳定后,关闭了EMC外设电源的,这个地方我的理解是相当于把EMC相关寄存器置为复位状态了,还有是否能提供一个有bootloader和APP完整的例程?谢谢

0 Kudos

1,546 Views
jeremyzhou
NXP Employee
NXP Employee

Hi

感谢回复。

1) 这种方式与关闭EMC 外设电源有什么区别?

-- 从最终的目的角度看,两者应该是没有区别。

2)还有是否能提供一个有bootloader和APP完整的例程?

-- 官方应用文档提供了几篇bootloader的文档及例程代码,请参考:

https://www.nxp.com/docs/en/application-note/AN10866.zip 

https://www.nxp.com/docs/en/application-note/AN11257.zip 

Have a great day,
TIC

 

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
----------------------------------------------------------------------------------------------------------------------

0 Kudos

1,546 Views
ljun_cdut
Contributor I

你好

     好的,谢谢!

0 Kudos