LPC1788 由Bootloader跳转到APP时,调试发现程序死在SDRAM初始化,设置SDRAM模式寄存器位置即这条语句:
Dummy = *((volatile uint32_t *)(SDRAM_BASE | (0x33<<12))); /* Mode Register Setting */,其中SDRAM是MT48LC16M16A2P-6A,Bootloader和APP程序硬件初始化中都对SDRAM进行了初始化,并且初始化函数相同,调试也发现SDRAM初始化一次,程序正常运行。
请问有遇到过同类的情况吗?SDRAM模式寄存器不能多次设置吗?求解
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!
-----------------------------------------------------------------------------------------------------------------------
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是可以正常工作的,请问有什么情况可能会导致这样的问题?谢谢
Hi 君 罗,
感谢回复。
查看了MT48LC16M16A2P数据手册发现,SDRAM Mode register在被首次赋值或重新赋值时,需要一个前提: 'all banks are idle'。
所以我建议你在跳转application之前,将EMC Control register中的E位置0。
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!
----------------------------------------------------------------------------------------------------------------------
你好
我已经在bootloader, EMC register中使能位置0 ,目前测试正常,这个地方我想知道,这种方式与关闭EMC 外设电源有什么区别?因为进入APP,在时钟稳定后,关闭了EMC外设电源的,这个地方我的理解是相当于把EMC相关寄存器置为复位状态了,还有是否能提供一个有bootloader和APP完整的例程?谢谢
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!
----------------------------------------------------------------------------------------------------------------------
你好
好的,谢谢!