STM32F429 FMC SDRAM在列地址时出现> 8位

时间:2017-10-24 10:09:56

标签: stm32f4

当连接64MB IS42S16400J-7BLI时,我遇到了FMC控制器的问题。 我使用CubeMX设置基本配置

static void MX_FMC_Init(void)
{
  FMC_SDRAM_TimingTypeDef SdramTiming;

  /** Perform the SDRAM1 memory initialization sequence
  */
  hsdram1.Instance = FMC_SDRAM_DEVICE;
  /* hsdram1.Init */
  hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_11;
  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
  hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
  hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
  hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
  /* SdramTiming */
  SdramTiming.LoadToActiveDelay = 2;
  SdramTiming.ExitSelfRefreshDelay = 7;
  SdramTiming.SelfRefreshTime = 4;
  SdramTiming.RowCycleDelay = 7;
  SdramTiming.WriteRecoveryTime = 3;
  SdramTiming.RPDelay = 2;
  SdramTiming.RCDDelay = 2;

  if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
  {
    Error_Handler();
  }

}

并配置内存

void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef* hsdram, FMC_SDRAM_CommandTypeDef* Command)
{
    __IO uint32_t tmpmrd = 0;
    /* Step 3:  Configure a clock configuration enable command */
    Command->CommandMode           = FMC_SDRAM_CMD_CLK_ENABLE;
    Command->CommandTarget         = FMC_SDRAM_CMD_TARGET_BANK1;
    Command->AutoRefreshNumber     = 1;
    Command->ModeRegisterDefinition = 0;

    /* Send the command */
    HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

    /* Step 4: Insert 100 ms delay */
    HAL_Delay(100);

    /* Step 5: Configure a PALL (precharge all) command */
    Command->CommandMode           = FMC_SDRAM_CMD_PALL;
    Command->CommandTarget         = FMC_SDRAM_CMD_TARGET_BANK1;
    Command->AutoRefreshNumber     = 1;
    Command->ModeRegisterDefinition = 0;

    /* Send the command */
    HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

    /* Step 6 : Configure a Auto-Refresh command */
    Command->CommandMode           = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
    Command->CommandTarget         = FMC_SDRAM_CMD_TARGET_BANK1;
    Command->AutoRefreshNumber     = 4;
    Command->ModeRegisterDefinition = 0;

    /* Send the command */
    HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

    /* Step 7: Program the external memory mode register */
    tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2          |
             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;

    /* Send the command */
    HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

    /* Step 8: Set the refresh rate counter */
    /* (15.62 us x Freq) - 20 */
    /* Set the device refresh counter */
    HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
}

记忆和微观根据原理图STM32F429 and SDRAM physical connection连接 我只能使用8位寻址。在这种配置中,一切都很完美,即我可以在调试窗口中读/写值并观察它们。它限制了我只有8MB的内存。

当我在8位至9/10 / 11位的设置中修改以获得更多可用内存时,它会开始出现故障,即。某些记忆区域的垃圾。 8bit adressing vs 11bit adressing

我制作了定制电路板,但你会在STM32F429-disco电路板上找到同样的问题。所以我拒绝接触。我试着玩时间延迟,例如" Row to column delay"并尽可能增加所有延迟,但不是运气。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

来自IS42S16400J-7BLI数据表:

  

内部配置为具有同步的四组DRAM   接口。每个16,777,216位的存储区组织为4,096行256   列数为16位。

因此,您应该在ColumnBitsNumber中使用8位。并且你将获得8 MB(64 MBits / 8)的内存。