54018 plain load image

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

54018 plain load image

3,326 Views
fisker_avit
Contributor I

你好,目前我们公司项目使用的是54018,由于我们的目标程序较大,所以没办法直接使用XIP的方式或者Plain load image.

请问,有没有办法在使用Plain load image方式的时候,更改为external sdram?

或者,请问有什么办法解决这个问题?

Labels (2)
0 Kudos
13 Replies

2,809 Views
jeremyzhou
NXP Employee
NXP Employee

Hi,
非常感谢使用NXP产品,很高兴为你提供技术支持!
我不太理解你的意思,你是想要把代码放到SDRAM内,从SDRAM启动吗?
这显然是不行的,因为LPC54xxx不带内部Flash,再加上你说的贵司的工程代码量很大,在我看来从QSPI flash是最理想的启动方式啊。
Have a great day,
TIC

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

0 Kudos

2,808 Views
fisker_avit
Contributor I

HI,

非常感谢您的回复。

对,是想把代码放到sdram中执行。

我们在之前的操作中遇到以下两个解决不了的问题:

1。以QSPI flash启动,但是程序对flash 进行读写操作会出现问题。   使用demo程序spifi_dma_transfer就会停止在flash reset的地方。  我们的项目必须程序运行的时候操作spifi flash存储数据的(需要存储关键性数据)。   
2。使用QSPI flash方式启动我们的项目程序(屏蔽spifi flash操作),发现emwin调用图片多的页面,这种方式会出现刷新缓慢,图像一帧一帧显示。
这两个问题如果解决,那么采用QSPI flash启动应该没有问题。
谢谢!
0 Kudos

2,808 Views
jeremyzhou
NXP Employee
NXP Employee

Hi ,

谢谢你的回复。

针对你的问题:

1. 如果你设置启动是XIP image, 而且load address 就是在QSPI flash中的话, 那你操作SPIFI模块的方式对QSPI flash读写是会有点不妥,毕竟代码就在里面运行呢,所以我赞成你说的代码运行在SDRAM中。

2. 具体实现方式:首先,将QSPI flash中的代码分成两部分,跟着设置MCU启动方式为:Load image, 使得QSPI flash中代码1部分可运行在片内SRAM中,其作用是初始化SDRAM, 并将QSPI flash2中代码2部分拷贝到SDRAM后,实现程序跳转,使得程序能在SDRAM中运行。
Have a great day,
TIC

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

0 Kudos

2,808 Views
fisker_avit
Contributor I

HI,

非常感谢您的回复。

针对您提出的方案,我比较赞同。

有2点问题,跟您请教:

1. 下载到sdram的第二部分代码, 是否还可以通过 MCUXpresso IDE调试?

2. 之前我做过尝试,但是没有成功,是否有例程?或者成功的案例参考?

谢谢!

0 Kudos

2,808 Views
jeremyzhou
NXP Employee
NXP Employee

Hi ,

回答你的问题

1) 当然,这是可以的。

2)没有现成的application 例程作为参考,因为这算是比较复杂,高级一些的应用了。
Have a great day,
TIC

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

0 Kudos

2,808 Views
fisker_avit
Contributor I

HI,

理解。

我们项目很紧急,计划参加9月初的德国展览,所以还需要您再帮忙。

我在NXP论坛上看到一个方法,add-symbol-file可以把loader以及main app结合到一起调试,

但是我在54018上调试,一直没有成功,请您也看看这个,方便的话,帮忙调试看看。

地址:https://community.nxp.com/message/1042364?commentID=1042364#comment-1042364 

非常感谢您的支持。

谢谢!

0 Kudos

2,808 Views
jeremyzhou
NXP Employee
NXP Employee

Hi ,

请分享一下你的测试步骤(最好附上截图)还有报错的截图,方便我查找出原因。
Have a great day,
TIC

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

0 Kudos

2,808 Views
fisker_avit
Contributor I

HI,

通过loader启动的方式有一些进展,

1. main app以qspi flash启动的方式,loader可以调用通过,但是main app还是不能对flash进行读写,所以这个不是我们想要的方式。

2. main app以plain load image的方式,具体操作如下:

loader的主体代码:

void boot_jump(uint32_t addr)
{
__asm("LDR SP,[R0]");
__asm("LDR PC,[R0,#4]");
}


int main(void)
{
uint32_t index = 0;
uint32_t *sdram = (uint32_t *)SDRAM_BASE_ADDR; /* SDRAM start address. */

/* Hardware Initialization */
CLOCK_EnableClock(kCLOCK_InputMux);
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

BOARD_InitPins();
BOARD_BootClockFROHF96M();
BOARD_InitDebugConsole();
BOARD_InitSDRAM();

PRINTF("\r\n Start EMC SDRAM access flash .\r\n");
SpifiFlashInit();
SpifiFlashRead(0xa0000000sdram, 0x200000);


PRINTF("\r\n Start EMC SDRAM access example.\r\n");

boot_jump(0xa0000000);//在这里添加断点,在debugger console中这里添加add-sybol-file mainapp.axf 0xa0000000,就可以跳转到main app的resetISR,但是单步再往下执行就跳到HardFault_Hander(这个是loader中的函数)中。
//boot_jump(0x10800000);

/* Prepare data and write to SDRAM. */

while (1)
{
}
}

pastedImage_1.png

pastedImage_2.png

loader的设置:

pastedImage_3.png

pastedImage_4.png

0 Kudos

2,808 Views
jeremyzhou
NXP Employee
NXP Employee

Hi fisker avit,

我发现两个疑问的地方,

1. 跳转设置还需要VTOR寄存器的。

2. main app采用以plain load image的方式,程序本身运行于RAM中,你在debugger console中添加add-sybol-file mainapp.axf 0xa0000000, 不知道是否就是上面的 main app。


Have a great day,
TIC

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

0 Kudos

2,808 Views
fisker_avit
Contributor I

HI,

针对提问逐条回答:

1. 跳转设置还需要时钟VTOR寄存器的。

FISKER:是指SysTick->CTRL = 0;
    SCB->VTOR = addr & 0xFFFFFF80;
    boot_jump(addr); ?

这样我也尝试过,结果一样。

2. main app采用以plain load image的方式,程序本身运行于RAM中,你在debugger console中添加add-sybol-file mainapp.axf 0xa0000000, 不知道是否就是上面的 main app。

FISKER: 是同一个,我采用的main app会load到external sdram上,如果不使用add-symbol-file,会提示Break at address "" with no debug information available, or outside of programe code.

  如果不采用plain load image方式,就是qspi方式启动main的话,是可以从loader到debug 调试的。

所以我检测0x10800000地址以及0xa0000000地址的内容,发现内容也是一模一样,但表现的现象不一样(如上次回复所说)。

0 Kudos

2,808 Views
jeremyzhou
NXP Employee
NXP Employee

Hi fisker avit,

Thanks for your reply.

1)时钟两字是我多打的,请忽略。

2)我很迷惑了,一个已经在芯片内运行程序将存储在QSPI中的‘自己’搬运到SDRAM中,然后跳转??

      即使成功了有什么目的,你还是运行自己吗,而现在此程序不就在RAM中运行吗?

3) 最好分享一篇文章,希望有帮助:“No source available”, or how to Debug Multiple Binaries with GDB and Eclipse | MCU on Eclipse 
Have a great day,
TIC

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

0 Kudos

2,808 Views
fisker_avit
Contributor I

HI,

最近出差,没时间回复,请见谅。

有两个程序,1为loader, 2为 main app .

通过QSPI方式启动loader,通过loader获取存储与flash中的main,并拷贝到外部sdram运行。

再请教另外一个问题:

通过外部flash QSPI方式启动程序, 怎么操作外部flash的读写?(测试demo发现会在外部flash reset的时候卡住)

0 Kudos

2,809 Views
jeremyzhou
NXP Employee
NXP Employee

Hi fisker avit,

Thanks for your reply.

如果通过外部QSPI启动,要读写操作此QSPI,可以试试把这一操作的代码放在内部的RAM中执行。

Have a great day,

TIC

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

0 Kudos