如何使用STM32和HAL检查SDRAM的大小

问题描述 投票:0回答:1

我已经能够将 SDRAM IC MT48LC4M32B2 连接到 STM32F767 Nucleo bord 并配置 FMC 以读写 SDRAM。我想检查我的 SDRAM 芯片的实际容量。但无法计算 32 位字中有多少可以存储在 I2C 中。以及如何检测可用空间的尽头? 这是我的写作和阅读代码:

#define BUFFER_SIZE         ((uint32_t)0x1000)
#define WRITE_READ_ADDR     ((uint32_t)0x800)

Fill_Buffer(aTxBuffer, BUFFER_SIZE, 0x55555555);
  /* Write data to the SDRAM memory */
    for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
    {
      *(__IO uint32_t*) (SDRAM_BANK_ADDR + WRITE_READ_ADDR + 4*uwIndex) = aTxBuffer[uwIndex];
    }

    /* Read back data from the SDRAM memory */
    for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
    {
      aRxBuffer[uwIndex] = *(__IO uint32_t*) (SDRAM_BANK_ADDR + WRITE_READ_ADDR + 4*uwIndex);
     }
    /*##-3- Checking data integrity ############################################*/

      for (uwIndex = 0; (uwIndex < BUFFER_SIZE); uwIndex++)
      {
        if (aRxBuffer[uwIndex] != aTxBuffer[uwIndex])
        {
            uwWriteReadStatus++; //error counter
            badByte[uwIndex] = 1;
        }
      }

static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLenght, uint32_t uwOffset)
{
  uint32_t tmpIndex = 0;

  /* Put in global buffer different values */
  for (tmpIndex = 0; tmpIndex < uwBufferLenght; tmpIndex++ )
  {
    pBuffer[tmpIndex] = uwOffset;
    uwOffset = ~uwOffset;
  }
}
stm32 hal
1个回答
0
投票

一种典型的方法依赖于这样一个事实,即存储在超过内存大小的值将与存储在地址

0x0
的值相同。这是因为地址的高位没有被解码,所以你在那个地址得到了你的 SDRAM 的“另一个”副本。

你可以在地址

0x0
存储一个“不寻常”的值,然后循环重复两次猜测内存大小,直到找到重复的值。

一些完全未经测试的代码,希望能够展示这个想法:

#define MAGIC_VAL (0xdeadbeef)

uint32_t check_sdram_size(void)
{
    uint32_t *zero = (uint32_t *) (SDRAM_BANK_ADDR);

    *zero = MAGIC_VAL;

    uint32_t test_size;

    for (test_size = 1024u ; ; test_size *= 2u)
    {
        uint32_t *check = (uint32_t *) (SDRAM_BANK_ADDR + test_size);

        if (*check == MAGIC_VAL)
            break;
    }

    return test_size;
}

首先猜测内存只有1024字节。如果你知道它肯定会比那个大,你可以输入一个更合理的起始猜测。

这仅在您的 MCU 实际尝试对超过 SDRAM 大小的地址执行事务时才有效。据推测,您已经为 MCU 中的 SDRAM 配置了某种最大尺寸,因此如果达到该尺寸,您会想要停止循环,并假设您有一个最大尺寸的 SDRAM。

© www.soinside.com 2019 - 2024. All rights reserved.