GD32450I SDRAM读写问题

[复制链接]
140|1
手机看帖
扫描二维码
随时随地手机跟帖
pq113_6|  楼主 | 2022-6-19 11:43 | 显示全部楼层 |阅读模式
ev, sd
本帖最后由 pq113_6 于 2022-6-19 11:48 编辑

板子是GD32450I_EVAL_Demo,SDRAM初始化已经OK。测试代码:
    uint8_t *pbAddr = (uint8_t *)EXMC_SDRAM_ADDR0;
    uint16_t i;
    uint16_t max = 4;
    uint8_t *pbTemp;

    Printf("SDRAM Test Start:%x\n", sdramPage * 1024);
    for (i = 0; i <  max; i++)
    {
        pbTemp = (uint8_t *)(pbAddr + (uint32_t)sdramPage * 1024 + i);
        *(uint8_t *)pbTemp = (i & 0xff);
    }
    for (i = 0; i <  max; i++)
    {
        pbTemp = (uint8_t *)(pbAddr + (uint32_t)sdramPage * 1024 + i);
        if(*pbTemp != (i & 0xff))
        {
            Printf("SDRAM Test Fail: %x != %x, ", i, *pbTemp);
            Printf("addr = 0x%x\n", pbTemp);
        }
    }

打印出来的结果:
SDRAM Test Fail: 0 != 2, addr = 0xc0000000
SDRAM Test Fail: 1 != 3, addr = 0xc0000001
总是第0,1字节是正确的,第2,3字节错误。
但是换一种写法:
    *pbAddr = 0x00;
    *(pbAddr + 1) = 0x1;
    *(pbAddr + 2) = 0x2;
    *(pbAddr + 3) = 0x3;
    *(pbAddr + 1024) = 0xA5;
    *(pbAddr + 1024 + 1) = 0x5A;
    Printf("[%x] = 0x%x\n", (uint32_t)pbAddr, *pbAddr);
    Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 1), *(pbAddr + 1));
    Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 2), *(pbAddr + 2));
    Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 3), *(pbAddr + 3));
    Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 1024), *(pbAddr + 1024));
    Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 1024 + 1), *(pbAddr + 1024 + 1));
打印结果:
[c0000000] = 0x0
[c0000001] = 0x1
[c0000002] = 0x2
[c0000003] = 0x3
[c0000400] = 0xa5
[c0000401] = 0x5a

结果是对的。



使用特权

评论回复
pq113_6|  楼主 | 2022-6-19 12:53 | 显示全部楼层
自己解决了,SD的时钟配置由2个HCLK改为3个HCLK。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则