大家好,
我正在使用MIMXRT1040-EVK ,并使用MCUXpresso IDE 和 LinkServer/SWD 。
我遇到的问题是,我的应用程序在从 RAM 链接和执行时可以正常工作,但是当配置为从外部 FlexSPI NOR Flash 执行时,调试器无法到达 main() 函数。
RAM版本:
“将应用程序链接到 RAM” 已启用
应用程序下载成功
应用程序执行正常
调试器到达 main() 函数处。
我可以正常调试应用程序。
Flash/XIP 版本:
“将应用程序链接到 RAM” 已禁用
应用程序链接到外部闪存,起始地址为 0x60000000
版本成功完成
生成 .axf 文件
当我开始调试时,调试器没有执行到 main() 函数。
CPU 似乎并未从预期的 0x600xxxxx XIP 地址范围执行。
生成的 .map文件显示了预期的 XIP 布局:
.boot_hdr 0x60000000
.boot_hdr.conf 0x60000000
.boot_hdr.ivt 0x60001000
.boot_hdr.boot_data
0x60001020
.text 0x60002000
.isr_vector 0x60002000
ResetISR 0x6000231C
main 0x60004EF4因此,该应用程序似乎包含预期的 FlexSPI 或非 启动头、IVT、启动数据、向量表、ResetISR 和应用程序代码。
我还有:
XIP_EXTERNAL_FLASH = 1 XIP_BOOT_HEADER_ENABLE = 1
在尝试调试/编程 Flash 映像后,我检查了以下内存:
0x60000000 0x60001000 0x60002000
内存窗口显示的是 0x00000000/空数据,而不是预期的应用程序内容。
例如,在:
0x60002000
我原本期望看到应用程序向量表,但内存中似乎包含零。
调试失败后,CPU寄存器还显示:
PC = 0x0020E368 SP = 0x20200F70 LR = 0x0020ED49
而不是预期的 0x600xxxxx XIP 区域中的 PC。
我正在使用:
Debug Connection: SWD Connect script: RT1040_connect.scp
调试配置包含:
Load image: enabled Use project binary: igpio_led_output.axf Load symbols: enabled Use project binary: igpio_led_output.axf Set breakpoint at: main Request hardware breakpoint: enabled
正在使用 LinkServer 调试配置。
该项目包含标准的 XIP 相关文件:
xip/ ├── evkmimxrt1040_flexspi_nor_config.c ├── evkmimxrt1040_flexspi_nor_config.h ├── fsl_flexspi_nor_boot.c └── fsl_flexspi_nor_boot.h
生成的链接器脚本还会将启动头和应用程序放置在从 0x60000000 开始的 BOARD_FLASH 区域中。
请问有人可以帮我找出原因吗?在启动 LinkServer 调试会话时,外部 FlexSPI 或非 Flash 没有被写入生成的 XIP 映像。
具体来说:
MIMXRT1040-EVK + LinkServer是否需要特定的 FlexSPI NOR Flash 驱动程序/配置才能调试 XIP 应用程序?
RT1040_connect.scp 是否足以同时用于连接和编程外部 NOR Flash?
MCUXpresso调试配置中是否还需要任何额外的Flash编程配置?
调试配置是否应该使用特定的 flexspi_nor Flash 驱动程序或 Flash 工具配置?
Is there a known issue with LinkServer + MIMXRT1040 + 外部 FlexSPI 或非 + XIP 调试 where the .axf is loaded as symbols but the external Flash is not actually programmed?
是否有推荐的 NXP 示例项目/配置可供我参考,以便进行MIMXRT1040-EVK FlexSPI 或非 XIP 调试会话?
希望能得到一些指导,告诉我接下来应该检查哪些内容。
谢谢!
谢谢你的回复。
我按照你的建议检查了 MCU设置→内存 细节。我附上了截图。
BOARD_FLASH 存储器配置如下:
位置: 0x60000000
大小: 0x800000
闪存驱动程序: MIMXRT1040_SFDP_QSPI.cfx
因此,看来特定的外部 Flash 驱动程序已经配置为 BOARD_FLASH 。
我还尝试了串口下载模式 + MCU 配置工具的步骤。我使用 MCU 配置工具成功构建了镜像并写入了镜像。
然而,在那之后,我仍然无法通过正常的 MCUXpresso + LinkServer 调试流程从 Flash 中对应用程序进行编程/调试。
有趣的是,当我稍后再次尝试刷写/调试代码时,它突然就成功了,应用程序也成功地从 Flash 运行了。
在失败和成功的尝试之间,我没有故意更改项目配置、Flash 驱动程序、链接器配置或启动设置。
因此,目前我怀疑问题可能出在 Flash 编程/初始化/复位序列上,而不是应用程序/链接器配置本身。
请问是什么原因导致MIMXRT1040-EVK出现这种现象?
尤其:
由于相同的配置最终在没有进行任何有意更改的情况下就能正常工作,我想了解之前失败的原因,以便我们能够使 Flash 调试/编程更加可靠。
谢谢!
你好@Prashanth1 ,
根据您提供的截图,Flash 驱动程序配置似乎没有问题。
您能否先尝试将开发板置于串口下载模式,然后使用 MCUXpresso 安全配置工具通过 USB/UART 将镜像下载到 Flash?
该方法可以排除调试器的影响,并可用于检查电路板是否存在闪存硬件问题。另外,请提供使用调试器生成的下载失败日志。
我这边会尽快安排一台 RT1040-EVK,并尝试使用您之前附加的项目包重现该问题。
此致,
加文
您好,加文先生,
谢谢你的回复。
我按照您的建议检查了MCU设置→内存详细信息。我附上了截图。
在我的项目中,BOARD_FLASH 存储器配置如下:
因此,FlexSPI 或非 Flash 驱动程序似乎已经与 BOARD_FLASH 存储区域关联起来。
但是,我注意到 MCU 设置顶部的“默认 LinkServer Flash Driver”字段为空,而 BOARD_FLASH 的驱动程序列显示为 MIMXRT1040_SFDP_QSPI.cfx。
请您确认一下:
我的主要问题是,应用程序已正确链接到 XIP 的 0x60000000,但在启动 LinkServer 调试会话后,我在内存窗口中看不到 0x60000000 / 0x60002000 处的应用程序内容。
RAM调试功能在同一应用程序中运行正常。
我已附上MCU设置截图供您参考。
谢谢!
RT1040MCUsettings.png
你好@Prashanth1 ,
感谢您对 NXP MIMXRT 系列产品的关注!
使用外置闪光灯时,需要特定的闪光灯驱动程序。请检查闪存驱动程序是否已正确加载到 IDE 中:(我的屏幕截图以 RT1170 为例;RT1040 的操作过程类似。)
Gavin_Jia_0-1786341203390.png
此致,
加文
你好@Prashanth1 ,
根据所描述的现象,最可能的原因是闪存中之前存在脏数据/图像。无论是错误的 FCB 标头还是导致 MCU 在执行时进入错误状态的映像,此类问题都可能导致尝试重新刷写映像时失败。在这种情况下,标准的恢复方法是进入串行下载模式。您可能需要参考这篇文章: https://community.nxp.com/t5/i-MX-RT-Crossover-MCUs-Knowledge/RT-board-recovery-for-debugger-connect...
关于闪存加载器的选择,您只需在 IDE 的“闪存”行中选择相应的闪存驱动程序即可。*.scp 文件随 SDK 提供,用于预配置链路服务器;您可以进入该文件了解每一行命令的更多信息。
此致,
加文