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

📄 main.c

📁 ADS 1.2 开发的用来烧写 AMD Flash 程序源码
💻 C
字号:
//******************************************************
//Chinese Academy of Sciences, Institute of Automation
//File Name:	main.c
//Description: 	Write flash,32bits model
//Author:	JuGuang,Li
//Date:		2004-3-20
//******************************************************	
#include "def.h"
#include "s3c2410UART.h"

#define AM_WORD_COUNT	       0x00012000

#define AM_START_ADDR          0x0000000	//0x1100000	    
#define AM_ADDR_UNLOCK1        0x555
#define AM_ADDR_UNLOCK2        0x2aa
#define AM_DATA_UNLOCK1        0xaaaa
#define AM_DATA_UNLOCK2        0x5555
#define AM_SETUP_WRITE         0xa0a0
#define AM_SETUP_ERASE         0x8080
#define AM_CHIP_ERASE          0x1010
#define AM_SECTOR_ERASE	       0x3030
#define AM_RESET		       0xf0f0

#define AM_SECTOR_ADDR_01      	0x0000000
#define AM_SECTOR_ADDR_02      	0x0004000
#define AM_SECTOR_ADDR_03      	0x0006000
#define AM_SECTOR_ADDR_04      	0x0008000
#define AM_SECTOR_ADDR_END     	0x0800000

void Delay(unsigned int);

void InitUART(int Port,int Baudrate);
void PrintUART(int port,char *s);
void Chip_Erase(void);

//********************************************************************************
//功能简述:	首先擦除Flash,然后做整片的空白检测,最后将待烧写的内容写入Flash
//的0x0地址,待写入的内容首先下载到0x31000000处,写入文件的大小不超过AM_WORD_COUNT的
//定义。
//********************************************************************************
void Main()
{	

	volatile UINT16 *from_add,*to_add,*address;
	int i;
	GPHCON=0xaaaa;
	InitUART(2,26);
	PrintUART(2,"*******************************************************************************\n\r");
	PrintUART(2,"*                         tianjin TCB  Co., Ltd                               *\n\r");
	PrintUART(2,"*                                                                             *\n\r");
   	PrintUART(2,"*                           http://www.TCB.com                                *\n\r");
	PrintUART(2,"*                                                                             *\n\r");
   	PrintUART(2,"*                    Tel: (86-022) 26237593   26237534                        *\n\r");
	PrintUART(2,"*******************************************************************************\n\r");
	PrintUART(2,"Flash Erase,Please Wait...\r\n");
	Chip_Erase();
	Delay(100);
	PrintUART(2,"Blank Check...");
	
CHKB1:	         	
	Delay(10);
        for(address=(volatile UINT16 *)AM_SECTOR_ADDR_01;address<(volatile UINT16 *)AM_SECTOR_ADDR_END;address++)
		{
		if(*address!=0xffff)
			{PrintUART(2,".");
			goto CHKB1;}
		}	
	PrintUART(2,",OK!\r\n\r\n\r\n");
	
	PrintUART(2,"Program to Flash,Please wait...\r\n");
	
	
	to_add= (UINT16 *)0x0;
	from_add=(UINT16 *)0x31000000;
	//写Flash,并检测是否写完
	for(i=0;i<AM_WORD_COUNT;i++)
		//写Flash
		{*((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;       
		 *((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
		 *((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_SETUP_WRITE;     
  		 *to_add =*from_add ;
  		 
  		 //检测是否写完
		while(1)
		{
			if(((*to_add)&0x80)==((*from_add)&0x80))
			break;
		}
  		 
  		 *to_add++;
  		 *from_add++;
  		 PrintUART(2,".");
		}
	PrintUART(2,"\r\n\r\nFlash Programe Sucessfully,Please reset system!!!\n\r");
}


void PrintUART(int Port,char *s)
{
	if(Port==0)
		for(;*s!='\0';s++)
			{for(;(!(UTRSTAT0&0x4)););
			UTXH0=*s;}
	if(Port==1)
		for(;*s!='\0';s++)
			{for(;(!(UTRSTAT1&0x4)););
			UTXH1=*s;}
	if(Port==2)
		for(;*s!='\0';s++)
			{for(;(!(UTRSTAT2&0x4)););
			UTXH2=*s;}			
}

void InitUART(int Port,int Baudrate)
{
	if(Port==0)
		{ULCON0=0x03;
		UCON0=0x09;
		UBRDIV0=Baudrate;   
		}
	if(Port==1)
		{ULCON1=0x03;
		UCON1=0x09;
		UBRDIV1=Baudrate;   
		}
	if(Port==2)
		{ULCON2=0x03;
		UCON2=0x09;
		UBRDIV2=Baudrate;   
		}

}
//******************************************************************************
//功能简述:	发送整片Flash擦除命令。
//******************************************************************************
void Chip_Erase()
{
	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;       
	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_SETUP_ERASE;     
    	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;       
	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
  	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_CHIP_ERASE;	
}

void Delay(unsigned int x)
{
	unsigned int i,j,k;
	for(i=0;i<=x;i++)
		for(j=0;j<0xff;j++)
			for(k=0;k<0xff;k++);
}

⌨️ 快捷键说明

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