weixin_46456501 2025-02-18 20:43 采纳率: 0%
浏览 60

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

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

img

img

img

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2025-02-18 21:48
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析:
    1. 首先,需要确保SDRAM的的时序参数设置正确,包括读写时序、时钟频率等,否则无法正确读写SDRAM。
    2. 其次,需要检查FMC控制器的配置,确保FMC控制器已经正确配置,与SDRAM兼容。
    3. 检查SDRAM初始化代码,确保初始化代码正确设置SDRAM的各项参数。
    4. 最后,测试程序时需要确保正确读写SDRAM地址范围内的数据。 解决方案:
    5. 确保SDRAM的时序参数设置正确,参考SDRAM的datasheet文档,设置正确的读写时序、时钟频率等参数。
    6. 检查FMC控制器的配置,确保FMC控制器与SDRAM的兼容性,参考STM32H743 Reference Manual的相关章节,确认FMC配置正确。
    7. 编写SDRAM初始化代码,确保正确设置SDRAM的参数,例如初始化时序、模式寄存器值等。可以参考相关资料或样例代码进行编写。
    8. 编写一个简单的测试程序,读取和写入SDRAM地址范围内的数据,例如写入一个固定值,然后读取并检查是否一致。 示例代码如下(仅作参考):
    #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的测试程序,检查是否能够正确读写。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月18日