Corruzione della memoria flash AVR


11

Questa domanda è correlata alla deprogrammazione AVR stessa .

Informazioni sul progetto:
abbiamo un prodotto alimentato a batteria che utilizza un ATMEGA644P. L'applicazione funziona in modo permanente in modalità sospensione e si riattiva solo una volta al secondo (RTC) o quando viene attivata una delle due linee di interruzione esterne.

Il dispositivo dispone di un caricatore di avvio piuttosto semplice che sta comunicando tramite UART (utilizzando l'interfaccia IC RS232). Serve solo come metodo pratico per aggiornare il firmware in modo che non sia necessario alcun programmatore ISP hardware. (Il bootloader si aspetta telegrammi di checksum protetti)

I dispositivi sono stati progettati con brown-out interno DISABILITATO perché raddoppia il consumo energetico e la lunga durata della batteria è obbligatoria (immagino che avrebbe dovuto essere utilizzato un rilevamento brown-out esterno - è in corso una riprogettazione).

Problema:
ogni pochi mesi un dispositivo smette di funzionare, NON sono stati eseguiti aggiornamenti del firmware su tali dispositivi. Tuttavia, dopo un ulteriore esame, il contenuto flash di tali dispositivi sembra essere danneggiato. Inoltre, le batterie di alcuni di questi dispositivi erano ancora buone, ma non voglio escludere una sorta di situazione di sottotensione.

Questo è un confronto tra il contenuto flash originale (a sinistra) e il contenuto danneggiato (a destra):

Confronto flash

Alcune osservazioni:

  • Un blocco danneggiato è sempre costituito da almeno una pagina flash (256 byte) ed è allineato alla pagina. In altre parole: sono interessate solo le pagine intere, non i singoli byte.
  • Il contenuto danneggiato legge 0xFF per la maggior parte del tempo, ma può anche contenere alcuni altri valori o essere completamente "casuale".
  • La piccola barra sul lato sinistro dell'immagine mostra tutte le aree interessate. Per questo dispositivo, è circa un decimo del contenuto totale del flash.
  • Avevamo un dispositivo in cui era interessata solo una singola pagina.

È assolutamente plausibile che una condizione di sottotensione durante la scrittura della memoria flash possa danneggiare i contenuti flash. Tuttavia, ciò significherebbe che alcune istruzioni sensibili al flash devono essere eseguite.

Forse il controller si riavvia in modo casuale a causa di sottotensione e il codice del caricatore di avvio agisce in modo completamente imprevedibile durante questo periodo. Per citare un ragazzo di un altro forum in merito alla sottotensione:

"Non si tratta solo di istruzioni casuali dall'esecuzione di Flash, ma di un periodo di istruzioni casuali (non vi è alcuna garanzia che il codice da Flash venga letto e interpretato correttamente). Insieme a queste altre parti del MCU potrebbe non comportarsi come previsto, compresa la protezione meccanismi ".

Domande:
ritieni che il "comportamento casuale durante la sottotensione e l'esecuzione di alcune istruzioni che modificano i dati nelle pagine flash" - la spiegazione sia valida? In tal caso, perché non vediamo sempre questo tipo di errori solo come causa di alcuni problemi del software (overflow dello stack, puntatori non validi).

Hai altre idee su cosa potrebbe causare questo tipo di corruzione? Questo potrebbe essere causato da EMI / ESD?


Nel secondo blocco del tuo esempio, alcuni bit sono passati da 1-> 0 o tutti hanno tutte 0-> 1 transizioni? Ho uno script che calcola questo, ma non ho intenzione di digitare tutti i numeri dal tuo screenshot.
Markrages

@markrages: guardandolo, solo 0-> 1. Una risposta ha anche sottolineato che sembra una cancellazione parziale in cui non tutti i bit sono stati portati su 1. Grazie per l'osservazione.
Rev1.0

Risposte:


11

Dovresti notare che il flash non è scritto, è cancellato. Un flash cancellato è pieno di 0xFF. I tuoi primi 256 byte vengono completamente cancellati, la tua terza regione di 256 byte viene parzialmente cancellata (hai solo da 0 a 1 bit-bit dai dati corretti a uno danneggiato).

Secondo il foglio dati , questo flash è cancellabile da pagina (di solito lavoro con blocchi di cancellazione più grandi delle pagine). Come visto a pagina 282, Eseguire la cancellazione della pagina tramite SPM è abbastanza semplice.

Potresti essere interessato dalla sezione 23.8.1 (Prevenzione della corruzione del flash):

Un danneggiamento del programma Flash può essere causato da due situazioni in cui la tensione è troppo bassa. Innanzitutto, una sequenza di scrittura regolare su Flash richiede una tensione minima per funzionare correttamente. In secondo luogo, la CPU stessa può eseguire le istruzioni in modo errato, se la tensione di alimentazione per l'esecuzione delle istruzioni è troppo bassa. La corruzione Flash può essere facilmente evitata seguendo questi consigli di progettazione (uno è sufficiente):

  1. Se non è necessario un aggiornamento del boot loader nel sistema, programmare i bit di blocco del boot loader per impedire eventuali aggiornamenti del software del boot loader.
  2. Mantenere attivo AVR RESET (basso) durante periodi di tensione di alimentazione insufficiente.
    Questo può essere fatto abilitando il Brown-out Detector (BOD) interno se la tensione operativa corrisponde al livello di rilevamento. In caso contrario, è possibile utilizzare un circuito esterno di protezione con ripristino VCC basso. Se si verifica un ripristino mentre è in corso un'operazione di scrittura, l'operazione di scrittura verrà completata a condizione che la tensione di alimentazione sia sufficiente.
  3. Mantenere il core AVR in modalità di spegnimento spegnimento durante i periodi di VCC basso. Ciò impedirà alla CPU di tentare di decodificare ed eseguire le istruzioni, proteggendo efficacemente il registro SPMCSR e quindi Flash da scritture involontarie.

La tua osservazione sulla cancellazione parziale nella terza pagina sembra plausibile. Per quanto riguarda il testo Atmel: siamo tutti d'accordo sul fatto che BOD sembra essere obbligatorio. Ma non sono ancora sicuro della causa ESATTA della corruzione. Non è abbastanza improbabile che il controller esegua (a causa della bassa tensione) queste istruzioni specifiche per cancellare una pagina flash? Voglio dire, questo dovrebbe anche accadere durante l'esecuzione del codice del caricatore di avvio, poiché il flash è scrivibile solo da lì. E richiede una sequenza specifica.
Rev1.0

3
Non è possibile spiegare l'esatta fonte della corruzione: quando il tuo Vcc diminuisce, diventa troppo basso per saturare completamente un transistor con un altro. Un MCU è fondamentalmente un'equazione logica molto grande. Se i transistor smettono di comportarsi come interruttori logici, si modifica questa equazione. Poiché il primo transistor a comportarsi in modo errato dipende dal doping ASIC Wafer e dalle perturbazioni elettromagnetiche esterne, non è possibile prevedere cosa accadrà. Per risolvere questo problema, quando si progetta il proprio ASIC, è possibile aggiungere una parte analogica che disattiva la parte digitale prima di comportarsi in modo errato. Ma aumenta l'intero costo ASIC.
Jacen,

Confusione che la nota dell'applicazione AVR180 afferma che la protezione da brown-out esterna : "Notare che il contenuto della memoria del programma flash interno AVR® non è mai influenzato da una tensione di alimentazione insufficiente". Inoltre: "Poiché la CPU AVR non è in grado di scrivere nella propria memoria del programma, il contenuto della memoria del programma Flash interno non è mai influenzato da una mancanza di corrente". - IMO Atmel sta semplicemente ignorando che esiste qualcosa come i boot loader che DEVE cambiare la memoria flash.
Rev1.0

@ Rev1.0 Beh, sì, è abbastanza improbabile ... ecco perché lo vedi su un dispositivo ogni pochi mesi, piuttosto che su tutti i dispositivi per tutto il tempo.
user253751

"Voglio dire, questo dovrebbe anche accadere durante l'esecuzione del codice del caricatore di avvio, poiché il flash è scrivibile solo da lì." - È vero solo se i bit di blocco di avvio ( BLB01e gli amici) sono impostati correttamente! Sono loro? "Confusione ... nota applicativa ..." - Le note applicative sono notoriamente inaffidabili. Usali solo per ispirazione; per le garanzie, fare affidamento sui fogli dati (che non sono anche infallibili ma ehi).
marcelm,

4

Questo è un problema ben noto e colpisce molti microcontrollori (non solo Atmel). L'hardware di controllo della memoria flash corrompe o cancella parte della memoria in condizioni di bassa tensione. La soluzione semplice è abilitare la protezione brown-out.

Ovviamente dovresti sempre abilitare la protezione brown-out sui microcontrollori.


3
Avete riferimenti solidi su COME e PERCHÉ "l'hardware di controllo della memoria corrompe o cancella parte della memoria in condizioni di bassa tensione"? Ci sono molte discussioni sul forum riguardanti la corruzione flash ma non si riduce quasi mai a qualcosa di solido, motivo per cui ho chiesto qui.
Rev1.0

È un problema di sottotensione all'interno del chip o è correlato all'esecuzione errata / casuale del programma nella sezione bootloader che AFAIK può modificare solo FLASH. Se il secondo è un problema, disabilitare l'esecuzione del bootloader tramite FUSE dovrebbe risolvere il problema.
TMa,

Ricordo di averlo letto nell'errata di almeno un micro MEGA.
utente

3

La sottotensione è una causa molto probabile. Ad esempio, una volta ho avuto un progetto in cui un livello di blackout di 1,8 V causava spesso corruzione e queste corruzioni non potevano mai essere riprodotte con un livello di blackout di 3,5 V.

Si noti che più veloce è il processore, più sensibile è ai problemi di sottotensione. Se la riduzione della frequenza della CPU è un'opzione disponibile per te, potrebbe valere la pena provare.


1
Grazie per la risposta. Abbiamo finito per usare un rilevatore esterno a bassissima potenza e da allora non abbiamo più avuto problemi di corruzione.
Rev.1.0

0

EMC sarà il tuo più grande nemico, se non seguirai le regole principali della progettazione PCB. Ecco i più importanti della mia esperienza: - bloccare i condensatori su qualsiasi IC, indipendentemente da ciò che i produttori ti dicono nei loro fogli dati sugli schemi infernali, metterne almeno uno tra 100pF - 1nF sulle linee elettriche di ciascun IC - condurre aree di terra su ogni strato di PCB il più possibile. Tali aree devono essere contattate attraverso tutti gli strati tramite viali il più spesso possibile, una griglia di 50mil ha un buon valore. Collegare quelle aree al segnale di terra. - Non lasciare mai rame non collegato (flottante, senza segnale collegato) nel PCB. Agisce come un'antenna e inserisce in modo deviante le radiazioni elettromagnetiche sui dispositivi: traccia le tracce che trasportano i segnali dell'orologio il più corto possibile

Ulteriori dettagli sulle richieste dei motori di ricerca come "guida per la progettazione di circuiti stampati a prova di emc"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.