PDF de programación - Grabación de memoria FLASH en el MC908GP32

Imágen de pdf Grabación de memoria FLASH en el MC908GP32

Grabación de memoria FLASH en el MC908GP32gráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 16 de Octubre del 2017)
772 visualizaciones desde el 16 de Octubre del 2017
175,9 KB
7 paginas
Creado hace 15a (22/04/2009)
COMENTARIO TECNICO

Grabación de memoria FLASH en el MC908GP32

Por el Ing. Gabriel Dubatti
Adaptación Ing. Daniel Di Lella Dto. Técnico EduDevices.com.ar – www.edudevices.com.ar

Segunda y última Parte.

Código Fuente de las Rutinas.
En la primera parte de este artículo, se describió en detalle la forma de uso de la memoria FLASH en los
MCUs de la “vieja guardia” como el HC908GP32 de la familia HC08 FLASH de Freescale.
A continuación se entrega el código fuente completo que permite el uso de la memoria del MCU
para el almacenamiento de datos temporales como si fuera una EEPROM del tipo 93Cxx o 24LCxx.

; =======================================================================
;
; FlashGP.ASM Programacion de memoria FLASH para HC908GP32
; =========== Por el Ing. Gabriel Dubatti (c) 2001
; www.ingdubatti.com.ar
;
; Se permite el uso y modificacion de este codigo
; bajo su exclusiva responsabilidad.
;========================================================================
; Las siguientes rutinas permiten grabar y borrar la memoria FLASH del
; GP32.
; Las mismas estan optimizadas para utilizar la menor cantidad posible
; de RAM:
; rutina de grabacion o borrado: 35 bytes
; stack de subrutina: 2 bytes
; stack de llamada a la rutina: 2 bytes
; ==========
; TOTAL de RAM necesaria: 39 bytes
; La optimizacion se realizo para una frecuencia de BUS de 8MHz pero
; pueden ajustarse las constantes para trabajar con otras frecuencias de
; clock si se respetan los delays indicados.
; Las funciones DEBEN llamarse con las INTERRUPCIONES TAPADAS por lo que
; pueden usarse normalmente estos 39 bytes de RAM como stack.
;==============================================================================

;Registros de control del PLL
PCTL EQU $0036
PCTL_B_PLLON EQU 5
PCTL_B_BCS EQU 4
PBWC EQU $0037
PBWC_B_AUTO EQU 7
PBWC_B_LOCK EQU 6
PMSH EQU $0038
PMSL EQU $0039
PMRS EQU $003A
PMDS EQU $003B
;Registros de control de la memoria FLASH
FLCR EQU $FE08
FLCR_PGM EQU $01
FLCR_ERASE EQU $02
FLCR_MASS EQU $04
FLCR_HVEN EQU $08
FLBPR EQU $FF7E
;COP
COPCTL EQU $FFFF
;=====================================================================
ORG $0040 ;Comienzo de la RAM
FlashAddress: DS 2 ;Address de grab. o borrado FLASH
FlashData: DS 1 ;Dato a grabar en FLASH o temporal
flash_code: DS !35 ;Lugar donde se copian las rutinas
;de grabacion y borrado (se puede
;reutilizar como stack o temporales)
;=====================================================================
ORG $8000 ;Comienzo de la FLASH
PagDatos: ;PAGINA de DATOS (para el ejemplo)
ds !128 ;
NBYTES_WRITE EQU !4 ;Cuantos bytes grabar en la pagina
;antes de borrarla.
;=====================================================================
ORG $9000 ;Comienzo del codigo
CodigoStart: ;(protegido p. Flash Block Protect)
;=====================================================================

;=====================================================================
; FlashWRITE:
; Graba 1 byte en memoria FLASH (GP32)
;
; REQUIERE:
; * BUS clock= 8MHZ (8 ciclos= 1 useg)
; * INTERRUPCIONES TAPADAS
; * FlashAddress= Address donde grabar el byte (2 bytes)
; * FlashData= Dato a grabar (1 byte)
;
; Descripcion:
; Carga en RAM el codigo de grabacion y lo ejecuta
; (en: flash_code)
; Requiere 35 bytes de RAM. (+4 de stack)
; Resetea el COP antes de grabar.
; Delay total = 809 ciclos = 101 microsegundos.
;=====================================================================
FlashWRITE:
ldhx #{_flash_wr_fin - _flash_wr_com} ;numero de bytes a copiar,
; H=0
copy_write: ;copia funcion de GRABACION a RAM
lda {_flash_wr_com-1},x ;
sta {flash_code-1},x ;(-1 porque X= ultimo..1)
dbnzx copy_write ;
lda #FLCR_PGM ;A= Set PGM
exec_en_ram: ;
sta COPCTL ;resetea COP
ldhx FlashAddress ;carga address del bloque a
;grabar/borrar
jmp flash_code ;ejecuta codigo en RAM,sale por RTS
;---------------------------------------------------------------------
_flash_wr_com: ;Comienzo del codigo de grabacion
;(se ejecuta en RAM)
;Al entrar: HX= address a GRABAR
; A= FLCR_PGM
sta FLCR ;FLash Control Register= PGM
lda FLBPR ;lee block protect
sta ,x ;selecciona el bloque a grabar
;==== PGM to HVEN setup time ====
;delay TNVS (10 useg.= 80 ciclos)
lda #{FLCR_HVEN+FLCR_PGM} ;2 ciclos (luego setea bit HVEN)
ldx #!24 ;2 ciclos
bsr DoDelayYStaFLCR ;4+4 ciclos + 3*X= 80 ciclos
;deja X=11 y A= FlashData
;Program Hold Time
;delay TPGS (5 useg.= 40 ciclos)

delay_tpgs: ;
dbnzx delay_tpgs ;9 + 3*X = 42 ciclos
;GRABA BYTE (A= FlashData)
ldhx FlashAddress ;(H:X= addrees a GRABAR)
sta ,x ;
;Byte Program Time (HI)
;delay TPROG (30 useg.= 240 ciclos)
ldx #!78 ;2 ciclos
lda #FLCR_HVEN ;2 ciclos (luego borra bit PGM)
bsr DoDelayYStaFLCR ;4+4 ciclos + 3*X= 242 ciclos
;delay extra= 9 ciclos
;deja X=11
;High-Voltage Hold Time
;delay TNVH (5 useg.= 40 ciclos)
clra ;1 ciclo (luego borra bit HVEN)
;10 ciclos + 3*X= 43 ciclos
DoDelayYStaFLCR: ;X= delay en ciclos = (X * 3)
dbnzx DoDelayYStaFLCR ;3 ciclos
sta FLCR ;A= nuevo valor FLCR
ldx #!11 ;2 ciclos
lda FlashData ;3 ciclos
rts ;delay extra= 5+4 = 9 ciclos
;return to read mode
;delay TRCV (1 useg.= 8 ciclos)
_flash_wr_fin: ;== Fin del codigo de grabacion ==
;---------------------------------------------------------------------
;=====================================================================
; FlashERASE:
; Borra una pagina de memoria FLASH (GP32, una pagina= 128 bytes)
;
; REQUIERE:
; * BUS clock= 8MHZ (8 ciclos= 1 useg)
; * INTERRUPCIONES TAPADAS
; * FlashAddress= address de un byte dentro del bloque a borrar
; * Usa "FlashData" de TEMPORAL (delay de borrado)
;
; Descripcion:
; Carga en RAM el codigo de borrado y lo ejecuta (en: flash_code)
; Requiere 35 bytes de RAM (+4 de stack)
; Reseta el COP antes de borrar.
; Delay total = 8545 ciclos = 1,068 milisegundos.
;=======================================================================
FlashERASE:
ldhx #{_flash_er_fin - _flash_er_com} ;numero de bytes a copiar,
;H=0
copy_erase: ;copia funcion de borrado a RAM
lda {_flash_er_com-1},x ;
sta {flash_code-1},x ;(-1 porque X= ultimo..1)
dbnzx copy_erase ;
mov #!243,FlashData ;setea delay de borrado
lda #FLCR_ERASE ;A= Set ERASE
bra exec_en_ram ;HX=FlashAddress, COP y jmp "flash_code"
;----------------------------------------------------------------------

_flash_er_com: ;= Comienzo del codigo de borrado =
;(se ejecuta en RAM)
;Al entrar: HX= address en pagina a borrar
; A= FLCR_ERASE
sta FLCR ;FLash Control Register= ERASE
lda FLBPR ;lee block protect
sta ,x ;selecciona el bloque a borrar
;Erase to HVEN setup time
;delay TNVS (10 useg.= 80 ciclos)
lda #!26 ;
delay_tnvs: ;
dbnzx delay_tnvs ;2 + 3 x 26= 80 ciclos
ldhx #FLCR ;
lda #{FLCR_HVEN+FLCR_ERASE} ;setea bit HVEN
sta ,x ;
;Erase block time
;delay TERASE (1 mseg.= 8000 ciclos)
delay_terase: ;
bsr delay_10_ciclos ;4+10= 14 ciclos
bsr delay_10_ciclos ;4+10= 14 ciclos
dbnz FlashData,delay_terase ;+5 ciclos => 33x243= 8019 ciclos
lda #FLCR_HVEN ;borra bit ERASE
sta ,x ;
;High-Voltage Hold Time
;delay TNVH (5 useg.= 40 ciclos)
lda #!13 ;
delay_tnvh: ;
dbnza delay_tnvh ;2 + 3 x 13= 41 c
  • Links de descarga
http://lwp-l.com/pdf7198

Comentarios de: Grabación de memoria FLASH en el MC908GP32 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad