GD32450I SDRAM读写问题

[复制链接]
962|1
 楼主| pq113_6 发表于 2022-6-19 11:43 | 显示全部楼层 |阅读模式
本帖最后由 pq113_6 于 2022-6-19 11:48 编辑

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

  5.     Printf("SDRAM Test Start:%x\n", sdramPage * 1024);
  6.     for (i = 0; i <  max; i++)
  7.     {
  8.         pbTemp = (uint8_t *)(pbAddr + (uint32_t)sdramPage * 1024 + i);
  9.         *(uint8_t *)pbTemp = (i & 0xff);
  10.     }
  11.     for (i = 0; i <  max; i++)
  12.     {
  13.         pbTemp = (uint8_t *)(pbAddr + (uint32_t)sdramPage * 1024 + i);
  14.         if(*pbTemp != (i & 0xff))
  15.         {
  16.             Printf("SDRAM Test Fail: %x != %x, ", i, *pbTemp);
  17.             Printf("addr = 0x%x\n", pbTemp);
  18.         }
  19.     }

打印出来的结果:
SDRAM Test Fail: 0 != 2, addr = 0xc0000000
SDRAM Test Fail: 1 != 3, addr = 0xc0000001
总是第0,1字节是正确的,第2,3字节错误。
但是换一种写法:
  1.     *pbAddr = 0x00;
  2.     *(pbAddr + 1) = 0x1;
  3.     *(pbAddr + 2) = 0x2;
  4.     *(pbAddr + 3) = 0x3;
  5.     *(pbAddr + 1024) = 0xA5;
  6.     *(pbAddr + 1024 + 1) = 0x5A;
  7.     Printf("[%x] = 0x%x\n", (uint32_t)pbAddr, *pbAddr);
  8.     Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 1), *(pbAddr + 1));
  9.     Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 2), *(pbAddr + 2));
  10.     Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 3), *(pbAddr + 3));
  11.     Printf("[%x] = 0x%x\n", (uint32_t)(pbAddr + 1024), *(pbAddr + 1024));
  12.     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。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

284

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部