我们目前正在评估使用STM32F439BI微控制器在平台上使用外部SRAM进行C / C ++堆存储。
问题
使用SRAM作为堆的存储空间会导致随机的硬故障,这些硬故障是由buserrors / impcice buserrors引起的。 在不将堆放在SRAM上的情况下,内存测试可以在整个SRAM上成功运行(8位/ 16位和32位访问)。 连接调试器我有时会在发生硬故障之前观察到这些错误。通常,从SRAM读取一个字,CPU寄存器填充以下格式的地址:0x-1F3-1F3(-通常为'0',有时为'A'或'6')。模式“ 1F3”持续存在。如果再次读取相同的地址,则再往后几行读取正确的值(其他地址在0x60000000空间中)。 如果我在程序的某个早期在某个断点处停止该程序并执行几行,那么我会更频繁地得到这些错误。
更多详细信息
关于类似问题的发现
我希望外面的人以前已经见过这种奇怪的行为,可以为我们提供帮助。经过一个多星期的调试,我们预计当CPU访问SRAM时发生中断/ DMA访问时,控制器中会出现某种错误(当我们将其用作堆时,访问频率很高)。希望您能对此主题有所启发。
答案 0 :(得分:1)
很抱歉,互联网无法及时回复您。
是的,我们发现了问题所在(至少在我们的情况下)。问题是,如果我们使用的J-Link调试器悬挂在PCB上的电力电子设备上方(垂直安装),则会引起问题。如果我们将带状电缆从顶部引出(仅限数字电子设备),则错误消失。因此,我们的猜测是,来自电子设备的一些噪声被电缆捕获并直接注入JTAG端口,从而导致MCU内部发生故障。
答案 1 :(得分:-1)
仅从ST确认,如果禁用了写fifo,则STM32F469 FMC中存在一个错误,该错误可能导致错误的值。解决方法是启用fifo。这与此F7处理器https://www.st.com/resource/en/errata_sheet/dm00145382.pdf
中的问题相同您找到解决方案了吗?我们在STM32F469上看到了相同的内容。 我们已经看到,当读取无效值时,不会从SRAM进行任何实际的读取。
我们发现在此表中将内部闪存时序从1更改为4 internal flash timing使一切正常。我们不知道是因为时间的改变导致问题消失,还是与内部闪存有关。 此处显示了不同配置下的问题值:
1 5WS 3V3(默认值)–地址为0x002e 002e的免费通话后发生的硬故障
2 5WS NO PRE –在地址为0x4b43 4b43的免费通话后发生HardFault
3 8WS 3V3 – libc中的HardFault,R3 = 0x6013 6013此值来自/的使用是未知的,所以可能没事
4个8WS NO PRE –没有错误。
请注意,它是使用相同的软件版本进行测量的。在启动过程中使用调试器更改了时间。
我们还发现,在失败的LDR指令之前添加两个NOP指令可以解决该问题。当然,这都不是永久性的解决方案。