Aqui te dejo las rutinas de escritura y lectura en la flash..
Hay que recordar que el borrado de la flash se realiza por bloques, en el caso de los S08, estos son de 512Bytes.
Asi que lo primero que tenes que hacer es decirle a codewarrior que NO ubique codigo en determinado sector... Este sector lo vas a usar para la persistencia de tus datos.
Otro detalle importante, es que la flash no puede ser escrita desde codigo que se esta ejecutando en la misma flash, por lo que se copian las rutinas de escritura a la ram, y se salta a la misma...
Para reservar un sector de codigo, tenes que abrir el archivo
PRM de tu proyecto y buscar la palabra
ROM debajo de
SECTIONSEn el caso de un SH8, vas a ver algo asi:
ROM = READ_ONLY 0xE000 TO 0xFFAD;
Asi que de esa zona te robas 512 bytes y creas una nueva zona llamada MI_ROM:
ROM = READ_ONLY 0xE200 TO 0xFFAD;
MI_ROM = READ_WRITE 0xE000 TO 0xE1FF;
Podes ponerle el nombre que quieras, la idea es que codewarrior no use esa zona...
Despues agregas el archivo
FlashProgram.c a tu proyecto y listo =D
Ejemplo para escribir en flash:
#include FlashProgram.h
unsigned char temp; //variable usada por la "funcion" Program_Byte
byte variable;
variable=33;
Page_Erase(0xE000);
Program_Byte(0xE000,variable);
Ejemplo para leer de flash:
#include FlashProgram.h
byte variable;
variable=FlashRead(0xE000);
Saludos!
(Estos códigos que adjunto no son ninguna novedad, creo que lo saque de alguna nota de aplicación)
geronimox, Gracias por el código; pero me surje un problema:
1. A la hora de compilar me aparece un error que dice que me falta el archivo Cpu.h.

2. El código es para HCS08, pero el JL3,GP32 y QT4 son HC08; no sé si funcione igual.

El código que me sale en el QT4, el cual corresponde al archivo
PRM es el siguiente:
/* This is a linker parameter file for the mc68hc908qt4 */
NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */
SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
Z_RAM = READ_WRITE 0x0080 TO 0x00FF;
ROM = READ_ONLY 0xEE00 TO 0xFDFF;
ROM1 = READ_ONLY 0xFFB0 TO 0xFFBD;
ROM2 = READ_ONLY 0xFFC2 TO 0xFFCF;
/* INTVECTS = READ_ONLY 0xFFDE TO 0xFFFF; Reserved for Interrupt Vectors */
END
PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */
_PRESTART, /* startup code */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
DEFAULT_ROM,
COPY /* copy down information: how to initialize variables */
INTO ROM; /* ,ROM1,ROM2: To use "ROM1,ROM2" as well, pass the option -OnB=b to the compiler */
DEFAULT_RAM, /* non-zero page variables */
_DATA_ZEROPAGE, /* zero page variables */
MY_ZEROPAGE INTO Z_RAM;
END
STACKSIZE 0x30
//VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */
De nuevo gracias...!!