📄 march_lr.c
字号:
//*----------------------------------------------------------------------------
//* ATMEL Microcontroller Software Support - ROUSSET -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name : march_lr.c
//* Object : Standard "March LR 14n" Algorithm for
//* SRAM Testing
//*
//* Version | mm | dd | yy | author :
//* 1.0 10 24 01 PFi : Creation
//* 1.1 10 26 01 PFi : Add "error++" in each checking loop
//*----------------------------------------------------------------------------
/*****************************************************************************
* Name: Standard "March LR 14n" Algorithm
*
* Description: The standard "March LR 14n" Algorithm performs
* different write and read sequences :
* - w0 from begining to the end of SRAM
* - r0_w1 from end to the begining of SRAM
* - r1_w0_r0_w1 from begining to the end of SRAM
* - r1_w0 from begining to the end of SRAM
* - r0_w1_r1_w0 from begining to the end of SRAM
* - r0 from begining to the end of SRAM
*
* w0 = write pattern_0
* r0 = read pattern_0
*
* w1 = write pattern_0
* r1 = read pattern_0
*
* pattern_0 can be any pattern. pattern_1 must be
* the pattern_0 inverted.
*
* patterns used by Atmel:
* - pattern_0 = 0x00000000
* - pattern_1 = 0xFFFFFFFF
*
* Faut Coverage : The March LR Test can detects Addressing faults,
* sticking faults and coupling faults.
*
****************************************************************************/
/* Include Files */
#include "stdio.h"
#define SRAM_BASE 0x00100000
#define SRAM_SIZE 0x00020000
#define SRAM_END (SRAM_BASE + SRAM_SIZE)
#define SF_MMR (u_int *)0xFFF0000C /* Special Function Register to enable writing in internal memory */
#define RAMWU 0x00000001 /* RAMWU Bit */
/*----------------*/
/* Standard types */
/*----------------*/
typedef unsigned int u_int ;
typedef unsigned short u_short ;
typedef unsigned char u_char ;
//*----------------------------------------------------------------------------
//* Function Name : main
//* Object : Main function
//* Input Parameters : none
//* Output Parameters : Addresses and Data if error
//* Functions called : none
//*----------------------------------------------------------------------------
int main ( void )
{
volatile u_int *pt_sfr = SF_MMR;
volatile u_int *addr ;
volatile u_int *sram_base = (u_int*)SRAM_BASE ;
volatile u_int *sram_end = (u_int*)(SRAM_BASE + SRAM_SIZE) ;
volatile u_int pattern_0 = ((u_int)0x00000000) ;
volatile u_int pattern_1 = ((u_int)0xFFFFFFFF) ;
volatile u_int error = 0 ;
/* first enable ram writing in SF tregister */
*pt_sfr = RAMWU;
printf("Standard March LR 14n Algorithm\n\n");
printf("First pass with the following patterns:\n") ;
printf("- w0 = 0x00000000\n");
printf("- w1 = 0xFFFFFFFF\n");
// ---
// w0
// ---
printf("\nw0 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
*addr = pattern_0 ;
}
// ------
// r0_w1
// ------
printf("\nr0_w1 sequence: \n\n");
for ( addr = (sram_end - 1); addr > (sram_base - 1); addr--)
{
//r0
if (*addr != pattern_0)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_0, *addr);
error++ ;
}
//w1
*addr = pattern_1 ;
}
if (error == 0 )
printf("Sequence <r0_w1> Pass\n") ;
error = 0 ;
// ------------
// r1_w0_r0_w1
// ------------
printf("\nr1_w0_r0_w1 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
//r1
if (*addr != pattern_1)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_1, *addr);
error++ ;
}
//w0
*addr = pattern_0 ;
//r0
if (*addr != pattern_0)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_0, *addr);
error++ ;
}
//w1
*addr = pattern_1 ;
}
if (error == 0 )
printf("Sequence <r1_w0_r0_w1> Pass\n") ;
error = 0 ;
// ------
// r1_w0
// ------
printf("\nr1_w0 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
//r1
if (*addr != pattern_1)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_1, *addr);
error++ ;
}
//w0
*addr = pattern_0 ;
}
if (error == 0 )
printf("Sequence <r1_w0> Pass\n") ;
error = 0 ;
// ------------
// r0_w1_r1_w0
// ------------
printf("\nr0_w1_r1_w0 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
//r0
if (*addr != pattern_0)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_0, *addr);
error++ ;
}
//w1
*addr = pattern_1 ;
//r1
if (*addr != pattern_1)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_1, *addr);
error++ ;
}
//w0
*addr = pattern_0 ;
}
if (error == 0 )
printf("Sequence <r0_w1_r1_w0> Pass\n") ;
error = 0 ;
// ---
// r0
// ---
printf("\nr0 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
//r0
if (*addr != pattern_0)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_0, *addr);
error++ ;
}
}
if (error == 0 )
printf("Sequence <r0> Pass\n") ;
error = 0 ;
/* ---------------------------------------------- */
/* Second pass with other pattern and antipattern */
/* ---------------------------------------------- */
pattern_0 = ((u_int)0x55555555) ;
pattern_1 = ((u_int)0xAAAAAAAA) ;
printf("\nSecond pass with the following pattern:\n") ;
printf("- w0 = 0x55555555\n");
printf("- w1 = 0xAAAAAAAA\n");
// ---
// w0
// ---
printf("\nw0 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
*addr = pattern_0 ;
}
// ------
// r0_w1
// ------
printf("\nr0_w1 sequence: \n\n");
for ( addr = (sram_end - 1); addr > (sram_base - 1); addr--)
{
//r0
if (*addr != pattern_0)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_0, *addr);
error++ ;
}
//w1
*addr = pattern_1 ;
}
if (error == 0 )
printf("Sequence <r0_w1> Pass\n") ;
error = 0 ;
// ------------
// r1_w0_r0_w1
// ------------
printf("\nr1_w0_r0_w1 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
//r1
if (*addr != pattern_1)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_1, *addr);
error++ ;
}
//w0
*addr = pattern_0 ;
//r0
if (*addr != pattern_0)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_0, *addr);
error++ ;
}
//w1
*addr = pattern_1 ;
}
if (error == 0 )
printf("Sequence <r1_w0_r0_w1> Pass\n") ;
error = 0 ;
// ------
// r1_w0
// ------
printf("\nr1_w0 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
//r1
if (*addr != pattern_1)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_1, *addr);
error++ ;
}
//w0
*addr = pattern_0 ;
}
if (error == 0 )
printf("Sequence <r1_w0> Pass\n") ;
error = 0 ;
// ------------
// r0_w1_r1_w0
// ------------
printf("\nr0_w1_r1_w0 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
//r0
if (*addr != pattern_0)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_0, *addr);
error++ ;
}
//w1
*addr = pattern_1 ;
//r1
if (*addr != pattern_1)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_1, *addr);
error++ ;
}
//w0
*addr = pattern_0 ;
}
if (error == 0 )
printf("Sequence <r0_w1_r1_w0> Pass\n") ;
error = 0 ;
// ---
// r0
// ---
printf("\nr0 sequence: \n\n");
for ( addr = sram_base; addr < sram_end; addr++)
{
//r0
if (*addr != pattern_0)
{
printf("Error @ address : 0x%08x / Data Write = 0x%08x / Data Read = 0x%08x \n", (int)addr, pattern_0, *addr);
error++ ;
}
}
if (error == 0 )
printf("Sequence <r0> Pass\n") ;
error = 0 ;
printf("\n\nTest Terminated\n") ;
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -