STM32F4 FSMC/FMC SRAM as Heap/Stack 导致随机硬故障
STM32F4 FSMC/FMC SRAM as Heap/Stack results in random hardfaults
我们目前正在评估使用 STM32F439BI 微控制器在我们的平台上使用外部 SRAM C/C++ 堆存储。
问题
使用 SRAM 作为堆存储会导致 buserrors/imprecice 总线错误引发的随机硬故障。
在不将堆放在 SRAM 上的情况下,内存测试 运行 在整个 SRAM 上成功(8 bit/16 位和 32 位访问)。
连接调试器 我有时可以在硬故障发生之前观察到这些错误。大多数情况下,从 SRAM 中读取一个字并且 CPU 寄存器填充以下格式的地址:0x-1F3-1F3(- 通常为“0”,有时为 'A' 或“6”) . “1F3”模式仍然存在。如果再次读取相同的地址,则再向下读取一些行会读取正确的值(0x60000000 space 中的其他地址)。
如果我在程序早期的某个断点处停止程序并执行几行,我会更频繁地遇到这些错误。
更多详情
- SRAM 使用 FMC 库 1 和 SRAM 库 1 上的 FMC/FSMC 外设连接,因此内存映射到地址 0x60000000。
- GPIO 引脚和 FMC 配置的所有设置都是在 main() 执行或创建静态对象之前从启动文件设置的。
- SRAM如下:CY7C1041GN30
- 我们将所有 16 个数据引脚、所有 18 个地址引脚、BHE、BLE、OE、WE 和 CE 连接到我们的控制器。所有引脚都配置为推挽交替功能、上拉、AF_12 (FMC)、非常高速。我们为所有必要的引脚启用时钟,为 FMC 启用时钟。注意:最初我们没有 pull-up/down 表现出相同的症状。
- 控制器 运行s 时钟速度为 168 MHz
- 如上所述,内存测试运行成功
- 我们使用 DMA 进行 SPI、I2C 和 ADC 数据传输
- 我们经常使用中断,包括外部(引脚)中断
- 我们使用以下计时设置:
- 地址设置时间:2
- 地址保持时间:4
- 数据设置时间:4
- BusTurnAroundDuration: 1
- CLK分频:2
- 数据延迟:2
- 我们配置FMC如下:
- NSBank FMC_NORSRAM_BANK1,
- DataAddressMux FMC_DATA_ADDRESS_MUX_DISABLE,
- 内存类型FMC_MEMORY_TYPE_SRAM,
- 内存数据宽度FMC_NORSRAM_MEM_BUS_WIDTH_16,
- 突发访问模式FMC_BURST_ACCESS_MODE_DISABLE,
- WaitSignalPolarity FMC_WAIT_SIGNAL_POLARITY_LOW,
- 环绕模式FMC_WRAP_MODE_DISABLE,
- WaitSignalActive FMC_WAIT_TIMING_BEFORE_WS,
- WriteOperation FMC_WRITE_OPERATION_ENABLE,
- 等待信号FMC_WAIT_SIGNAL_DISABLE,
- 扩展模式 FMC_EXTENDED_MODE_DISABLE,
- 异步等待FMC_ASYNCHRONOUS_WAIT_DISABLE,
- WriteBurst FMC_WRITE_BURST_DISABLE,
- 连续时钟FMC_CONTINUOUS_CLOCK_SYNC_ASYNC,
- 写Fifo 0,
- 页面大小 0
- 我们花了很多时间来试验更长的时序,并将所有设置与示例进行比较,包括这个:使用STM32L476/486 FSMC 外设
驱动外部存储器(虽然这个是针对STM32L4的,我很确定它也适用于这个控制器)
类似问题的发现
- 这个问题听起来与这个 errata sheet 条目非常相似:“2.3.4 从 FMC 读取的数据损坏”但它也表示错误已在我们的控制器修订版中修复(3)
我希望有人以前见过这种奇怪的行为并且可以帮助我们。经过一个多星期的调试,当 interrupts/DMA 访问发生而 CPU 访问 SRAM(当我们将其用作堆时,访问非常频繁)时,我们预计控制器会出现某种错误。希望您能阐明这个话题。
刚从 ST 得到确认,STM32F469 FMC 中存在一个错误,如果禁用写入 fifo,可能会导致错误的值。解决方法是启用 fifo。这与此 F7 处理器 https://www.st.com/resource/en/errata_sheet/dm00145382.pdf
中的问题相同
抱歉没有回复你,互联网。
是的,我们发现了问题所在(至少在我们的案例中)。问题是,如果我们使用的 J-Link 调试器悬挂在我们 pcb 上的电力电子设备上方(它是垂直安装的),则会引起问题。如果我们将带状电缆从顶部引出(仅限数字电子设备),错误就会消失。所以我们的猜测是,来自电子设备的一些噪声被电缆捕获并直接注入 JTAG 端口,导致 MCU 内部出现故障。
我们目前正在评估使用 STM32F439BI 微控制器在我们的平台上使用外部 SRAM C/C++ 堆存储。
问题
使用 SRAM 作为堆存储会导致 buserrors/imprecice 总线错误引发的随机硬故障。 在不将堆放在 SRAM 上的情况下,内存测试 运行 在整个 SRAM 上成功(8 bit/16 位和 32 位访问)。 连接调试器 我有时可以在硬故障发生之前观察到这些错误。大多数情况下,从 SRAM 中读取一个字并且 CPU 寄存器填充以下格式的地址:0x-1F3-1F3(- 通常为“0”,有时为 'A' 或“6”) . “1F3”模式仍然存在。如果再次读取相同的地址,则再向下读取一些行会读取正确的值(0x60000000 space 中的其他地址)。 如果我在程序早期的某个断点处停止程序并执行几行,我会更频繁地遇到这些错误。
更多详情
- SRAM 使用 FMC 库 1 和 SRAM 库 1 上的 FMC/FSMC 外设连接,因此内存映射到地址 0x60000000。
- GPIO 引脚和 FMC 配置的所有设置都是在 main() 执行或创建静态对象之前从启动文件设置的。
- SRAM如下:CY7C1041GN30
- 我们将所有 16 个数据引脚、所有 18 个地址引脚、BHE、BLE、OE、WE 和 CE 连接到我们的控制器。所有引脚都配置为推挽交替功能、上拉、AF_12 (FMC)、非常高速。我们为所有必要的引脚启用时钟,为 FMC 启用时钟。注意:最初我们没有 pull-up/down 表现出相同的症状。
- 控制器 运行s 时钟速度为 168 MHz
- 如上所述,内存测试运行成功
- 我们使用 DMA 进行 SPI、I2C 和 ADC 数据传输
- 我们经常使用中断,包括外部(引脚)中断
- 我们使用以下计时设置:
- 地址设置时间:2
- 地址保持时间:4
- 数据设置时间:4
- BusTurnAroundDuration: 1
- CLK分频:2
- 数据延迟:2
- 我们配置FMC如下:
- NSBank FMC_NORSRAM_BANK1,
- DataAddressMux FMC_DATA_ADDRESS_MUX_DISABLE,
- 内存类型FMC_MEMORY_TYPE_SRAM,
- 内存数据宽度FMC_NORSRAM_MEM_BUS_WIDTH_16,
- 突发访问模式FMC_BURST_ACCESS_MODE_DISABLE,
- WaitSignalPolarity FMC_WAIT_SIGNAL_POLARITY_LOW,
- 环绕模式FMC_WRAP_MODE_DISABLE,
- WaitSignalActive FMC_WAIT_TIMING_BEFORE_WS,
- WriteOperation FMC_WRITE_OPERATION_ENABLE,
- 等待信号FMC_WAIT_SIGNAL_DISABLE,
- 扩展模式 FMC_EXTENDED_MODE_DISABLE,
- 异步等待FMC_ASYNCHRONOUS_WAIT_DISABLE,
- WriteBurst FMC_WRITE_BURST_DISABLE,
- 连续时钟FMC_CONTINUOUS_CLOCK_SYNC_ASYNC,
- 写Fifo 0,
- 页面大小 0
- 我们花了很多时间来试验更长的时序,并将所有设置与示例进行比较,包括这个:使用STM32L476/486 FSMC 外设 驱动外部存储器(虽然这个是针对STM32L4的,我很确定它也适用于这个控制器)
类似问题的发现
- 这个问题听起来与这个 errata sheet 条目非常相似:“2.3.4 从 FMC 读取的数据损坏”但它也表示错误已在我们的控制器修订版中修复(3)
我希望有人以前见过这种奇怪的行为并且可以帮助我们。经过一个多星期的调试,当 interrupts/DMA 访问发生而 CPU 访问 SRAM(当我们将其用作堆时,访问非常频繁)时,我们预计控制器会出现某种错误。希望您能阐明这个话题。
刚从 ST 得到确认,STM32F469 FMC 中存在一个错误,如果禁用写入 fifo,可能会导致错误的值。解决方法是启用 fifo。这与此 F7 处理器 https://www.st.com/resource/en/errata_sheet/dm00145382.pdf
中的问题相同抱歉没有回复你,互联网。
是的,我们发现了问题所在(至少在我们的案例中)。问题是,如果我们使用的 J-Link 调试器悬挂在我们 pcb 上的电力电子设备上方(它是垂直安装的),则会引起问题。如果我们将带状电缆从顶部引出(仅限数字电子设备),错误就会消失。所以我们的猜测是,来自电子设备的一些噪声被电缆捕获并直接注入 JTAG 端口,导致 MCU 内部出现故障。