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:
-
caricare il puntatore TBLPTR con l' indirizzo del blocco
su cui operare
-
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
-
Disabiltare ogni interrupt
-
Scrivere la chiave 55h in EECON2
-
Scrivere la chiave AAh in EECON2
-
Portare a 1 il bir WR in EECON1. Questo avvia il ciclo
di cancellazione
-
La CPU è in stallo per circa 2 ms, fino al termine
dell' operazione di cancellazione
-
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:
-
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.
-
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.
-
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.