你好!我正在为 i.MX RT1176 开发代码。我的代码通过外部闪存(型号 MX25UM51345G)和 XIP 运行,某些功能通过 RAM 运行。
启动工作正常,但执行大约 30 秒后处理器会死机。在连接调试器时,我发现 PC 被外部闪存中的一条指令卡住了(不一定是同一条指令或功能),而步进/恢复执行也无济于事(仍然卡在同一个 PC 上)。不产生故障。
我读取了 FlexSPI、SEMC 和 Cortex M-7 寄存器寄存器,但似乎一切正常。
核心冻结后,我可以强制 PC 进入 RAM(使用调试器),代码执行正常,直到代码尝试跳回闪存。 此外,在这种状态下从 RAM 执行的代码似乎能够读取闪存数据。
既然从闪存中读取数据是正常的,我想这可能是从闪存中获取指令的问题,但我不能肯定。即使是从闪存获取指令的问题,我也不知道该如何调试。
如有任何帮助,将不胜感激。
感谢您对 NXP MIMXRT 系列的关注!
根据您描述的症状,MCU 似乎运行正常。RAM 中的代码运行正常,系统可以从闪存读取数据和向闪存写入数据,但 XIP 却卡住了。 我认为目前最可能的根本原因是 AHB 预取/缓存与运行期间在同一 XIP 闪存上执行的 IP 命令、LUT/模式更新或擦除/写入操作之间发生了冲突。请检查是否在类似操作中出现问题。
如果需要在系统运行时对同一 XIP Flash 进行任何 IP 命令或配置更改,则必须将代码加载到 SRAM 中才能执行。 使用单个闪存设备时,闪存在繁忙时不会对进一步的访问做出响应。它还指出,与闪存写入相关的代码应从内部 SRAM 运行,应禁用中断以避免意外访问 Flash,并且 LUT 更新需要重置软件以避免冲突问题。
有一个最简单的故障排除方法:首先禁用所有闪存操作,然后只运行 XIP,看看是否能解决之前的问题。有关详情,请参阅此 AN:https://www.nxp.com/docs/en/application-note/AN12564.pdf。
致以最诚挚的问候,
Gavin
我不知道有专用 FlexSPI 寄存器位报告 “预取/指令提取冲突”。INTR 只报告已定义的错误/超时,因此干净的 INTR 并不能完全排除 XIP 读路径问题。
在这种情况下,下一个疑点应该是纯 XIP 读路径条件:FlexSPI AHB 预取/缓存行为、Cortex-M7 推测/缓存行取回、MPU 内存属性、FlexSPI 采样时钟/DQS/DLL 时序余量,以及八进制 DDR 闪存的 LUT/虚拟/模式配置。
为了缩小范围,请尝试以下测试。
禁用 FlexSPI AHB 预取
这只是为了先进行调试,检查挂起是否与 AHB 预取/缓冲区行为有关。减少 FlexSPI 根时钟/串行时钟
如果问题在较低的时钟消失,则更多地指向 DQS/DLL 采样余量、电路板级信号完整性或虚拟周期时序。暂时禁用指令缓存/数据缓存或查看 MPU 属性
重新检查 AHB 读取 LUT 和闪存时序配置
检查挂起后的 FlexSPI 状态
致以最诚挚的问候,
Gavin