我已经能够将SDRAM IC MT48LC4M32B2连接到STM32F767 Nucleo板并配置FMC读取和写入SDRAM。我想检查一下我的SDRAM芯片的实际容量。但是无法计算出这些32位字有多少可以存储在IC中,并且如何检测可用空间的末端?下面是我写和读的代码:
#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;
}
}
一个典型的方法依赖于这样一个事实,即存储在内存大小超过1的值将与存储在地址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。