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

📄 main.c

📁 周立功s3c2410实验板的源代码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: main.c
** Last modified Date: 2005-12-06
** Last Version: v1.0
** Description: DeviceARM2410测试SDRAM
**              要求使用NOR Flash启动方式 (不能引导Linux,因为如果打开MMU,测试会有问题)
** Note: 请短接实验箱上的JP1跳线,断开JP8跳线,使用串口延长线把实验箱的CZ11与PC机的COM1口相连。
**       PC机端使用"超级终端"接收数据,设置波持率为115200,8位数据位,1位停止位,无奇偶校验位。
**------------------------------------------------------------------------------------------------------
** Created By: 黄绍斌
** Created date: 2005-12-06
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#include  "config.h"


#define  TEST_ALL_SDRAM		1		    /* 是否使用SDRAM完全测试程序(为1时使用) */


// SDRAM错误指示变量
#if TEST_ALL_SDRAM==0
uint32   g_data_bus_err = 0;
uint32   g_addr_bus_err = 0;
#else
uint32   g_sdram_err  = 0;
uint32   g_sdram_addr = 0;
uint8    g_test_data  = 0;
uint8    g_read_data  = 0;
#endif

// 定义SDRAM错误字
#define  WRITE_ZERO		60
#define  WRITE_DATA		68


// 运行LED灯控制字定义
#define   LED_RUN			(1<<21)     /* GPA21,低电平时点亮 */
#define   LED_RUN_MASK		(~LED_RUN)

// 蜂鸣器控制
#define   BEEP				(1<<10)	    /* GPH10,低电平时蜂鸣 */
#define   BEEP_MASK			(~BEEP)


// SDRAM的地址(32位宽度)
#define	  SRAM_ADDR 	((volatile unsigned int *) 0x30000000)



/*********************************************************************************************************
** Function name: DelayNS
** Descriptions: 长软件延时。
**              延时时间与系统时钟有关。
** Input: no	延时参数,值越大,延时越久
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-06 
**-------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  DelayNS(uint32  no)
{  
	uint32  i;

   	for(; no>0; no--) 
       for(i=0; i<50000; i++);
}



/*********************************************************************************************************
** Function name: RunBeep
** Descriptions: 控制蜂鸣器Be一声音。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-06 
**-------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  RunBeep(void)
{  
    rGPHDAT = rGPHDAT & BEEP_MASK;	    // BEEP = 0
    DelayNS(8);
    rGPHDAT = rGPHDAT | BEEP;		    // BEEP = 1 
    DelayNS(8);
}



/*********************************************************************************************************
** Function name: TestErr
** Descriptions: 出错报警(蜂鸣器响三声)。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-06 
**-------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  TestErr(void)
{   
    int  i;

    for(i=0; i<3; i++)
    {   
        rGPHDAT = rGPHDAT & BEEP_MASK;	    // BEEP = 0
        DelayNS(6);
        rGPHDAT = rGPHDAT | BEEP;		    // BEEP = 1 
        DelayNS(4);
    }
}



/*********************************************************************************************************
** Function name: ErrorShow
** Descriptions: 出错报警(RUN灯快闪)。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-06 
**-------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  ErrorShow(void)
{	
    while(1)
	{
		rGPADAT = rGPADAT | LED_RUN;
		DelayNS(2);
		rGPADAT = rGPADAT & LED_RUN_MASK;
		DelayNS(2);
	}
}


#if TEST_ALL_SDRAM==0

/*********************************************************************************************************
** Function name: TestDataBus
** Descriptions: 对SDRAM的0地址进行数据读/写操作,以判断数据总线上的错误。
**           0地址的好处是,即使地址总线有短接错误,都能够正确读/写操作。
** Input: 无
** Output: 返回0表示测试错误,否则表示测试通过
** Created by: 黄绍斌
** Created Date: 2005-12-06 
**-------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32  TestDataBus(void)
{	
    uint32  wr_data;
	uint32  rd_data;
	uint32  i;
	
	// 对16位数据总线进行测试
	UART_SendStr("\n Data bus test\n"); 
	wr_data = 1; 
	for(i=0; i<32; i++)
	{	
	    SRAM_ADDR[0x00] = wr_data;	// 写数
		rd_data = SRAM_ADDR[0x00];	// 读数据
		
		if(rd_data != wr_data)		// 判断读/写是否正确
		{	
		    UART_SendStr("\n Data bus is err!\n");
		    g_data_bus_err = i | 0xFF000000;	// 错误报警设置
			return(0);		
		}// end of if(rd_data != wr_data)...
		
		wr_data = wr_data<<1;		// 测试下一条数据线
	}
	
	UART_SendStr("\n Data bus is OK!\n");
    return(1);
}



/*********************************************************************************************************
** Function name: TestAddrBus
** Descriptions: 对SDRAM的0、1、2、4...地址进行数据读/写操作,以判断地址总线上的错误。
**           数据选用0x55AA。如果数据线没有测试通过,此函数测试也不会通过。
** Input: 无
** Output: 返回0表示测试错误,否则表示测试通过
** Created by: 黄绍斌
** Created Date: 2005-12-06 
**-------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32  TestAddrBus(void)
{	
    uint32  rd_data;
	uint32  addr;
	uint32  i;		
	
	// 先一次性写入数据
	UART_SendStr("\n Addr bus test\n"); 
	addr = 1;
	for(i=1; i<25; i++)
	{	
	    SRAM_ADDR[addr] = 0x5A000000 | i;	// 写入0x5A00000x,其中x表示Ax地址线
		addr = addr << 1;					// 下一地址线	
	}	
	SRAM_ADDR[0] = 0x5A000000;				// 因为若是某个地址线短接到GND,或2根地址线间短路,其操作地址都将为0 (此时0x02/0x0
	                                    	// 4/0x08...等地址即是0地址),所以对0地址操作,将可以判断是否有短接。
	                                    	// 对于短接到电源的地址线,也会检测出来,因为此时0地址即是0x02/0x04/0x08...等地址。
	                                    	
	// 读出校验,判断地址线是否正确 
	addr = 1;
	for(i=1; i<25; i++)
	{	
	    rd_data = SRAM_ADDR[addr];			// 读数据
		
		if(rd_data != (0x5A000000 | i))		// 判断读/写是否正确
		{	
		    UART_SendStr("\n Addr bus is err!\n");
		    g_addr_bus_err = i | 0xFF000000;	// 错误报警设置
			return(0);			
		}// end of if(rd_data != (0x5A000000 | i))...			
		addr = addr << 1;				// 下一地址线	
	}
	
	UART_SendStr("\n Addr bus is OK!\n");
	return(1);
}


#else


/*
const uint8  WriteData[] = 
{   
    0x01, 0x02, 0x04, 0x08, 
    0x10, 0x20, 0x40, 0x80, 
    0x55, 0xaa, 0xff, 0x00
};  
*/
const uint8  WriteData[] = 
{   
    0x55, 0xaa, 0xff, 0x00
};

/*********************************************************************************************************
** Function name: TestAllSDRAM
** Descriptions: 对SDRAM的0、1、2、4...字节地址进行数据读/写操作,以判断存储器的错误。
**           会对LnWBE0--LnWBE3进行测试。
** Input: 无
** Output: 返回0表示测试错误,否则表示测试通过
** Created by: 黄绍斌
** Created Date: 2005-12-06 
**-------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/                                                                             
uint32  TestAllSDRAM(void)
{	
    volatile uint8  *cp;	
	uint32  i;
	uint32  j;
	uint32  temp;
	
	// 显示测试信息
	UART_SendStr("\n HY57V651620 test\n");    
   	   	
   	// SDRAM填充0,使用32位宽度
   	UART_SendStr(" Step1 -- write 0\n");
    for(i = 0; i<(64*1024*1024/4); i++)
    {  	
        SRAM_ADDR[i] = 0x00000000; 
        if((i & 0x0000ffff) == 0)
        {
            UART_SendStr(".");            
        }       
    }    
    
    // 对每一个单元进行测试,使用8位宽度    
    UART_SendStr("\n Step2 -- check 0, write&read \n");  
    cp = (uint8 *)0x30000000;
    for(i = 0; i <(64*1024*1024); i++)      // 测试64MB大小
    {   
        // 校验0测试
    	temp = cp[0];
        if(temp != 0)
        {  	 
            g_sdram_err = WRITE_ZERO;		// 写0失败
        	g_sdram_addr = 0x30000000 + i;
        	g_test_data = 0x00;
        	g_read_data = temp;
        	       	
            UART_SendStr("\n HY57V651620 set 0 err! \n");            
            return(0);
        }
        
        // 写字节数据测试
        j = 0;
        while(j<20)		// 最多测试数据为20个
        {   
            cp[0] = WriteData[j];
            temp = cp[0];
            if (temp != WriteData[j])
            {	
                g_sdram_err = WRITE_DATA;		// 写数据失败
        		g_sdram_addr = 0x30000000 + i;
        		g_test_data = WriteData[j];
        		g_read_data = temp;
        		
                UART_SendStr("\n HY57V651620 write and read err!\n");
                return(0);               
            }
            
            j++;		// 指向下一个测试数据
            if (WriteData[j] == 0) break;    	// 如果已测试完所有数据,则退出
        } // end of while(j<20)...
                
        cp++;	        // 指向SDRAM的下一字节
        if ((i & 0x0000ffff) == 0)
        {
            UART_SendStr(".");
        }
    } // end of for (i = 0; i <(64*1024*1024); i++)...
    
    UART_SendStr("\n HY57V651620 is OK!\n");
    return(1);
}

#endif



/*********************************************************************************************************
** Function name: main
** Descriptions: 测试SDRAM。
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2005-12-06 
**-------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/ 
int  main(void)
{	                       
    // GPIO设置	        
    rGPACON = rGPACON & (~(1<<21));	                    // A口,RUN灯控制口 (GPA21)                                               
    rGPHCON = (rGPHCON & (~(0x03<<20))) | (0x01<<20);   // rGPHCON[21:20] = 01b,设置GPH10为I/O输出模式              
        
    UART_Select(0);         // 选择UART0
    UART_Init();            // 初始化UART
    
	UART_SendStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
	RunBeep();              // 蜂鸣一声,开始测试				
	rGPADAT = rGPADAT & LED_RUN_MASK;                   // 点亮RUN灯
	
#if TEST_ALL_SDRAM==0
    // 快速测试SDRAM (地址线、数据线)
	if(TestDataBus() == 0) TestErr();
	if(TestAddrBus() == 0) TestErr();
#else	
    // 完全测试SDRAM
	if(TestAllSDRAM() == 0) TestErr();  // 测试SDRAM              
#endif       
		
	UART_SendStr("\n TestSDRAM end!\n");
	RunBeep();                          // 测试结束

	// 测试通过,控制RUN灯闪烁
	while(1)
	{
		rGPADAT = rGPADAT | LED_RUN;
		DelayNS(30);
		rGPADAT = rGPADAT & LED_RUN_MASK;
		DelayNS(30);
	}

   	return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -