danielhembree

HCS08 Flash routine for dummies

Discussion created by danielhembree on Jul 11, 2013
Latest reply on Jul 17, 2013 by danielhembree

I know this subject has been covered many times in this forum, and I have looked at many of the posts to try and figure out how to accomplish this, but I can't seem to get a handle on it. It seems like a fairly straightforward procedure, which is all the more frustrating. I am using an MC9S08GB60A and Codewarrior 5.9.0. All I want to do is write a single flash memory location with a byte that represents the last state of an input port so that when the system is next powered on, the input state is recalled.

 

I am by no means an expert at this so please forgive...

 

 

Code is below:

 

// Flash write from RAM.MCP

 

#include <hidef.h> /* for EnableInterrupts macro */

#include "derivative.h" /* include peripheral declarations */

 

int address;

unsigned char data;

 

unsigned char FLASH_CMD[] @0x1040={

0x87,0xC6,0x18,0x25,0xA5,0x10,0x27,0x08,0xC6,0x18,0x25,0xAA,0x10,0xC7,0x18,0x25,

0x9E,0xE6,0x01,0xF7,0xA6,0x20,0xC7,0x18,0x26,0x45,0x18,0x25,0xF6,0xAA,0x80,0xF7,

0x9D,0x9D,0x9D,0x9D,0x45,0x18,0x25,0xF6,0xF7,0xF6,0xA5,0x30,0x27,0x04,0xA6,0xFF,

0x20,0x07,0xC6,0x18,0x25,0xA5,0x40,0x27,0xF9,0x8A,0x81};

 

 

// Function Prototypes

void Write_byte(int Address, unsigned char data);

 

void main(void) {

  DisableInterrupts;                     // Disable interupts

  SOPT_COPE = 0;                    // Disable COP

  ICGC1 = 0x28;                          // Configure Fbus = 5MHz

  ICGC2 = 0x72;

 

  if(FSTAT_FACCERR == 1)          // Check FACCERR Flag, clear if set

      {

          FSTAT_FACCERR = 1;

      }

 

  FCDIV = 0x18;                          // Configure Fclk (5MHz/(24+1)=200KHz)

  address = 0x2000;                    // Flash memory location

  data = 0x01;                             // Data (dummy)

 

  for(;;)

   {

           Write_byte(address, data);       // Call writing function

           data++;                                  // Next (dummy) data value

   

    __RESET_WATCHDOG(); /* feeds the dog */

  } /* loop forever */

 

}

 

 

void Write_byte(address, data)

    {

    asm jsr 0x1040;                    // Flash write routine from code

    }                                          // example in HCS08QRUG, opcode

                                               // contained within array located

                                               // at RAM mem location $1040 .

 

*******************************************************************************

 

 

Below is the excerpt from HSC08QRUQ (p93) that the opcode in the array is based on:

 

//Array of opcode instructions of the Erase/Program function

//Element 0x14 of the array is: (command 0x20 to program a byte, 0x40 to erase a page)

unsigned char FLASH_CMD[] {

0x87,0xC6,0x18,0x25,0xA5,0x10,0x27,0x08,0xC6,0x18,0x25,0xAA,0x10,0xC7,0x18,0x25,

0x9E,0xE6,0x01,0xF7,0xA6,0x20,0xC7,0x18,0x26,0x45,0x18,0x25,0xF6,0xAA,0x80,0xF7,

0x9D,0x9D,0x9D,0x9D,0x45,0x18,0x25,0xF6,0xF7,0xF6,0xA5,0x30,0x27,0x04,0xA6,0xFF,

0x20,0x07,0xC6,0x18,0x25,0xA5,0x40,0x27,0xF9,0x8A,0x81};

/* The opcode above represents this set of instructions

if (FSTAT&0x10){ //Check to see if FACCERR is set

FSTAT = FSTAT | 0x10; //write a 1 to FACCERR to clear

}

(*((volatile unsigned char *)(Address))) = data; //write to somewhere in flash

FCMD = 0x20; //set command type.

FSTAT = FSTAT | 0x80; //Put FCBEF at 1.

_asm NOP; //Wait 4 cycles

_asm NOP;

_asm NOP;

_asm NOP;

if (FSTAT&0x30){ //check to see if FACCERR or FVIOL are set

return 0xFF; //if so, error.

}

while ((FSTAT&0x40)==0){ //else wait for command to complete

;

}*/


 


Outcomes