我目前正在使用 Touchgfx 在带有
STM32F469II 和 RGB565 格式的 1024x600 屏幕的自定义板上开发一个项目。我还同时使用了外部 SDRAM 和闪存,并且 DMA2D 已激活。
最近,我一直遇到执行某些屏幕转换时发生硬故障的问题。错误总是发生,例如,当执行 2 个向上滑动过渡然后从左到右滑动过渡时。在此过程中的任何时间执行任何屏幕转换(包括“无”转换)时,它也可能随机发生。禁用 DMA2D 并不能解决问题。
进入硬故障处理程序时,故障分析器会为我们提供以下标志:
因此,通过查看标志,我相信这是一个总线故障,它转变为一个硬故障,尽管它没有提到数据访问是否准确。BFAR中存储的地址似乎没有更新,无助于定位故障源。
SP 寄存器指向地址 0x2002ae48,它在 TouchGFX 堆栈的堆栈范围内,连同我设置的所有其他任务,似乎没有其他任务(许多 0xA5A5A5A5 默认值仍然存在于所有栈)。我还可以通过查看“pxCurrentTCB”的值来补充,硬故障似乎是在 TouchGFX 任务开启时发生的。
PC 寄存器指向地址 0x26262030,它在内部 RAM 的范围之外,内部 RAM 停止在 0x20050000。
最后,LR 寄存器指向 0x809bbf9 处的闪存地址。进入反汇编,我们可以看到围绕该地址的以下指令:
因此,硬故障似乎是由屏幕转换前调用的函数“touchgfx::Drawable::invalidate()”触发的。但是,对我来说,由于在 invalidate() 函数内将任何断点放入源代码/汇编程序代码会停止代码的处理,因此永远不会到达,因此跟踪就此停止。
我还尝试增加/减少 touchGFX 任务可用的堆栈(低至 1024 字和高至 10240 字)但无济于事。
我对那种硬故障调试很陌生,所以如果有人能帮我解决这个错误,我将不胜感激。