Tutorials - PIC18 by Data Sheet

 

Pag 78 - Cancellazione della Flash

 


Cancellazione della FLASH

Sfortunatamente, per scrivere una cella di memoria FLASH occorre averla prima cancellata del suo contenuto.
Con la cancellazione si portano tutti i bit a 1: nella cella è possibile portare il bit a 0 con la scrittura.
Questo è un limite della tecnologia FLASH e non dei PIC: Microchip ha scelto una tecnologia che offriva velocità di lettura e facilità di riscrittura.


NOTA:

La cancellazione e scrittura della FLASH è una procedura analoga a quella del trasferimento del programma nel chip, programma che viene proprio posto nella Memoria FLASH.
Ci sono però differenze essenziali:

  • la programmazione del chip attraverso un programmatore esterno o ICSP scrive nella FLASH del microcontroller i codici binari ottenuti dall' assemblaggio o dalla compilazione di un sorgente.
  • la scrittura della FLASH che qui viene trattata è una operazione che viene svolta all' interno del chip stesso SOTTO IL CONTROLLO del programma

Se la prima operazione può scrivere interamente tutta la memoria disponibile, la seconda richiede che esista comunque una parte di programma, quella preposta proprio alla scrittura, che non può ovviamente auto-cancellarsi.

Per motivi costruttivi, la cancellazione può essere effettuata solamente su blocchi di 32 words (64 bytes) per volta; dunque, non è possibile cancellare un solo byte o una sola word.
Per contro, solo con ICSP o programmatore esterno è possibile cancellare blocchi di dimensioni maggiori.

L' area da cancellare è determinata dal solito TBLPTR, dove sono ignorati i 6 bit meno significativi (bit 0:5), mentre gli altri determinano l' indirizzo di inizio del blocco.

Quindi il blocco cancellato sarà compreso tra b'000xxxxx xxxxxxxx xx000000' e b'000xxxxx xxxxxxxx xx111111'.

Vale quanto detto per la lettura a riguardo del TBLPTRU in chip con aree di memoria inferiori a 64 k.

L' operazione di cancellazione, come quella di scrittura, richiede una procedura più elaborata di quella di lettura e , inoltre, non è immediata, ma sottoposta ad una temporizzazione determinata da un timer interno.
ovvero, la lettura della FLASH è "istantanea" mentre cancellazione e scrittura richiedono un certo tempo.

Una operazione di cancellazione richiede i seguenti passi:

  1. caricare il puntatore TBLPTR con l' indirizzo del blocco su cui operare

  2. agire sul registro EECON1:

    • EEPGD = 1 per puntare sulla FLASH

    • CFGS = 0 per l' accesso alla memoria programma

    • WREN = 1 per abilitare la scrittura

    • FREE = 1 per abilitare la cancellazione

  3. Disabiltare ogni interrupt

  4. Scrivere la chiave 55h in EECON2

  5. Scrivere la chiave AAh in EECON2

  6. Portare a 1 il bir WR in EECON1. Questo avvia il ciclo di cancellazione

  7. La CPU è in stallo per circa 2 ms, fino al termine dell' operazione di cancellazione

  8. Riabilitare gli interrupt

Ad esempio:

   movlw  UPPER (indirizzo)    ; carica puntato con bit 16:21 dell' indirizzo
   movwf  TBLPTRU
   movlw  HIGH (indirizzo)
     ; carica puntatore con bit 8:15 
   movwf  TBLPTRH
   movlw 
LOW
(indirizzo)      ; carica puntatore con bit 0:7
   movwf  TBLPTRL

Erase_Row:
   bsf    EECON1, EEPGD      
; set dei bit di EECON1
   bsf    EECON1, CFGS
   bsf    EECON1, WREN
   bsf    EECON1, FREE
   bcf    INTCON, GIE        
; blocco dell' interrupt
   movlw  0x55               
; chiave di avviamento dell' operazione
   movwf  EECON2
   movlw  0xAA
   movwf  EECON2
   bsf    EECON1, WR         
; la CPU è in bloco per 2 ms circa
   nop                       
; sicurezza al riavvio
   bsf    INTCON, GIE        
; riavvio dell' interrupt
  

Da notare anche che, per una ulteriore sicurezza, è obbligatorio scrivere la chiave 55h-AAh (b'01010101' e b'10101010') in EECON2 per abilitare l' operazione.

Da notare anche che il set dei bit di EECON1 viene effettuato singolarmente.

Inoltre vanno considerati alcuni punti chiave:

  1. Innanzitutto l' operazione di cancellazione manda in stallo la CPU, che non esegue alcuna altra funzione fino a che il tempo del timer interno (circa 2 ms) è esaurito.

  2. L' operazione di cancellazione, agendo su un' area in cui è contenuto il programma stesso, è fortemente critica. Questo richiede che l' operazione non sia interrotta da una azione esterna, come una chiamata ad interrupt. Per questa ragione, se l' interrupt è attivo, va bloccato prima di avviare la cancellazione e riabilitato solo alla ripresa del funzionamento della CPU.

  3. Questo fa si che l' operazione di cancellazione debba essere effettuata in un momento in cui il blocco di eventuali interrupt per il tempo di stallo non sia problematico per il funzionamento del dispositivo.

Tenendo presente che la successiva scrittura dell' area cancellata richiederà ulteriore tempo, si comprende come la scrittura della memoria programma sia una operazione eccezionale e dedicata a funzioni speciali, come bootloader o programmi auto aggiornanti.
Inoltre, azioni di cancellazione e riscrittura riducono la vita della FLASH. 

Pertanto, un semplice salvataggio di dati per la caduta di tensione sarà indirizzato piuttosto alla EEPROM.

L' istruzione nop  è stata aggiunta rispetto al listato riportato sul foglio dati in quanto è possibile che alla ripartenza dallo stallo sia necessaria una istruzione "tampone" per permettere il risveglio corretto della CPU.

Se nel programma non ci sono interrupt, ovviamente non serve bloccarli e riavviarli.

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 04/12/10.