3586|0

854

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

测试内存稳定性代码分享 [复制链接]


這種東西當然是要加在C:\WINCE600\PLATFORM\SMDKV210\SRC\BOOTLOADER\STEPLDR\main.c裡面
不然是要怎嚜測試整各DRAM
void main(void)
{
Port_Init();

Led_Display_Off(1); //RED
Led_Display_Off(2); //BLUE
Led_Display_On(3);  //GREEN  

if(!DRAM_Test())
{
    Led_Display_On(1); //RED   
    RAM_Error();
}
}
BOOL DRAM_Test(void);
unsigned long* DRAM_DeviceTest(unsigned long *BaseAddr, unsigned long nBytes);
unsigned long* DRAM_AddrBusTest(unsigned long *BaseAddr, unsigned long nBytes);
unsigned long  DRAM_DataBusTest(unsigned long *Addr);       

//*----------------------------------------------------------------------------
//* \fn    DRAM_DataBusTest
//* \brief Test the DRAM Data Bus
//* return succeed return 0 / fail return Data Value
//*----------------------------------------------------------------------------
unsigned long DRAM_DataBusTest(unsigned long *Addr)
{
unsigned long pattern;


for(pattern = 1; pattern != 0; pattern <<= 1)
{
*Addr = pattern;

Addr[1] = ~pattern;

if(*Addr != pattern)
return pattern;
}

return 0;
}
//*----------------------------------------------------------------------------
//* \fn    DRAM_AddrBusTest
//* \brief Test the DRAM Address Bus
//* return succeed return 0 / Fail return Error Address
//* 測試區塊盡可能為2的次方
//*----------------------------------------------------------------------------
unsigned  long* DRAM_AddrBusTest(unsigned long *BaseAddr, unsigned long nBytes)
{
unsigned long offset,testOffset;
unsigned long pattern = 0xAAAAAAAA;
unsigned long antipattern = 0x55555555;
unsigned long addressMask = (nBytes - 1)>>2; /*設定用來當成停止狀況,一次測試4個Bytes*/

for(offset = 4;(offset & addressMask) != 0; offset <<= 1)
{
BaseAddr[offset] = pattern;
}

/*檢查是否有其他位址線也出現1的訊號*/
BaseAddr[0] = antipattern;
for(offset = 4;(offset & addressMask) != 0; offset <<= 1)
{
if(BaseAddr[offset] != pattern)
return (unsigned long*) &BaseAddr[offset];
}       
BaseAddr[0] = pattern;


/*檢查是否有短路或誤接到低電位的位址線*/
for(testOffset = 4;(testOffset & addressMask) != 0; testOffset <<= 1)
{
BaseAddr[testOffset] = antipattern;

for(offset = 4;(offset & addressMask) != 0; offset <<= 1)
{
if(BaseAddr[offset] != pattern && (offset != testOffset))
return (unsigned long*) &BaseAddr[testOffset];
}

BaseAddr[testOffset] = pattern;       
}       

return 0;
}
//*----------------------------------------------------------------------------
//* \fn    DRAM_DeviceTest
//* \brief Test the DRAM
//*----------------------------------------------------------------------------

unsigned long* DRAM_DeviceTest(unsigned long *BaseAddr, unsigned long nBytes)
{
unsigned long offset;
unsigned long nDWords = nBytes/4;
unsigned long pattern=0xAAAAAAAA;
unsigned long antipattern=0x55555555;
/*       
//將整個記憶體填入已知的資料數值
for(offset = 0;offset < nDWords; offset++)
{
BaseAddr[offset] = pattern;
if(offset % 0x100000 == 0)
DebugString(".");       
}

//確認每個位址上的資料,並將他反向,作第二回合測試
for(offset = 0;offset < nDWords;offset++)
{
if(BaseAddr[offset] != pattern)
{
return (unsigned long*)&BaseAddr[offset];
}
BaseAddr[offset] = antipattern;       
if(offset % 0x100000 == 0)
DebugString(".");       
}

//確認每個位址上的資料是否被反向,然後歸0
for(pattern = 1,offset = 0;offset < nDWords; pattern++,offset++)
{
if(BaseAddr[offset] != antipattern)
{       
return (unsigned long*)&BaseAddr[offset];
}
BaseAddr[offset] = 0;
if(offset % 0x100000 == 0)
DebugString(".");       
}

DebugString("\n");
*/       

    //確認Data Bus ok
BaseAddr[0] = pattern;
    if(BaseAddr[0] != pattern)
{
return (unsigned long*)&BaseAddr[0];
}
BaseAddr[0] = antipattern;       
    if(BaseAddr[0] != antipattern)
{
return (unsigned long*)&BaseAddr[0];
}
/*
//確認Address Bus ok
for(offset = 0;offset < nDWords;) //offset++
{
    BaseAddr[offset] = pattern;
    offset++;
    BaseAddr[offset] = antipattern;
   
if(BaseAddr[offset] != antipattern || BaseAddr[offset-1] != pattern)
{
return (unsigned long*)&BaseAddr[offset];
}                        
    offset++;
}
*/
return 0;
}

//*----------------------------------------------------------------------------
//* \fn    DRAM_Test
//* \brief Test All the DRAM: Data/Address/Every Bit
//*----------------------------------------------------------------------------

BOOL DRAM_Test(void)
{
unsigned long Value;
unsigned long *pValue;

unsigned long DRAM0_BASE = 0x20000000;       
unsigned long DRAM0_SIZE =  0x8000000; //128M

unsigned long DRAM1_BASE = 0x40000000;       
unsigned long DRAM1_SIZE =  0x8000000; //128M

//////////////////////////////////////////////////////////////////////////////

Value = DRAM_DataBusTest((unsigned long *)DRAM1_BASE);
if(Value != 0)
{
//DebugString("DRAM1 Data Bus Error\n");
return FALSE;
}

pValue = DRAM_AddrBusTest((unsigned long *)DRAM1_BASE,DRAM1_SIZE);
if(pValue != 0)
{
//DebugString("DRAM1 Address Bus Error\n");       
return FALSE;
}

pValue = DRAM_DeviceTest((unsigned long *)DRAM1_BASE,DRAM1_SIZE);
if(pValue != 0)
{
//DebugString("DRAM1 Device Error\n");
return FALSE;
}

//////////////////////////////////////////////////////////////////////////////

Value = DRAM_DataBusTest((unsigned long *)DRAM0_BASE);
if(Value != 0)
{
//DebugString("DRAM0 Data Bus Error\n");
return FALSE;
}

pValue = DRAM_AddrBusTest((unsigned long *)DRAM0_BASE,DRAM0_SIZE);
if(pValue != 0)
{
//DebugString("DRAM0 Address Bus Error\n");       
return FALSE;
}

pValue = DRAM_DeviceTest((unsigned long *)DRAM0_BASE,DRAM0_SIZE);
if(pValue != 0)
{
//DebugString("DRAM0 Device Error\n");
return FALSE;
}

//////////////////////////////////////////////////////////////////////////////

  return TRUE;       
}



点赞 关注
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表