【问题标题】:STM32F4 FSMC/FMC SRAM as Heap/Stack results in random hardfaultsSTM32F4 FSMC/FMC SRAM 作为堆/堆栈导致随机硬故障
【发布时间】:2019-05-07 05:27:45
【问题描述】:

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

问题

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

更多详情

  • SRAM 使用 FMC bank 1 和 SRAM bank 1 上的 FMC/FSMC 外设连接,因此内存映射到地址 0x60000000。
  • GPIO 引脚和 FMC 配置的所有设置都是在 main() 执行或创建静态对象之前从启动文件设置的。
  • SRAM 如下:CY7C1041GN30
  • 我们将所有 16 个数据引脚、所有 18 个地址引脚、BHE、BLE、OE、WE 和 CE 连接到我们的控制器。所有引脚都配置为推挽交替功能、上拉、AF_12 (FMC)、非常高速。我们为所有必要的引脚启用时钟,并为 FMC 启用时钟。注意:最初我们开始时没有出现相同症状的上拉/下拉。
  • 控制器以 168 MHz 的时钟速度运行
  • 如上所述,内存测试成功运行
  • 我们使用 DMA 进行 SPI、I2C 和 ADC 数据传输
  • 我们经常使用中断,包括外部(引脚)中断
  • 我们使用以下时序设置:
    • 地址设置时间:2
    • 地址保持时间:4
    • 数据设置时间:4
    • BusTurnAroundDuration: 1
    • CLKDivision:2
    • 数据延迟:2
  • 我们对 FMC 进行如下配置:
    • NSBank FMC_NORSRAM_BANK1,
    • DataAddressMux FMC_DATA_ADDRESS_MUX_DISABLE,
    • 内存类型 FMC_MEMORY_TYPE_SRAM,
    • MemoryDataWidth FMC_NORSRAM_MEM_BUS_WIDTH_16,
    • BurstAccessMode FMC_BURST_ACCESS_MODE_DISABLE,
    • WaitSignalPolarity FMC_WAIT_SIGNAL_POLARITY_LOW,
    • WrapMode FMC_WRAP_MODE_DISABLE,
    • WaitSignalActive FMC_WAIT_TIMING_BEFORE_WS,
    • WriteOperation FMC_WRITE_OPERATION_ENABLE,
    • WaitSignal FMC_WAIT_SIGNAL_DISABLE,
    • 扩展模式 FMC_EXTENDED_MODE_DISABLE,
    • AsynchronousWait FMC_ASYNCHRONOUS_WAIT_DISABLE,
    • WriteBurst FMC_WRITE_BURST_DISABLE,
    • ContinuousClock FMC_CONTINUOUS_CLOCK_SYNC_ASYNC,
    • 写入Fifo 0,
    • 页面大小 0
  • 我们花了很多时间来试验更长的时序,并将所有设置与示例进行比较,包括这个:Using STM32L476/486 FSMC peripheral to drive external memories(虽然这个是针对 STM32L4,但我相当肯定它也适用于这个控制器)

类似问题的发现

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

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

【问题讨论】:

  • 所有引脚都配置为上拉我认为它们应该配置为推挽,没有上拉。 STM32F429-Discovery 示例项目就是这样做的。
  • 嗨@berendi 谢谢你的回复。你可能是对的。最初,我们将引脚配置为无上拉/下拉的替代功能推挽。但我们有同样的症状。我更新了上面的帖子。

标签: arm heap-memory stm32 ram cortex-m


【解决方案1】:

抱歉没有回复你,互联网。

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

【讨论】:

    【解决方案2】:

    刚刚得到 ST 的确认,即 STM32F469 FMC 中存在一个错误,如果禁用写入 fifo,可能会导致错误值。解决方法是启用fifo。与此 F7 处理器 https://www.st.com/resource/en/errata_sheet/dm00145382.pdf 中的问题相同

    【讨论】:

    • 所有这些地址实际上都是无效的。
    • 您的闪存读取似乎不稳定,导致访问地址错误
    • 是的,地址无效。这就是问题所在,FMC 没有返回有效数据。问题可能是不稳定的闪存读取,但我们正在从内部闪存读取,并且当添加更多等待状态(5WS -> 8WS)时问题仍然存在。而且我们从来没有看到由于无效指令而导致的 UsageFault。
    • 0x4b43 4b43 这是什么?
    • 0x4b43 4b43 是一个不指向任何地方的随机地址。 0x4008 0000 - 0x4fff ffff 在数据表中被标记为保留。它在有效 AHB1 区域之后和 AHB2 区域之前
    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 2017-03-10
    • 2020-01-28
    • 2011-07-22
    • 2015-09-24
    • 2013-05-02
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多