La memoria FLASH è diventata la tecnologia più diffusa per la memorizzazione dei dati, grazie al suo basso costo e alle dimensioni ridotte.
La maggior parte dei microcontrollori utilizza la FLASH per la memoria di programma principale, i chip FLASH esterni offrono un modo economico per aggiungere memoria aggiuntiva, se necessario, e anche la popolare scheda SD implementa la tecnologia FLASH; gli ingegneri e i progettisti elettronici sono quindi destinati a lavorare regolarmente con la memoria FLASH. Questa memoria presenta tuttavia una serie di sfumature che non sono evidenti senza una precedente esperienza.
La FLASH è una memoria non volatile. Non è veloce come la RAM, ma ricorda il suo contenuto quando l’alimentazione si spegne. Molti progetti embedded hanno la necessità di salvare alcuni valori in una memoria non volatile, come le impostazioni dell’utente o i dati di registro, e non molto tempo fa molti microcontrollori includevano un’area di memoria EEPROM per questo scopo. La EEPROM è facile da capire e da utilizzare: contiene una certa quantità di memoria e ogni byte può essere letto e scritto individualmente (come la RAM, ma più lentamente). L’EEPROM è in grado di gestire un numero maggiore di cicli di cancellazione/scrittura rispetto alla FLASH e, quindi, era la memoria scelta per questa applicazione. Tuttavia, con il miglioramento della tecnologia FLASH e lo sviluppo di versioni con una maggiore resistenza ai cicli di cancellazione-scrittura, la memoria EEPROM è scomparsa dai microcontrollori più recenti. Questa memoria può essere utilizzata anche per memorizzare le impostazioni e i dati di registrazione, ma presenta alcune peculiarità che devono essere comprese quando si lavora con essa.
Cancellazione del settore
Quando la memoria FLASH viene cancellata, tutti i bit in essa contenuti vengono impostati su 1 (non su 0). Se quando si lavora con la FLASH si vedono molti 0xFF (esadecimale per il binario 11111111), significa che la FLASH è stata cancellata. Mentre i bit e i byte possono essere spostati singolarmente da 1 a 0 nella FLASH, lo spostamento da 0 a 1 può essere fatto solo in blocco! Le memorie FLASH sono organizzate in settori (i settori possono essere ulteriormente raggruppati in blocchi) e le dimensioni dei settori sono solitamente dell’ordine dei kilobyte; un settore è la più piccola area di memoria che può essere cancellata alla volta. Supponiamo di avere 100 impostazioni salvate nella FLASH e di voler aggiornare solo l’impostazione n. 3; per farlo è necessario cancellare l’intero settore della FLASH contenente l’impostazione n. 3 e poi riscriverla; il problema è che in questo modo si cancelleranno anche tutte le altre impostazioni, che dovranno quindi essere riscritte. Esistono diversi modi per ovviare a questo problema:
- Un metodo consiste nel leggere tutti i valori nella RAM, cancellare il settore e poi riscriverli (con i valori nuovi/aggiornati). A seconda delle dimensioni delle impostazioni (o di altri dati, come i valori del registro) e della quantità di RAM disponibile, questo metodo potrebbe non essere possibile.
- Un altro metodo consiste nel copiare tutti i valori in un altro settore FLASH vuoto, cancellare il settore originale e quindi scrivere nuovamente i valori nel settore originale (con i valori nuovi/aggiornati).
- Una versione simile del metodo sopra descritto utilizza due settori FLASH e fa un “ping pong” tra di essi: ogni volta che è necessario scrivere nuovi valori, questi vengono scritti nel settore attualmente vuoto e il vecchio settore viene cancellato (per essere utilizzato la volta successiva che sarà necessario scrivere nuovi valori o aggiornamenti).
- Quando si registrano i dati, è possibile utilizzare un certo numero di settori FLASH in modo circolare. Le nuove voci di registro vengono scritte nella memoria vuota dopo le vecchie voci. Non appena tutti i settori sono pieni, il più vecchio viene cancellato e utilizzato per scrivere nuovi dati. È necessario utilizzare una tecnica per ricordare quale sia il settore più vecchio (punto di partenza), ad esempio, un contatore incrementale scritto all’inizio del settore. Questa tecnica può essere utilizzata anche per il salvataggio delle impostazioni, dove ogni versione delle impostazioni viene registrata e poi, quando arriva il momento di rileggere i valori attuali delle impostazioni, si tratta semplicemente di leggere i valori registrati più di recente; poiché le operazioni di cancellazione della FLASH sono lente, questa tecnica può essere utilizzata per velocizzare il funzionamento del sistema.
Come già detto, la cancellazione di un settore FLASH è generalmente un’operazione lenta. La cancellazione di un settore da 128kB su un STM32F407 può richiedere da 1 a 4 secondi (a seconda della tensione di alimentazione)! L’MCU non può eseguire istruzioni dalla FLASH mentre è in corso una cancellazione; quindi, è necessario pianificare questo aspetto nella progettazione del prodotto, che sarà essenzialmente non reattivo durante questo periodo (ci possono essere opzioni alternative a seconda del microcontrollore, come copiare le istruzioni del programma nella RAM ed eseguirle da lì mentre la cancellazione della FLASH è in corso, periferiche come il DMA possono anche continuare a funzionare in modo indipendente).
Con una buona comprensione del funzionamento della FLASH in generale e la conoscenza dei parametri del particolare dispositivo FLASH con cui si lavora (dimensioni dei settori, tempi di cancellazione, ecc.) dalla sua scheda tecnica, è possibile implementare una tecnica adeguata per aggirare le sfumature della FLASH e implementare l’applicazione richiesta.
Durante la simulazione di Proteus è possibile visualizzare il contenuto della memoria FLASH e le operazioni in un singolo passaggio, il che può contribuire a fornire informazioni sullo sviluppo e il debug di progetti che utilizzano la memoria FLASH.
Puoi scaricare la versione demo di Proteus di Labcenter, distribuito in Italia da Galgo Electronics.
All content Copyright Labcenter Electronics Ltd. 2024 – Per l’articolo originale clicca qui