【发布时间】: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