You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:23:12