Forum: Mikrocontroller und Digitale Elektronik Flash als EEPROM nutzen bei einem STM32F030


von ElektronenNichtVersteher (Gast)


Lesenswert?

Hallo,

ich habe für den den STM32F030 mehrere Routinen gefunden, die den Flash 
wie ein EEPROM benutzen. Dabei wird immer eine komplette Page neu 
geschrieben, selbst wenn nur 1 Bit in den Daten geändert wurde. Kann man 
bei den ST-Mikrocontrollern den Flash grundsätzlich nur pageweise 
beschreiben oder kann man z.B. auch einzelne 16- oder 32-Bit Werte 
ablegen ohne dass man ein gesamtes Page buffern und dann neu schreiben 
muss (kostet halt ziemlich viel RAM)?

Im Datenblatt habe ich zwar nachgeschaut, werde aber nicht wirklich 
schlau daraus.

von Clemens L. (c_l)


Lesenswert?

Das Reference Manual sagt:
> The main Flash memory can be programmed 16 bits at a time. [...]
> The Flash memory interface preliminarily reads the value at the
> addressed main Flash memory location and checks that it has been
> erased. If not, the program operation is skipped and a warning is
> issued by the PGERR bit in FLASH_SR register. The only exception to
> this is when 0x0000 is programmed. In this case, the location is
> correctly programmed to 0x0000 and the PGERR bit is not set.
> [...]
> The Flash memory can be erased page by page or completely (Mass Erase).

Um also das ständige Löschen zu vermeiden, müsstest du dir einen 
Wear-Leveling-Algorithmus ausdenken.

von Thomas E. (picalic)


Lesenswert?

Es gibt dazu von ST eine Application Note: AN2594 - EEPROM Emulation
Die ist zwar für STM32F1xx, das Prinzip funktioniert aber genauso mit 
STM32F0xx.

von Dfwkgf (Gast)


Lesenswert?

Application Note 4061 von ST beschreibt die EEPROM Emulation für STM32F0 
Chips. Läuft mit der alten Standard Lib, nicht der HAL (Anpassungen 
nötig).

Zu der AppNote gibt es auch ein schönes Code-Beispiel.

von Bernd K. (prof7bit)


Lesenswert?

Du kannst schreiben an den Stellen die (noch) auf 0xff stehen, und zwar 
auch in sehr kleinen Happen. Z.B. je nach Controller musst Du als 
kleinste Einheit immer 4 Byte auf einmal oder manchmal auch 8 Byte auf 
einmal schreiben, eventuell vielleicht (wie gesagt je nach Controller) 
gehen sogar einzelne Bytes wenn Du Glück hast (im Reference Manual 
nachlesen).

Das heißt Du könntest wenn Du noch massenhaft unbenutztes Fash hast (was 
sehr wahrscheinlich der Fall sein wird bei den heutzutage üblichen 
geradezu obszön verschwenderisch überdimensionierten Flash-Speichern im 
teilweise sogar dreistelligen Kilobyte-Bereich) ein simples 
wear-leveling implementieren das Deine Nutzdaten bei jedem 
Schreibvorgang an die nächste freie Stelle schreibt und erst dann 
anfangen muss hin und wieder mal eine Page zu löschen wenn wirklich 
alles bis zum Rand voll ist.

von Little B. (lil-b)


Lesenswert?

Ich behaupte, dass sich jede Flash-EEPROM-Emulation auf jedem Controller 
implementieren lässt. Es muss immer nur der Flash Treiber angepasst 
werden.

Wie oben schon genannt kann dein chip nur 16bit wörter schreiben. Keine 
8bit, keine 32bit, der Versuch führt zu Fehlern.

Wenn du dann einen Flash-Treiber hast, der Array x an Adresse y 
schreiben kann, dann ist der Rest nur noch Abschreiben und Fleißarbeit

von Dennis (Gast)


Lesenswert?

Little B. schrieb:
> Ich behaupte, dass sich jede Flash-EEPROM-Emulation auf jedem Controller
> implementieren lässt. Es muss immer nur der Flash Treiber angepasst
> werden.
>
> Wie oben schon genannt kann dein chip nur 16bit wörter schreiben. Keine
> 8bit, keine 32bit, der Versuch führt zu Fehlern.
>
> Wenn du dann einen Flash-Treiber hast, der Array x an Adresse y
> schreiben kann, dann ist der Rest nur noch Abschreiben und Fleißarbeit

Aber die Frage hast du schon verstanden, oder???

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.