⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 march_lr.c

📁 ARM入门的好帮手.包含了从简单到相对较复杂的程序.
💻 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 + -