#define FLASH_BURST_PROG 0x25 // Byte Program - Burst Mode
#define FLASH_PAGE_ERASE 0x40 // Page Erase (512 bytes)
#define FLASH_BACKUP_ADDR (char*)0xFE00
char FlashPageErase(char *StartAddr)
{
unsigned char tmp_data;
FSTAT_FACCERR = 0; // Clear error flags
FSTAT_FPVIOL = 0;
*StartAddr = tmp_data;
FCMD = FLASH_PAGE_ERASE; // Page erase program command, takes 4000cycles
FSTAT_FCBEF = 1; // Run the command
_asm NOP; // wait four bus cycles
_asm NOP;
_asm NOP;
_asm NOP;
if(FSTAT_FACCERR || FSTAT_FPVIOL) return(0); // error
// is the command in progress?
while(!FSTAT_FCCF) __RESET_WATCHDOG();
return(1);
}
char FlashWrite(char* StartAddr, char* Data, unsigned int length)
{
FSTAT_FACCERR = 0; // Clear error flags
FSTAT_FPVIOL = 0;
do
{
unsigned char tmp_data = *Data++;
while(!FSTAT_FCBEF); // wait if buffer is full
*StartAddr = tmp_data;
FCMD = FLASH_BURST_PROG; // Burst Byte program command
FSTAT_FCBEF = 1; // Run the command
_asm NOP; // wait four bus cycles
_asm NOP;
_asm NOP;
_asm NOP;
if(FSTAT_FACCERR || FSTAT_FPVIOL) return(0); // error
StartAddr++;
} while(--length);
// is the command in progress?
while(!FSTAT_FCCF) __RESET_WATCHDOG();
return(1);
}
char CreateBackupPoint(void)
{
if(FlashPageErase(FLASH_BACKUP_ADDR))
if(FlashWrite(FLASH_BACKUP_ADDR, &NV, sizeof(TNVRAM))) // sizeof(TNVRAM) = 413byte
return(1);
return(0);
}/* This is a linker parameter file for the mc9s08lc60 */ NAMES END SEGMENTS Z_RAM = READ_WRITE 0x0060 TO 0x00FF; // 160 byte RAM = READ_WRITE 0x0100 TO 0x085F; // 1888 byte NO_INIT_RAM_SEG = NO_INIT 0x0860 TO 0x0C5F; // 1024 byte MY_STK = NO_INIT 0x0C60 TO 0x105F; // 1024 byte ROM1 = READ_ONLY 0x1060 TO 0x17FF; ROM = READ_ONLY 0x1870 TO 0xFFAF; ROM2 = READ_ONLY 0xFFC0 TO 0xFFD1; END PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */ _DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM; DEFAULT_RAM INTO RAM; NO_INIT_RAM INTO NO_INIT_RAM_SEG; SSTACK INTO MY_STK; DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM; /* ROM1,ROM2 In case you want to use ROM1,ROM2 as well, be sure the option -OnB=b is passed to the compiler. */ END STACKSIZE 0x400 VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */
Message Edited by Alban on 2007-03-14 11:41 AM