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




以下为测试结果

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





引自免费微信小程序:皆我百晓生:
根据您提供的信息,您在使用STM32H743核心板尝试初始化并访问W9825G6KH SDRAM时遇到了问题,尽管初始化显示成功,但读写操作失败。下面我会根据您提供的代码片段和流程进行分析,并提供可能的解决思路。
从SDRAM_Initialization_Sequence函数来看,初始化步骤基本符合常规流程,包括时钟使能、预充电、自刷新、加载模式寄存器等。不过,代码中有一些格式错误(例如变量声明缺少分号),这可能导致编译错误。确保所有语句正确结束,例如:
uint32_t temp = 0;
uint32_t err = 0;
在设置模式寄存器时,您似乎手动拼接了一个temp值,但代码中存在格式问题且未完全展示如何构建这个值。正确的构建方式应是组合各个模式寄存器位,例如:
temp = (SDRAM_MODEREG_BURST_LENGTH_1 |
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
SDRAM_MODEREG_CAS_LATENCY_2 |
SDRAM_MODEREG_OPERATING_MODE_STANDARD |
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE);
请确保这些宏定义与您的SDRAM器件规格相匹配,并且在实际代码中正确应用了它们。
SDRAM_Send_Cmd函数该函数中,有一处明显的错误是在成功发送命令后的返回语句缺少返回值。应该有明确的返回语句,例如:
if(HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF) == HAL_OK)
{
return 0; // 成功
}
else
{
return 1; // 失败
}
在bsp_TestExtSDRAM函数中,存在几个问题:
;而不是1。if (*pSRAM++ != i) 应放在循环内部,并且循环后应检查err值。修正后的读写测试示例:
for(i = 0; i < 10; i++)
{
*pSRAM++ = i;
}
err = 0;
pSRAM = (uint32_t*)EXTSDRAMADDR;
for(i = 0; i < 10; i++)
{
if (*pSRAM != i)
{
err++;
}
pSRAM++; // 移动指针到下一个位置
printf("%d\r\n", i); // 打印的是i的值,不是*pSRAM,根据需要调整
}
if (err > 0)
{
return 4 * err;
}
// 数据求反并写入逻辑需要补充完整
请确认HAL_SDRAM_Init(&hsdram1, &SdramTiming);中的SdramTiming参数是否与您的SDRAM芯片数据表完全一致,特别是时序参数(如LoadToActiveDelay、ExitSelfRefreshDelay等)。
确保SDRAM的时钟线和电源供应稳定,以及所有的地址线、数据线和控制线连接正确无误。
请根据上述建议修改代码并重新测试。如果问题依旧,请考虑使用调试器检查初始化后的SDRAM寄存器状态,以及读写操作期间的信号完整性,以进一步定位问题所在。