首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列增大>8位时STM32F429 FMC问题

列增大>8位时STM32F429 FMC问题
EN

Stack Overflow用户
提问于 2017-10-24 10:09:55
回答 1查看 2.1K关注 0票数 0

当连接64 FMC IS42S16400J-7BLI时,我与FMC控制器有问题。我正在使用CubeMX设置基本配置

代码语言:javascript
复制
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();
  }

}

并配置内存

代码语言:javascript
复制
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);
}

存储器和微电路按照原理图连接。

我只能用8位寻址。在这种配置中,一切都是完美的,即我可以在调试窗口中读取/写入值并观察它们。不过,它限制了我的内存容量只有8MB。

当我在9/10/11位以下的设置中修改8位以获得更多可用内存时,它就会启动故障,即某些内存区域中的垃圾。

我做了定制板,但同样的问题,你会发现在STM32F429-迪斯科板。所以我拒绝这种联系。我试着玩“从行到列的延迟”这样的时间延迟,并增加所有可能的延迟,但不是运气。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-01-20 09:12:01

来自IS42S16400J-7BLI数据表:

内部配置为具有同步接口的四行DRAM。每个16,777,216位银行被组织为4,096行,由256列和16位组成.

因此,您应该在ColumnBitsNumber中使用8位。您将得到8兆字节(64 MBits/8)的内存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46907765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档