Navegación
Proyectos
Inicio de sesión
Tweets
Videos
Utilizar flash como Eprom en la familia HC08:
Turkos — Mié, 08/26/2009 - 00:08
El método clásico de grabado en flash:
El método elegante y fácil
Rutina de búsqueda de memoria en blanco:
Rutina de escritura en flash:
Archivos a incorporar en el proyecto de codewarrior:
/********************************************************************************/
/* Write_Flash.h */
/* Archivo cabecera con las funciones, variables y constantes */
/* Necesarias para el grabado de flash */
/* */
/* */
/********************************************************************************/
#ifndef __Write_Flash
#define __write_Flash
/*Dirección del bloque a grabar*/
#include "derivative.h"
#define EraRnge 0x2806 ;//FLASH erase routine in ROM
#define PgrRnge 0x2809 ;//FLASH programming routine in ROM
#define CtrlByt 0x88 ;//control byte for ROM subroutines
#define CPUSpd 0x89 ;//CPU speed in units of 0.25MHz
#define LstAddr 0x8A ;//last FLASH address to be programmed
#define Blklpace 0xEE00;
#define BlkSize 0x05;
byte Escritura[7] @LstAddr;
void RdBlock(void);
void WrtBlock(void);
#endif
/***********************************************************************/
/* Write_Flash.c */
/* */
/* */
/* */
/* */
/***********************************************************************/
/*----------------------------------------------------
*RdBlock:
*Lee un block de datos desde la flash y la guarda en RAM
*Parámetros:
* Blklpage Inicio del bloque de FLASH de datos
* BlklSize Tamaño del bloque
*Retorna:
* Punto donde empiezan los datos grabados de FLASH
* Dato del primer byte del bloque
*
*
*
*
*
*
*
*
*
-----------------------------------------------------*/
void RdBlock(void) {
asm{
SEI
ldhx #Blklpace;
lda #BlkSize;
RdBlock: psha; //Empila BlSize
bsr FindClear; //busca el primer bloque borrado
cmp #$FF; //Está en blanco???
bne skipdec;//
txa;
and #$3F;
beq skipdec;
txa
sub 1,sp
tax
skipdec: lda ,x;
ais #1;
rts;
FindClear: lda #$40 ;
sub 3,sp ;
psha ;
floop:
lda ,x ;
cmp #$FF;
beq finish1;
pula ;
sub 3,sp ;
psha ;
bmi finish2 ;
txa ;
add 4,sp ;
tax ;
bra floop ;
finish2: clra ;
finish1: ais #1 ;
cli
rts
}
}
void WrtBlock(void){
asm{
SEI
ldhx #Blklpace;
lda #BlkSize;
WrtBlock: mov #13,CPUSpd ;
clr CtrlByt ;
psha ;
bsr FindClear;
cmp #$FF ;
beq blkfnd ;
jsr EraRnge ;
txa ;
and #$C0 ;
tax ;
blkfnd: pula ;
pshx ;
add 1,sp ;
deca ;
tax ;
sthx LstAddr ;
pulx ;
jmp PgrRnge ;
FindClear: lda #$40 ;
sub 3,sp ;
psha ;
floop:
lda ,x ;
cmp #$FF;
beq finish1;
pula ;
sub 3,sp ;
psha ;
bmi finish2 ;
txa ;
add 4,sp ;
tax ;
bra floop ;
finish2: clra ;
finish1: ais #1 ;
cli
rts
}
}
RdBlock(); //Para leer el bloque de memoria grabado
asm
{
sthx LecAddr; //Pasamos el valor del registro (H:X) a un puntero
//LecAddr es el principio del vector de tamaño igual
//al tamaño de bloque a leer y contendrá los datos leídos
}
WrtBlock() //Si llamamos a esta función lo
//que pasará es que el contenido en el vector
//con dirección LstAddr en mi caso lo llamé Escritura[ ]
//se grabará en el próximo lugar de flash en blanco
- Inicie sesión o regístrese para enviar comentarios

















Gracias...
JuanJo_SeSe — Jue, 08/27/2009 - 12:43Turkex, ni bien pueda voy a hacer pruebas con este asunto... gracias!
Gracias
sebest — Mié, 08/26/2009 - 22:09Gracias Turkos, muy completo tu informe, apenas termine las cosas que estoy haciendo, me voy a poner a probar esto que se ve muy interesante.
Nos vemos