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

📄 39vf800test.c

📁 2812 外部Flash操作 源码 DSP2812 的程序源码系列
💻 C
字号:

#include "DSP28_Device.h"

// Definitions for the SST 39VF400A part
#define 	SST_ID                   0x00BF         /* SST Manufacturer's ID code   */
#define 	SST_39VF800A             0x2781         /* SST39VF400/SST39VF800A device code */
#define		TimeOutErr				 1
#define		VerifyErr				 2
#define		WriteOK					 0
#define		EraseErr				 3
#define		EraseOK					 0			
#define		SectorSize				 0x800
#define		BlockSize				 0x8000
unsigned  	int  *FlashStart = (unsigned  int *)0x100000;
unsigned  	int  *ExRamStart = (unsigned  int *)0x80000;

Uint16	SectorErase(Uint16);
Uint16	BlockErase(Uint16);
Uint16	FlashErase(void);
Uint16	FlashWrite(Uint32, Uint32,Uint16);
void	ReadFlash(Uint32, Uint32,Uint16);
void	InitExRam(Uint16);
void	InitExRamZero(Uint16);
void	ReadRam(Uint16);

void main(void)
{
	InitSysCtrl();			//初始化系统

	DINT;					//关中断
	IER = 0x0000;
	IFR = 0x0000;

	InitPieCtrl();			//初始化PIE
	InitPieVectTable();		//初始化PIE中断矢量表
    InitPeripherals();		//初始化外设


	InitExRam(0);
	FlashErase();
	
	ReadRam(0x4000);  //*(ExRamStart + Start + i) = *(ExRamStart +i);
	InitExRamZero(0x0);	
	FlashWrite(0x4000,0,0x4000); //FlashWrite(Uint32	RamStart, Uint32   RomStart,  Uint16	Length)
	                        //*(FlashStart + RomStart + i) = *(ExRamStart + RamStart + i);
	ReadFlash(0,0,0x4000);                        
	BlockErase(0);			//在这里设置断点
	InitExRamZero(0x0);	
	ReadFlash(0,0,0x4000);  //	*(ExRamStart + RamStart +i) =  *(FlashStart + RomStart +i);
		
	for(;;)
	{	;	}
}



Uint16 SectorErase(Uint16	SectorNum)
{
	Uint16	i,Data;
	Uint32	TimeOut;
	
	*(FlashStart + 0x5555) = 0xAA;
	*(FlashStart + 0x2AAA) = 0x55;
	*(FlashStart + 0x5555) = 0x80;
	*(FlashStart + 0x5555) = 0xAA;
	*(FlashStart + 0x2AAA) = 0x55;
	*(FlashStart + SectorSize * SectorNum) = 0x30;
	
	i = 0;
	TimeOut = 0;
	while(i<5)
	{
		Data = *(FlashStart +  SectorSize * (SectorNum + 1) -1);
		
		if(Data == 0xFFFF)	i++;
		else	i=0;
		
		if ( ++TimeOut>0x1000000)	return (TimeOutErr);
	}

	for	(i=0;i<SectorSize;i++)	
	{
		Data = *(FlashStart + SectorSize * SectorNum +i);
		if (Data !=0xFFFF)	return (EraseErr);
	}
	return  (EraseOK);											
}
		
Uint16 BlockErase(Uint16	BlockNum)
{
	Uint16	i,Data;
	Uint32	TimeOut;		
	
	*(FlashStart + 0x5555) = 0xAA;
	*(FlashStart + 0x2AAA) = 0x55;
	*(FlashStart + 0x5555) = 0x80;
	*(FlashStart + 0x5555) = 0xAA;
	*(FlashStart + 0x2AAA) = 0x55;
	*(FlashStart + BlockSize * BlockNum + 1) = 0x50;
	
	i = 0;
	TimeOut = 0;
	
	while(i<5)
	{
		Data = *(FlashStart +  BlockSize * (BlockNum +1));
		if	(Data == 0xFFFF)	i++;
		else	i=0;
		if ( ++TimeOut>0x1000000)	return (TimeOutErr);
	}
	
	for	(i=0;i<SectorSize;i++)	
	{
		Data = *(FlashStart + BlockSize * BlockNum +i);
		if (Data !=0xFFFF)	return (EraseErr);
	}
	return  (EraseOK);											
}
				
Uint16 FlashErase(void)
{
	Uint32	i,Data;  
	Uint32	TimeOut;				

	*(FlashStart + 0x5555) = 0xAAAA;
	*(FlashStart + 0x2AAA) = 0x5555;
	*(FlashStart + 0x5555) = 0x8080;
	*(FlashStart + 0x5555) = 0xAAAA;
	*(FlashStart + 0x2AAA) = 0x5555;
	*(FlashStart + 0x5555) = 0x1010;	

	i = 0;
	TimeOut = 0;
	while(i<5)
	{
		Data = *(FlashStart +  0x3FFFF);

		if	(Data == 0xFFFF)	i++;
		else	i=0;

		if ( ++TimeOut>0x1000000)	return (TimeOutErr);
	}

	for	(i=0;i<0x80000;i++)	//共256K Words
	{
		Data = *(FlashStart + i);
		if (Data !=0xFFFF)	return (EraseErr);
	}
	return  (EraseOK);											
}
		

Uint16 FlashWrite(Uint32	RamStart, Uint32   RomStart,  Uint16	Length)
{
	Uint32	i,TimeOut;
	Uint16	Data1,Data2,j;
	
	for	(i=0;i<Length;i++)
	{
		*(FlashStart + 0x5555) = 0xAA;
		*(FlashStart + 0x2AAA) = 0x55;
		*(FlashStart + 0x5555) = 0xA0;
		*(FlashStart + RomStart + i) = *(ExRamStart + RamStart + i);

		TimeOut = 0;
		j=0;
		while(j<5)
		{
			Data1 = *(FlashStart + RomStart + i);
			Data2 = *(FlashStart + RomStart + i);							
	
			if	(Data1 == Data2)	j++;
			else	j=0;
			
			if ( ++TimeOut>0x1000000)	return (TimeOutErr);
		}						
	}

	for (i=0;i<Length;i++)
	{
		Data1 = *(FlashStart + RomStart +i);
		Data2 = *(ExRamStart + RamStart +i);

		if  (Data1 != Data2)	return (VerifyErr);
	}
	return  (WriteOK);				
}

void ReadFlash(Uint32	RamStart, Uint32  RomStart,	Uint16	Length)
{
	Uint32	i;
	Uint16	Temp;

	for	(i=0;i<Length;i++)
	{
		Temp =  *(FlashStart + RomStart +i);
		*(ExRamStart + RamStart +i) = Temp;
	}	
}

void InitExRam(Uint16	Start)
{
	Uint16	i;
	for	(i=0;i<0x4000;i++)		*(ExRamStart + Start + i) = i;
}

void InitExRamZero(Uint16	Start)
{
	Uint16	i;
	for	(i=0;i<0x4000;i++)		*(ExRamStart + Start + i) = 0;
}

void ReadRam(Uint16	Start)
{
	Uint16	i;
	for	(i=0;i<0x4000;i++)		*(ExRamStart + Start + i) = *(ExRamStart +i);
}

⌨️ 快捷键说明

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