野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11101|回复: 1

STM32 外部SDRAM 数据丢失

[复制链接]
发表于 2019-8-19 09:41:47 | 显示全部楼层 |阅读模式
测试方法:利用下面的写入函数uint8_t SDRAM_Test_Write(void)将数据写入外部SDRAM,并在while循环里不断调用读取函数uint8_t SDRAM_Test_Read(void)读取并判断数据的正确性;
问题现象:写入后,每间隔1S读取一次,数据一直都是正确的,每间隔10S读取一次则数据不完全正确,部分错误了;

/**
  * @brief  test SDRAM
  * @param  None
  * @retval sucess ret : 0, error ret : -1
  */
uint8_t SDRAM_Test_Write(void)
{
    uint32_t counter=0;
    uint8_t ubWritedata_8b = 0;
    /* set SDRAM area to 0 */
    for (counter = 0x00; counter < IS42S16400J_SIZE; counter++)
    {
        *(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)0x0;
    }
    /* write 8 bit date to full sdram */
    for (counter = 0; counter < IS42S16400J_SIZE; counter++)
    {
        *(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)(ubWritedata_8b + counter);
    }
    return 0;
}
/**
  * @brief  test SDRAM
  * @param  None
  * @retval sucess ret : 0, error ret : -1
  */
uint8_t SDRAM_Test_Read(void)
{
    int ret = 0;
    uint32_t counter=0;
    uint8_t ubWritedata_8b = 0, ubReaddata_8b = 0;
    /* read SDRAM and check date*/
    for(counter = 0; counter < IS42S16400J_SIZE; counter++ )
    {
        ubReaddata_8b = *(__IO uint8_t*)(SDRAM_BANK_ADDR + counter);
        if(ubReaddata_8b != (uint8_t)(ubWritedata_8b + counter))
        {
            error("8 bit test error\r\n");
            ret = -1;
            break;
        }
    }
    if(ret == 0)
    {
        messa("SDRAM read and check successfully\r\n");
    }
    return ret;
}



回复

使用道具 举报

 楼主| 发表于 2019-8-19 09:45:18 | 显示全部楼层
FMC配置:
C:\Users\86131\Desktop


void SDRAM_Init(void)
{
    uint32_t tmpr = 0;
    FMC_SDRAM_CommandTypeDef FMC_SDRAMCommandStructure;

    FMC_SDRAMCommandStructure.CommandMode            = FMC_SDRAM_CMD_CLK_ENABLE;
    FMC_SDRAMCommandStructure.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK2;
    FMC_SDRAMCommandStructure.AutoRefreshNumber      = 0;
    FMC_SDRAMCommandStructure.ModeRegisterDefinition = 0;

    while(HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_READY && \
          HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_PRECHARGED);

    HAL_SDRAM_SendCommand(&hsdram1, &FMC_SDRAMCommandStructure, 1000);

    HAL_Delay(10);

    FMC_SDRAMCommandStructure.CommandMode            = FMC_SDRAM_CMD_PALL;
    FMC_SDRAMCommandStructure.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK2;
    FMC_SDRAMCommandStructure.AutoRefreshNumber      = 0;
    FMC_SDRAMCommandStructure.ModeRegisterDefinition = 0;
   
    while(HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_READY && \
          HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_PRECHARGED);

    HAL_SDRAM_SendCommand(&hsdram1, &FMC_SDRAMCommandStructure, 1000);

    FMC_SDRAMCommandStructure.CommandMode            = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
    FMC_SDRAMCommandStructure.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK2;
    FMC_SDRAMCommandStructure.AutoRefreshNumber      = 16;
    FMC_SDRAMCommandStructure.ModeRegisterDefinition = 0;

    while(HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_READY && \
          HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_PRECHARGED);

    HAL_SDRAM_SendCommand(&hsdram1, &FMC_SDRAMCommandStructure, 1000);

    /* sdram register configuration */
    tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_4        |
                   SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                   SDRAM_MODEREG_CAS_LATENCY_2           |
                   SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                   SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

    FMC_SDRAMCommandStructure.CommandMode            = FMC_SDRAM_CMD_LOAD_MODE;
    FMC_SDRAMCommandStructure.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK2;
    FMC_SDRAMCommandStructure.AutoRefreshNumber      = 1;
    FMC_SDRAMCommandStructure.ModeRegisterDefinition = tmpr;

    while(HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_READY && \
          HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_PRECHARGED);

    HAL_SDRAM_SendCommand(&hsdram1, &FMC_SDRAMCommandStructure, 1000);

    /* set refresh conuter */
    /*refresh rate = (COUNT + 1) x SDRAM clock frequency
        COUNT =( SDRAM refresh cycle/lines) - 20*/
    /* 64ms/4096=15.62us  (15.62 us x FSDCLK) - 20 =1386 */
    HAL_SDRAM_SetAutoRefreshNumber(&hsdram1, 1386);

    while(HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_READY && \
          HAL_SDRAM_GetState(&hsdram1) != HAL_SDRAM_STATE_PRECHARGED);
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-5 08:53 , Processed in 0.056217 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表