如何通过STM32与HAL检测SDRAM芯片的实际容量
检测MT48LC4M32B2 SDRAM实际容量的方法
一、先明确芯片理论容量
MT48LC4M32B2的型号参数可直接拆解得出理论容量:
- 4M:代表行地址对应的存储单元数(4兆)
- 32B:代表数据位宽为32位
总容量为4M × 32bit = 16MB,对应4,194,304个32位字(换算逻辑:16MB = 16×1024×1024字节 = 4×1024×1024个32位字)。
二、实际检测容量边界的方法
1. 边界扫描检测法
核心逻辑:从SDRAM起始地址开始,逐步扩大读写地址范围,直到出现读写数据不一致,以此确定实际可用的最大地址。可基于你现有代码扩展,优先验证理论最大地址,再通过二分法快速定位边界,避免逐地址扫描的低效。
2. 差异化数据写入验证
为避免FMC地址映射错误导致的地址回绕问题,给每个测试地址写入与地址关联的唯一数据(比如地址值异或固定掩码),读取时若数据不匹配,即可判定该地址超出有效范围。
三、修改后的检测代码示例
#include <stdint.h> #define SDRAM_BANK_ADDR ((uint32_t)0xC0000000) // 替换为你的FMC实际映射地址 #define THEORETICAL_MAX_WORDS ((uint32_t)0x400000) // 4M个32位字的十六进制表示 uint32_t check_sdram_boundary(void) { uint32_t write_data, read_data; uint32_t valid_max_word = 0; // 先验证理论最大地址是否有效 uint32_t test_addr_word = THEORETICAL_MAX_WORDS - 1; write_data = test_addr_word ^ 0xAAAAAAAA; // 生成地址关联的唯一数据 *(__IO uint32_t*)(SDRAM_BANK_ADDR + test_addr_word * 4) = write_data; read_data = *(__IO uint32_t*)(SDRAM_BANK_ADDR + test_addr_word * 4); if (read_data == write_data) { valid_max_word = THEORETICAL_MAX_WORDS; } else { // 二分法快速定位实际边界 uint32_t low = 0, high = THEORETICAL_MAX_WORDS; while (low < high) { uint32_t mid = (low + high) / 2; write_data = mid ^ 0x55555555; *(__IO uint32_t*)(SDRAM_BANK_ADDR + mid * 4) = write_data; read_data = *(__IO uint32_t*)(SDRAM_BANK_ADDR + mid * 4); if (read_data == write_data) { low = mid + 1; valid_max_word = mid + 1; } else { high = mid; } } } // 抽样验证连续地址的一致性,排除局部异常 for (uint32_t i = 0; i < valid_max_word; i += 0x1000) { write_data = i ^ 0x33333333; *(__IO uint32_t*)(SDRAM_BANK_ADDR + i * 4) = write_data; read_data = *(__IO uint32_t*)(SDRAM_BANK_ADDR + i * 4); if (read_data != write_data) { valid_max_word = i; break; } } return valid_max_word; } // 主函数调用示例 int main(void) { // 此处保留你的FMC和SDRAM初始化代码 uint32_t sdram_valid_words = check_sdram_boundary(); uint32_t sdram_valid_size_mb = sdram_valid_words * 4 / (1024 * 1024); // 可通过串口打印结果,例如: // printf("SDRAM有效32位字数量:%lu\n", sdram_valid_words); // printf("SDRAM有效容量:%lu MB\n", sdram_valid_size_mb); while(1); }
四、关键注意事项
- 确保FMC时序配置正确:CAS延迟、预充电时间等参数需严格匹配MT48LC4M32B2 datasheet,时序错误会导致读写不稳定,误判容量边界。
- 测试时屏蔽干扰:暂停DMA、中断等可能占用SDRAM的操作,避免影响读写验证的准确性。
- 重复验证:多次运行检测程序,排除单次测试的偶然性,确保结果可靠。
内容的提问来源于stack exchange,提问作者bibo
相关产品推荐
相关产品推荐

