Mehmet Fide

MC9S08LC60 - Writing to Flash Area

Discussion created by Mehmet Fide on Feb 26, 2007
Latest reply on Mar 11, 2008 by bigmac
Hi,
I'm using CW 5.1 and MC9S08LC60.
I want to save some area(total 512 bytes) in ram to area 0xFE00-0xFFFF in flash memory.
- How can I reserve this flash area(0xFE00-0xFFFF) ?
- How can I place my FlashWrite, Erase functions to another flash array? The total program is now about 46KB.
I didn't test the routines below yet. I hope it works.
Code:
#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);
}


Wizard generated prm file is here:
Code:
/* 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. */

I'm new at HCS08 and I don't know what ROM, ROM1 and ROM2 segments generated by wizard are for.
Thank you.


Alban Edit: FSL Part Number in Subject line + split/moved to appropriate location.

Message Edited by Alban on 2007-03-14 11:41 AM

Outcomes