📄 flash.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 + -