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

📄 flash.c

📁 FreeSxale MC9S08FL16RM 的Flash存贮器用作EEPROM的程序
💻 C
字号:
#include  "derivative.h"
#include  "string.h"
#include  "flash.h"
#include	"Predefine.h"


#define HCS08_BUS_FREQUENCY		9960
#define HCS08_FLASH_PROTECTION  0xc0 

const uchar __NVPROT @0xFFBD = HCS08_FLASH_PROTECTION;

//char	EE_WR[16] @0xc100;
const uint EE_WR = 0xc000;
#define ADDRESS(temp)  (uchar *)(temp)

#define BYTE_OP_LEN     58
#define BRUST_OP_LEN    88  

uchar flash_byte_function[BYTE_OP_LEN] @0x0100;
uchar flash_array_function[BRUST_OP_LEN] @0x0180;

void flash_program_byte_code( uchar *address,uchar data, uchar cmd ) 
{
	DisableInterrupts; 
	if( FSTAT&0x10 )
	{
		FSTAT |= 0x10; //write 1 to FACCERR
	}
	*address = data;
	FCMD = cmd;
	FSTAT |= 0x80;
	__asm
	{
		nop
		nop
		nop
		nop
	}
	if( FSTAT&(0x10|0x20)  )
		return;
	while( !(FSTAT&0x40) );
	EnableInterrupts; 	
}				

void flash_program_brust_code( uchar *address, uchar *src, uchar len )
{
	uchar i = 0;
	DisableInterrupts; 
	if( FSTAT&0x10 )
	{
		FSTAT |= 0x10; //write 1 to FACCERR
	}
	do
	{
		while( !(FSTAT&0x80 ) );
		*address++ = *src++;
		FCMD = 0x25;
		FSTAT |= 0x80;
		__asm
		{
			nop
			nop
			nop
			nop
		}
		if( FSTAT&(0x10|0x20)  )
			return;
	}while( ++i < len );
	 
	while( !(FSTAT&0x40) );
	EnableInterrupts; 	
}			
 
void flash_init(void)
{
	if (!FCDIV_DIVLD) 
	{ 
		#if (HCS08_BUS_FREQUENCY >= 12000) 
			FCDIV = (((HCS08_BUS_FREQUENCY / (8*175))) | 0x40) - 1;   		 
		#else 	   		 
			FCDIV = (HCS08_BUS_FREQUENCY / 175) - 1; 
		#endif 
	} 
	(void)memcpy( flash_byte_function, flash_program_byte_code, BYTE_OP_LEN );
	(void)memcpy( flash_array_function, flash_program_brust_code, BRUST_OP_LEN );
} 

typedef void (*flash_byte_op)(uchar *,uchar, uchar);
typedef void (*flash_array_op)(uchar *,uchar *, uchar);

void flash_page_erase(uchar *address) 
{
	( (flash_byte_op)(0x0100) )( address, 0x00, 0x40 );
}

void flash_byte_prog( uchar *address,uchar data )
{
	( (flash_byte_op)(0x0100) )( address, data, 0x20 );
}

void flash_array_prog(uchar *dest,uchar *src,uchar len )
{
	( (flash_array_op)(0x0180) )( dest, src, len );
}
/////////////////////////////////
/*void Write_UserData(void)
{
	if((F_UseData_Update==1)&&(SysTimerStr.Timer_2sUserdataUpdate==0))
	{
		flash_page_erase(EE_WR);
		flash_array_prog(EE_WR,EE_WTemp,11);
		F_UseData_Update = 0;
		TPM1CNT = 0x00;
	}
}
/////////////////////////////////
uchar ReadFlash_Byte(uint _Addr) 
{  
return *(uchar *)_Addr;
}
/////////////////////////////////
void Read_UseData(uchar *dest)
{
	uchar	i;
	for(i=0;i<11;i++)
	{
		*(dest+i) = ReadFlash_Byte(0xc000+i);
	}
}*/
/////////////////////////////////
uchar ReadFlash_Byte(uint _Addr) 
{  
return *(uchar *)_Addr;
}
/////////////////////////////////
void Write_UserData(void)
{
	if((F_UseData_Update==1)&&(SysTimerStr.Timer_2sUserdataUpdate==0))
	{
		uchar n;
		for(Rd_Addr=0xc000;Rd_Addr<=0xc1f0;Rd_Addr+=16)
		{
			n = ReadFlash_Byte(Rd_Addr);
			if(n!=0x55)	break;
		}
		if(n!=0x55) 
		{
			_asm nop;
			flash_array_prog( ADDRESS(EE_WR+(Rd_Addr-0xc000)),EE_WTemp,12);
			_asm nop;
		}
		else
		{
		  flash_page_erase(ADDRESS(EE_WR));
		  Rd_Addr = 0xc000;
		  flash_array_prog(ADDRESS(EE_WR+(Rd_Addr-0xc000)),EE_WTemp,12);
		}												
		F_UseData_Update = 0;
		TPM1CNT = 0x00;
	}
}
/////////////////////////////////
void Read_UseData(uchar *dest)
{
	uchar	i,j;
	for(Rd_Addr=0xc000;Rd_Addr<=0xc1f0;Rd_Addr+=16)
	{
		j = ReadFlash_Byte(Rd_Addr);
		if(j!=0x55)	break;
	}
	
	if(j!=0x55&&Rd_Addr>=0xc010&&Rd_Addr<=0xc1f0)
	{
		for(i=0;i<12;i++)
		{
			*(dest+i) = ReadFlash_Byte(Rd_Addr-16+i);
		}
	}
	
	if(j==0x55&&Rd_Addr==0xc1f0)
	{
		for(i=0;i<12;i++)
		{
			*(dest+i) = ReadFlash_Byte(Rd_Addr+i);
		}
	}
	else
	{
		/*for(i=0;i<12;i++)
		{
			*(dest+i) = 0x00;
		}*/
	}
}
/////////////////////////////////

⌨️ 快捷键说明

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