C_diver 2024-07-31 21:54 采纳率: 0%
浏览 218
已结题

stm32 cubemx配置sdram,初始化后无法读写sdram

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

img

img

img

img


以下为测试结果

img

  • 写回答

13条回答 默认 最新

  • 专家-皆知 2024-07-31 21:57
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的信息,您在使用STM32H743核心板尝试初始化并访问W9825G6KH SDRAM时遇到了问题,尽管初始化显示成功,但读写操作失败。下面我会根据您提供的代码片段和流程进行分析,并提供可能的解决思路。

    问题分析与建议

    1. 初始化序列检查

    SDRAM_Initialization_Sequence函数来看,初始化步骤基本符合常规流程,包括时钟使能、预充电、自刷新、加载模式寄存器等。不过,代码中有一些格式错误(例如变量声明缺少分号),这可能导致编译错误。确保所有语句正确结束,例如:

    uint32_t temp = 0;
    uint32_t err = 0;
    

    2. 模式寄存器配置

    在设置模式寄存器时,您似乎手动拼接了一个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器件规格相匹配,并且在实际代码中正确应用了它们。

    3. SDRAM_Send_Cmd函数

    该函数中,有一处明显的错误是在成功发送命令后的返回语句缺少返回值。应该有明确的返回语句,例如:

    if(HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF) == HAL_OK)
    {
        return 0; // 成功
    }
    else
    {
        return 1; // 失败
    }
    

    4. 读写测试

    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;
    }
    
    // 数据求反并写入逻辑需要补充完整
    

    5. 配置检查

    请确认HAL_SDRAM_Init(&hsdram1, &SdramTiming);中的SdramTiming参数是否与您的SDRAM芯片数据表完全一致,特别是时序参数(如LoadToActiveDelay、ExitSelfRefreshDelay等)。

    6. 时钟与电源

    确保SDRAM的时钟线和电源供应稳定,以及所有的地址线、数据线和控制线连接正确无误。

    结论

    • 修正代码格式错误和遗漏的部分,确保编译无误。
    • 核实模式寄存器配置与SDRAM器件规格相符。
    • 完善读写测试逻辑,确保每个步骤都得到正确执行。
    • 仔细检查硬件连接和时序配置。

    请根据上述建议修改代码并重新测试。如果问题依旧,请考虑使用调试器检查初始化后的SDRAM寄存器状态,以及读写操作期间的信号完整性,以进一步定位问题所在。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月6日
  • 创建了问题 7月31日