DDR信息:

从链接文件中,可以看到DDR的起始地址和大小。

编写代码进行测试:
#include <stdio.h>
#include <stdint.h>
#include "xil_printf.h"
/**
* @brief DDR读写测试函数
* @param start_addr 测试起始地址(建议传入 0x100000)
* @param test_len 测试总字节数,注意不要超出ps7_ddr_0范围
* @param block_size 单次读写块大小,建议4/8/32,4=按u32测试
* @return 0:全部通过,非0:错误数量
*/
uint32_t ddr_test(uint32_t start_addr, uint32_t test_len, uint32_t block_size)
{
uint32_t err_cnt = 0;
uint32_t *p32 = (uint32_t *)start_addr;
uint32_t test_words = test_len / sizeof(uint32_t);
xil_printf("===== DDR Test Start =====\r\n");
xil_printf("Start Addr: 0x%08X, Words: %d\r\n", start_addr, test_words);
// 1. 写入测试pattern:递增数字 0,1,2,3...
for(uint32_t i = 0; i < test_words; i++)
{
p32[i] = i;
}
// 2. 回读校验
for(uint32_t i = 0; i < test_words; i++)
{
uint32_t exp = i;
uint32_t got = p32[i];
if(got != exp)
{
err_cnt ++;
xil_printf("ERR @0x%08X : Exp=0x%08X, Got=0x%08X\r\n",
(uint32_t)&p32[i], exp, got);
// 出错太多可以注释下面break,一次性跑完所有
// if(err_cnt > 10) break;
}
}
// 3. 再测反码pattern 0xFFFFFFFF - i,抓数据线粘连
xil_printf("Run invert pattern test...\r\n");
for(uint32_t i = 0; i < test_words; i++)
{
p32[i] = ~i;
}
for(uint32_t i = 0; i < test_words; i++)
{
uint32_t exp = ~i;
uint32_t got = p32[i];
if(got != exp)
{
err_cnt ++;
xil_printf("ERR @0x%08X : Exp=0x%08X, Got=0x%08X\r\n",
(uint32_t)&p32[i], exp, got);
}
}
xil_printf("===== DDR Test End, Error Count: %d =====\r\n", err_cnt);
return err_cnt;
}
int main(void)
{
uint32_t err;
// 从ld里ps7_ddr_0起点0x100000开始,测试16MB(0x1000000字节)
err = ddr_test(0x100000, 0x1000000, 4);
if(err == 0)
{
xil_printf("DDR TEST OK!\r\n");
}
while(1);
return 0;
}
实测,发现,如果从0x100000开始测试,容易卡死。
修改从0x200000开始测试,现象:
串口打印:

debug中查看:
