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

📄 main.c

📁 一份烧写 norflash sst39vf1601的源代码 很好用
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: main.c
** Last modified Date: 2005-12-31 
** Last Version: v1.0
** Description: 将SDRAM中的数据写入到NOR Flash中,实现程序的固化。
**     将要烧写的BIN文件改名为flash.bin,然后复制到本工程目录的src目录下,接着重新编译本工程(一定要
** 重新编译),再启动AXD调试,全速运行程序即可。
**     要求系统选择NOR Flash启动方式。
**------------------------------------------------------------------------------------------------------
** Created By: 黄绍斌
** Created date: 2005-12-31
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#include  "config.h"


// 运行LED灯控制字定义
#define   LED_RUN			(1<<21)
#define   LED_RUN_MASK		(~LED_RUN)

// 定义蜂鸣器控制口
#define   BEEP		        (1<<10)     /* GPH10口 */	
#define   BEEP_MASK	        (~BEEP)

// 声明外部标号(flash.bin文件的存储地址)
extern  uint16 FLASH_FUNCTION[];
extern  uint16 FLASH_FUNCTION_END[];


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

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



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



// FLASH的起始地址(分配为Bank0块,16位宽度)
#define   FLASH_ADDR		0x00000000


/*********************************************************************************************************
** Function name: GetAddr (宏函数)
** Descriptions: 转换地址。将要发送给SST39VF1601的地址值进行转换,以便于S3C2410A输出。
**               由于SST39VF1601的A0是与S3C2410A的A1相连,所以addr要左移1位。
** Input: addr		SST39VF1601的内部地址值
** Output: 返回转换出的地址
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define  GetAddr(addr)	(volatile uint16  *)(FLASH_ADDR|(addr<<1))



/*********************************************************************************************************
** Function name: WordProgram
** Descriptions: 半字(16位)数据编程。    
** Input: Addr		编程地址(SST39VF1601内部地址)	
**        Data		编程数据
** Output: 返回TRUE表示操作成功,返回FALSE表示操作失败
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int  WordProgram(uint32 Addr, uint16 Data) 
{  
    volatile uint16  *ip;
    uint16  temp1,temp2;

    ip = GetAddr(0x5555);	// 转换地址0x5555
    ip[0] = 0xaaaa;			// 第一个写周期,地址0x5555,数据0xAA
    ip = GetAddr(0x2aaa);
    ip[0] = 0x5555;			// 第二个写周期,地址0x2aaa,数据0x55
    ip = GetAddr(0x5555);
    ip[0] = 0xa0a0;			// 第三个写周期,地址0x5555,数据0xA0
    
    ip = GetAddr(Addr);
    *ip = Data;				// 第四个写周期,地址Addr,数据Data
  
    temp1 = *ip;				// 预读处理
    while(1)				// 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
    {  
        temp1 = *ip;			
        temp2 = *ip;
        if(temp1 == temp2)
        {  
            if(temp1 != Data)
            {  
                return(FALSE);
            }
            else
            {  
                return(TRUE);
            }
        } // end of if(temp1 == temp2)...
    } // end of while(1)...  
    return(TRUE);
}



/*********************************************************************************************************
** Function name: WordRead
** Descriptions: 读取指定地址(Flash内部的)上的半字(16位)数据。      
** Input: Addr		编程地址(SST39VF1601内部地址)	
** Output: 返回值即是读出的数据
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16  WordRead(uint32 Addr) 
{	
    volatile uint16  *ip;
	
	ip = GetAddr(Addr);
	return(*ip);
}



/*********************************************************************************************************
** Function name: ChipErase
** Descriptions: 芯片全片擦除。         
** Input: 无
** Output: 返回TRUE表示操作成功,返回FALSE表示操作失败
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int  ChipErase(void) 
{  
    volatile uint16  *ip;
    uint16  temp1,temp2;

    ip = GetAddr(0x5555);
    ip[0] = 0xaaaa;			// 第一个写周期,地址0x5555,数据0xAA
    ip = GetAddr(0x2aaa);
    ip[0] = 0x5555;			// 第二个写周期,地址0x2aaa,数据0x55
    ip = GetAddr(0x5555);
    ip[0] = 0x8080;			// 第三个写周期,地址0x5555,数据0x80
    ip = GetAddr(0x5555);
    ip[0] = 0xaaaa;			// 第四个写周期,地址0x5555,数据0xAA
    ip = GetAddr(0x2aaa);
    ip[0] = 0x5555;			// 第五个写周期,地址0x2aaa,数据0x55
    ip = GetAddr(0x5555);
    ip[0] = 0x1010;			// 第六个写周期,地址0x5555,数据0x10

    temp1 = *ip;
    while(1)				// 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
    {  
        temp1 = *ip;
        temp2 = *ip;
        if(temp1 == temp2)
        {  
            if(temp1 != 0xffff)
            {  
                return(FALSE);
            }
            else
            {  
                return(TRUE);
            }
        } // end of if(temp1 == temp2)...
    } // end of while(1)...
    return(TRUE);
}



uint16  wr_data;

/*********************************************************************************************************
** Function name: main
** Descriptions: 将FLASH_FUNCTION起始地址上的数据写入到NOR Flash的0x000000地址。
**               写入字节个数为flash.bin文件的大小。         
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int  main(void)
{	
    uint32  addr, size;
    uint32  err;

    // I/O初始化
    rGPACON = rGPACON & LED_RUN_MASK;
    rGPHCON = (rGPHCON & (~(0x03<<20))) | (0x01<<20);       
	
	rGPADAT = rGPADAT & LED_RUN_MASK;   // 点亮RUN灯,表示正在操作Flash	
	rGPHDAT = rGPHDAT | BEEP;

	// 全片擦除操作
	ChipErase();
	DelayNS(1);
	
	// 计算flash.bin文件的大小
	size = FLASH_FUNCTION_END - FLASH_FUNCTION + 1;
    
	// 开始写数据
	for(addr=0; addr<size; addr++)
	{	
	    wr_data = FLASH_FUNCTION[addr];
		WordProgram(addr, wr_data); 
		
		// 控制RUN灯闪烁
		if((addr%1000) == 0)
		{	
		    if((addr%2000) == 0) rGPADAT = rGPADAT & LED_RUN_MASK;
			  else  rGPADAT = rGPADAT | LED_RUN;	
		}
	}
	
	// 编程结束
	rGPADAT = rGPADAT | LED_RUN;	
	RunBeep();
	
	// 读取100字节校验
	err = 0;	
	for(addr=0; addr<100; addr++)
	{
	    wr_data = WordRead(addr);
	    if(wr_data != FLASH_FUNCTION[addr]) err++;  
	}
	while(err)          // 出错报警
	{   
	    RunBeep();
	}
	
	while(1);
   	return(0);
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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