Arm STM32F4 FSMC/FMC SRAM作为堆/堆栈导致随机硬故障

Arm STM32F4 FSMC/FMC SRAM作为堆/堆栈导致随机硬故障,arm,heap,stm32,ram,cortex-m,Arm,Heap,Stm32,Ram,Cortex M,我们目前正在评估在使用STM32F439BI微控制器的平台上使用外部SRAM进行C/C++堆存储 问题 使用SRAM作为堆的存储器会导致随机硬故障,这些故障是由buserrors/imprecice buserrors引起的。 如果不将堆放在SRAM上,内存测试将在整个SRAM上成功运行(8位/16位和32位访问)。 连接调试器时,我有时可以在硬故障发生之前观察到这些错误。通常从SRAM读取一个字,CPU寄存器填充以下格式的地址:0x-1F3-1F3(-通常为“0”,有时为“a”或“6”)。“1

我们目前正在评估在使用STM32F439BI微控制器的平台上使用外部SRAM进行C/C++堆存储

问题

使用SRAM作为堆的存储器会导致随机硬故障,这些故障是由buserrors/imprecice buserrors引起的。 如果不将堆放在SRAM上,内存测试将在整个SRAM上成功运行(8位/16位和32位访问)。 连接调试器时,我有时可以在硬故障发生之前观察到这些错误。通常从SRAM读取一个字,CPU寄存器填充以下格式的地址:0x-1F3-1F3(-通常为“0”,有时为“a”或“6”)。“1F3”模式仍然存在。如果再次读取相同的地址,则会读取更向下的一些行的正确值(0x60000000空间中的其他一些地址)。 如果我在程序早期的某个时间点在断点上停止程序并执行几行操作,我会更频繁地遇到这些错误

更多详细信息

  • SRAM使用FMC气缸组1和SRAM气缸组1上的FMC/FSMC外围设备连接,因此内存映射到地址0x60000000
  • 在执行main()或创建静态对象之前,从启动文件中设置GPIO引脚和FMC配置的所有设置
  • SRAM如下所示:
  • 我们将所有16个数据管脚、所有18个地址管脚、BHE、BLE、OE、We和CE连接到控制器。所有引脚配置为推拉交替功能、上拉、AF_12(FMC)、非常高速。我们为所有必要的引脚启用时钟,并为FMC启用时钟。注意:最初,我们在没有出现相同症状的情况下启动
  • 控制器以168 MHz的时钟速度运行
  • 如上所述,内存测试成功运行
  • 我们使用DMA进行SPI、I2C和ADC数据传输
  • 我们经常使用中断,包括外部(pin)中断
  • 我们使用以下计时设置:
    • 地址设置时间:2
    • 地址保持时间:4
    • 数据设置时间:4
    • BusTurnAroundDuration:1
    • CLK分区:2
    • 数据延迟:2
  • 我们将FMC配置如下:
    • NSBank FMC_NORSRAM_银行1
    • DataAddressMux FMC_DATA_ADDRESS_MUX_DISABLE
    • MemoryType FMC_MEMORY_TYPE_SRAM
    • MemoryDataWidth FMC_NORSRAM_MEM_BUS_WIDTH_16
    • BurstAccessMode FMC_BURST_ACCESS_MODE_DISABLE
    • WaitSignal极性FMC_WAIT_信号极性_LOW
    • WrapMode FMC_WRAP_模式_禁用
    • 等待信号激活FMC在等待时间之前
    • 写入操作FMC\U写入操作\U启用
    • 等待信号FMC_等待信号_禁用
    • 扩展模式FMC_扩展模式_禁用
    • AsynchronousWait FMC_ASYNCHRONOUS_WAIT_DISABLE
    • WriteBurst FMC_写入_突发_禁用
    • 连续时钟FMC\u连续时钟\u同步\u异步
    • WriteFifo 0
    • 页面大小0
  • 我们花了大量时间试验更长的计时,并将所有设置与示例(包括此示例)进行了比较:(虽然此示例适用于STM32L4,但我相当确定它也适用于此控制器)
关于类似问题的调查结果

  • 问题听起来与此条目非常相似:“2.3.4从FMC读取的数据损坏”,但它也表示错误已在我们对控制器(3)的修订版中修复。

我希望有人以前见过这种奇怪的行为,能帮助我们。经过一周多的调试,当CPU访问SRAM时(当我们将其用作堆时,访问非常频繁),当中断/DMA访问发生时,我们预计控制器会出现某种错误。希望您能对此主题有所了解。

刚刚从ST得到确认,STM32F469 FMC中存在一个缺陷,如果禁用写入fifo,可能会导致错误的值。解决方法是启用fifo。这与此F7处理器中的问题相同

很抱歉没有回复您,internet


是的,我们发现了问题所在(至少在我们的案例中)。问题是,如果我们使用的J-Link调试器挂在pcb上的电力电子设备上方(它是垂直安装的),那么它会导致问题。如果我们在顶部引导带状电缆(仅数字电子设备),错误就会消失。因此,我们猜测,来自电子设备的一些噪声被电缆捕获并直接注入JTAG端口,这导致了MCU内部的故障。

所有引脚都配置为上拉,我认为它们应该配置为推拉,而不是上拉。STM32F429发现示例项目就是这样做的。您好@berendi感谢您的回复。你可能是对的。最初,我们将引脚配置为备用功能推拉,不带上拉/下拉。但我们有同样的症状。我更新了上面的帖子。所有这些地址实际上都是无效的。看起来你有不稳定的闪存读取导致错误的访问地址是的,这些地址是无效的。这就是问题所在,FMC没有返回有效数据。问题可能是闪存读取不稳定,但我们正在从内部闪存读取,当添加更多WaitState(5WS->8WS)时,问题仍然会发生。我们从来没有看到UsageFault是由无效指令引起的。0x4b43 4b43这是什么?0x4b43 4b43是一个不指向任何地方的随机地址。0x4008 0000-0x4fff ffff在数据表中标记为保留。在有效AHB1区域之后和AHB2区域之前