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

📄 flash main.c

📁 在线烧写5402外扩Flash的源码
💻 C
字号:

#include <stdio.h>
#include <file.h>
#include <std.h>
#include <math.h>

#define OFFSET 0x4000
#define CLKMD *(int *)0x58
#define SSWSR *(int *)0x28

void FlashWrite(unsigned address,unsigned data);
unsigned FlashRead(unsigned address);
void delay(unsigned x,unsigned y);


void main()
{
	int fileNo,filecur;
	unsigned myaddress,mydata,checkdata;
	unsigned temp,len,i,ii;
	char mychar[5];
	
	//禁止所有可屏蔽中断
	asm(" RSBX INTM");
	SSWSR=SSWSR & 0xFE7F;
	//设定PLL		
	CLKMD=0x0;
	ii=CLKMD & 0x0001;
	while(ii)
	{
		ii=CLKMD & 0x0001;
	}
	CLKMD=0x9007;
	delay(1,256);	//等待PLL锁定	
		
	FlashWrite((0x555+OFFSET),0x00AA);//1st cycle

	FlashWrite((0x2AA+OFFSET),0x0055);//2 nd cycle

	FlashWrite((0x555+OFFSET),0x00A0);//Program command
	
	fileNo=open("e:\\dsp\\MFC_32A.hex",0x8000,0);
	if(fileNo<0)
	{
		printf("File Open Err! The No. Is %d\n",fileNo);
		
	}
	else
	{
		printf("File Opened! Is Burning...\n");
		lseek(fileNo,0,0);
		do
		{
			asm(" RSBX XF");
			filecur=read(fileNo,mychar,3);
			temp=(mychar[1]<60 ? ((unsigned)mychar[1]-48):((unsigned)mychar[1]-55));
			len=temp<<4;
			temp=(mychar[2]<60 ? ((unsigned)mychar[2]-48):((unsigned)mychar[2]-55));
			len=len+temp;
			len=len>>1;
			
			filecur=read(fileNo,mychar,4);
			temp=(mychar[0]<60 ? ((unsigned)mychar[0]-48):((unsigned)mychar[0]-55));
			myaddress=temp<<12;
			temp=(mychar[1]<60 ? ((unsigned)mychar[1]-48):((unsigned)mychar[1]-55));
			myaddress=myaddress+(temp<<8);
			temp=(mychar[2]<60 ? ((unsigned)mychar[2]-48):((unsigned)mychar[2]-55));
			myaddress=myaddress+(temp<<4);
			temp=(mychar[3]<60 ? ((unsigned)mychar[3]-48):((unsigned)mychar[3]-55));
			myaddress=myaddress+temp;
			
			filecur=read(fileNo,mychar,2);
			
			for(i=0;i<len;i++)
			{	asm(" RSBX XF");
				filecur=read(fileNo,mychar,4);
				temp=(mychar[0]<60 ? ((unsigned)mychar[0]-48):((unsigned)mychar[0]-55));
				mydata=temp<<12;
				temp=(mychar[1]<60 ? ((unsigned)mychar[1]-48):((unsigned)mychar[1]-55));
				mydata=mydata+(temp<<8);
				temp=(mychar[2]<60 ? ((unsigned)mychar[2]-48):((unsigned)mychar[2]-55));
				mydata=mydata+(temp<<4);
				temp=(mychar[3]<60 ? ((unsigned)mychar[3]-48):((unsigned)mychar[3]-55));
				mydata=mydata+temp;
								
				FlashWrite(myaddress,mydata);//put mydata into myaddress
				
				checkdata=FlashRead(myaddress);
				
				if(checkdata!=mydata)
				{
					printf("Data Check Err!\n");
					filecur=0;
					break;
				}
				
				myaddress++;
			}
				
			len=0;		
			filecur=read(fileNo,mychar,4);
			if(strcmp(mychar,"FF\r\n")==0)
			{
				filecur=0;
				break;
			}
		
		}while(filecur>0);
		
		if(filecur==0)
		{
			printf("File Burned!\n");
			
			lseek(fileNo,3,0);
			filecur=read(fileNo,mychar,4);
			temp=(mychar[0]<60 ? ((unsigned)mychar[0]-48):((unsigned)mychar[0]-55));
			myaddress=temp<<12;
			temp=(mychar[1]<60 ? ((unsigned)mychar[1]-48):((unsigned)mychar[1]-55));
			myaddress=myaddress+(temp<<8);
			temp=(mychar[2]<60 ? ((unsigned)mychar[2]-48):((unsigned)mychar[2]-55));
			myaddress=myaddress+(temp<<4);
			temp=(mychar[3]<60 ? ((unsigned)mychar[3]-48):((unsigned)mychar[3]-55));
			myaddress=myaddress+temp;
			
			printf("Creating Boot Mark...\n");
			
			FlashWrite(0xFFFF,myaddress);
			
			checkdata=FlashRead(0xFFFF);
			if(checkdata!=myaddress)
			{
				printf("Data Check Err!\n");
				printf("Boot Mark Can't be Created!\n");					
			}
			else
			{
				printf("Boot Mark Created!  OK!\n");
			}
		}
		else
		{
			printf("Source File Read Err!\n");
		}
	}
	
	fileNo=close(fileNo);
	if(fileNo==0)
	{
		printf("File Closed!\n");
	}
	else
	{
		printf("File Close Err! The No. Is %d\n",fileNo);
	}
}


void FlashWrite(unsigned address,unsigned data)
{
	unsigned *p;
	p=(unsigned *)address;
	*p=data;
}

unsigned FlashRead(unsigned address)
{
	unsigned *p;
	p=(unsigned *)address;
	
	return *p;
}


void delay(unsigned x,unsigned y)
{
	int i,j;
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			;
		}	
	}
}



⌨️ 快捷键说明

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