使用stm32h743核心板,板载SDRAM为W9864G6KH-6。使用cubemx配置fmc,生成代码,并编写sdram初始化代码,显示初始化成功但在测试程序时,无法读写sdram。



使用stm32h743核心板,板载SDRAM为W9864G6KH-6。使用cubemx配置fmc,生成代码,并编写sdram初始化代码,显示初始化成功但在测试程序时,无法读写sdram。



关注让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言问题分析:
#define SDRAM_DEVICE_SIZE 64 // SDRAM size in MB
#define SDRAM_Initialization_Sequence ((uint32_t)0x00000000)
void SDRAM_Init(void)
{
__IO uint32_t tmpmrd = 0;
FMC_SDRAM_CommandTypeDef Command;
Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(&SDRAM_Handler, &Command, HAL_MAX_DELAY);
/* Insert 100 us delay */
HAL_Delay(1);
Command.CommandMode = FMC_SDRAM_CMD_PALL;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(&SDRAM_Handler, &Command, HAL_MAX_DELAY);
Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 8;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(&SDRAM_Handler, &Command, HAL_MAX_DELAY);
tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1
| SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL
| SDRAM_MODEREG_CAS_LATENCY_3
| SDRAM_MODEREG_OPERATING_MODE_STANDARD
| SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = tmpmrd;
HAL_SDRAM_SendCommand(&SDRAM_Handler, &Command, HAL_MAX_DELAY);
/* Config the SDRAM device */
sdramHandle.Instance = FMC_SDRAM_DEVICE;
/* Timing configuration for 100Mhz as SD clock frequency (System clock is up to 200Mhz) */
sdramHandle.Init.SDBank = FMC_SDRAM_BANK1;
sdramHandle.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
sdramHandle.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
sdramHandle.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
sdramHandle.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
sdramHandle.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
sdramHandle.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
sdramHandle.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
sdramHandle.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
sdramHandle.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
HAL_SDRAM_Init(&sdramHandle, &SDRAM_Timing);
/* SDRAM device initialization */
SDRAM_Initialization_Sequence(SDRAM_DEVICE_SIZE);
}
以上是一个简单的SDRAM初始化代码示例,确保SDRAM的初始化成功后,可以编写一个简单的读写SDRAM的测试程序,检查是否能够正确读写。