我们目前正在评估使用STM32F439BI微控制器在我们的平台上使用外部SRAM进行C / C ++堆存储。
问题
将SRAM用作堆的存储会导致随机的硬件故障,这些故障是由buserrors / impcice buserrors引起的。在不将堆放在SRAM上的情况下,内存测试可以在整个SRAM上成功运行(8位/ 16位和32位访问)。连接调试器我有时会在发生硬故障之前观察到这些错误。通常,从SRAM读取一个字,CPU寄存器填充以下格式的地址:0x-1F3-1F3(-通常为'0',有时为'A'或'6')。模式“ 1F3”持续存在。如果再次读取相同的地址,则再往后几行读取正确的值(其他地址在0x60000000空间中)。如果我在程序的某个早期在某个断点处停止该程序并执行几行,则我会更频繁地得到这些错误。
更多详细信息
- 使用FMC bank 1和SRAM bank 1上的FMC / FSMC外设连接SRAM,因此将其内存映射到地址0x60000000。
- GPIO引脚和FMC配置的所有设置都是在执行main()或创建静态对象之前从启动文件设置的。
- SRAM是以下内容:CY7C1041GN30
- 我们将所有16个数据引脚,所有18个地址引脚BHE,BLE,OE,WE和CE连接到我们的控制器。所有引脚均配置为推挽备用功能,上拉,AF_12(FMC),极高速度。我们为所有必需的引脚启用时钟,为FMC启用时钟。注意:最初,我们开始时没有出现相同症状的上拉/下拉。
- 控制器以168 MHz的时钟速度运行
- 如上所述,内存测试成功运行
- 我们将DMA用于SPI,I2C和ADC数据传输
- 我们经常使用中断,包括外部(引脚)中断
- 我们使用以下计时设置:
- AddressSetupTime:2
- AddressHoldTime:4
- DataSetupTime:4
- [BusTurnAroundDuration:1
- CLKDivision:2
- DataLatency:2
- 我们按照以下方式配置FMC:
- NSBank FMC_NORSRAM_BANK1,
- DataAddressMux FMC_DATA_ADDRESS_MUX_DISABLE,
- MemoryType 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,
- ExtendedMode FMC_EXTENDED_MODE_DISABLE,
- AsynchronousWait FMC_ASYNCHRONOUS_WAIT_DISABLE,
- WriteBurst FMC_WRITE_BURST_DISABLE,
- ContinuousClock FMC_CONTINUOUS_CLOCK_SYNC_ASYNC,
- WriteFifo 0,
- PageSize 0
- [我们花费了大量时间尝试更长的时间,并将所有设置与包括该示例的示例进行了比较:Using STM32L476/486 FSMC peripheral
to drive external memories(尽管此示例适用于STM32L4,但我相当确定它也适用于此控制器)
关于类似问题的发现
我们目前正在评估使用STM32F439BI微控制器在我们的平台上使用外部SRAM进行C / C ++堆存储。使用SRAM作为堆存储的问题会导致随机...