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.
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.
Es gibt dazu von ST eine Application Note: AN2594 - EEPROM Emulation Die ist zwar für STM32F1xx, das Prinzip funktioniert aber genauso mit STM32F0xx.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.