Ich muss im STM32 nicht flüchtige Daten ablegen. Jetzt habe ich mir die
AppNote EEPROM Emulation angeschaut, die für den Anfang ok ist, aber für
mein Vorhaben oversized ist. Flash hat 10K Schreibzyklen. Eine Page
besitzt 1024 Byte. Verstehe ich das richtig, wenn ich ein Byte schreiben
möchte eine Page komplett geschrieben werden muss? Da ergibt sich ja bei
10k Schreibzyklen 10000/1024 dass ich ca. 10 Mal die Page Byteweise (mit
allen 1024 Bytes) beschreiben kann, verstehe ich das richtig? Dass man
die Zahl der Schreibzyklen vergrößern kann, in dem man mehrere Pages
verwendet ist mir klar.
Artata schrieb:> Verstehe ich das richtig, wenn ich ein Byte schreiben> möchte eine Page komplett geschrieben werden muss?
Ja!
Wenn du byteweise schreiben willst und das häufig kommst Du um ein
EEPROM (oder ähnliches) nicht rundum. Kostet <1EUR und ist einfach an
I2C anzsuchließen.
rgds
Loeschen kannst Du nur seitenweise. Schreiben kannst Du byteweise. Du
kannst sogar mehrmals schreiben, vorrausgesetzt, das neue Wort muss
keine vorhandene 0 durch eine 1 ersetzten. Als ginge z.B. in mehreren
Schritten
0xff
0xfe
0xfc
0xf8
0x80
usw... zu schreiben.
Beim STM32L ist m.e.a. der Loeschwert 0, da muss man andersherum denken.
Ich möchte nicht häufig schreiben, darum gehts mir ja, aber 10 Mal
einzelne Bytes überschreiben zu können ist ja schon argh wenig. Ich
wollte nur wissen, ob ich das richtig überlegt habe. Mir ist auch klar,
wenn ich nciht alle 1024 Bytes schreiben, dass sich die Zahl der
Schreibzyklen erhöht.
mal was prinzipielles dazu:
EEPROM oder FLASH, also alles was mittels Floating Gate Information
speichert, altert nur, wenn sich die Ladung im Floating Gate ändert. Das
passiert praktisch nur wenn du die Speicherzelle mit einem anderen Wert
überschreibst, oder beim Flash wenn du Zellen, in welcher logisch Nullen
sind löscht. Nur dann tunneln Elektronen und beschädigen die Oxidschicht
(=Isoloation)
Wenn du jetzt immer nur ein Byte schreiben willst, hast du zwei
Möglichkeiten:
1) immer auf die gleiche Stellen schreiben, damit erzeugt jeder Vorgang
einen Schreibzyklus und du hast eine Obergrenze von 10k Schreibzyklen.
Wenn du mehrer Bytes, nicht immer gleichzeitig, schreibst entsprechend
weniger.
2) immer an eine andere Stelle schreiben und dazwischen das FALSH nicht
löschen. Damit musst man sich aber immer auch merken wo gerade der
aktuelle Wert steht. Das kann man jetzt beliebig trickreich machen. Wenn
die Werte immer ungleich 0xFF sind, geht das recht einfach, indem man
immer das erste 0xFF überschreibt und analog das Byte vor dem letzten
0xFF liest. So kann man den ganzen Sektor schreiben und erst wenn er
voll ist Löschen und hat damit einen Zyklus.
Wenn man Nutzdaten nicht von 0xFF unterscheiden kann, brauch man dirty
Bits, welche volle Stellen anzeigen, damit kann man mit einem Byte 8
weiter Bytes (oder Blöcke) markieren.
Dieses Spielchen kann man beliebig komplex machen bis man zu einem
Flashfilesystem kommt.
Artata schrieb:> Ich möchte nicht häufig schreiben, darum gehts mir ja, aber 10 Mal> einzelne Bytes überschreiben zu können ist ja schon argh wenig.
Die 10k Angabe bezieht sich auf Zyklen. Ein Zyklus besteht aus Löschen +
Schreiben.
Oder Löschen + Schreiben.
Oder Löschen + Schreiben + Schreiben.
Oder Löschen + Schreiben + Schreiben + Schreiben.
Oder Löschen + Schreiben + Schreiben + Schreiben + Schreiben.
Oder Löschen + Schreiben + Schreiben + Schreiben + Schreiben +
Schreiben.
Wobei das Schreiben natürlich nur in eine Richtung geht.
Uwe Bonnes schrieb:> Loeschen kannst Du nur seitenweise. Schreiben kannst Du byteweise. Du> kannst sogar mehrmals schreiben, vorrausgesetzt, das neue Wort muss> keine vorhandene 0 durch eine 1 ersetzten.
Hallo Uwe,
Danke für den Hinweis!
Löschen geht nur Seitenweise - korrekt!
Schreiben geht nur 16bit weise!
Und: das Schreiben MUSS aus dem RAM erfolgen da sonst der Bus stallt!
rgds
6A66 schrieb:> Schreiben geht nur 16bit wei
Haengt von der STM Familie ab.
6A66 schrieb:> Und: das Schreiben MUSS aus dem RAM erfolgen da sonst der Bus stallt!
Das geht aus aus dem Flash. Hauefig pollt man sowieso, bis das Schreiben
fertig ist, und wenn beim Pollen der Bus "stallt" solange geschrieben
wird, macht das nichts.
Uwe Bonnes schrieb:> Das geht aus aus dem Flash. Hauefig pollt man sowieso, bis das Schreiben> fertig ist, und wenn beim Pollen der Bus "stallt" solange geschrieben> wird, macht das nichts.
Hi Uwe,
hmmm, hast Dud as schon in der Praxis erprobt? Das wäre ja dann eine
durchaus erwägenswerte Alternative.
> Schreiben geht nur 16bit wei> Haengt von der STM Familie ab.
Hab die Doku jetzt nicht mehr offen. Zumindest bei der F10x dachte ich
dies als einheitlich gesehen zu haben
rgds
@ ttl: ich habe doch im ersten Beitrag geschrieben, dass die Appnote zu
oversized ist, weshalb ich die Routinen angespaßt an meine Anwendung
selbst schreiben möchte.
Ich habe es schon verstanden und meine Routinen sind soweit vertig. Für
die Nachwelt zusammengefaßt:
- Löschen geht nur Pageweise
- Schreiben geht 16-Bitweise
- um einzelne Werte zu überschreiben muss man den Pageinhalt sichern,
Page löschen, Wert im Buffer ändern und gebufferte Daten auf die
Pageadresse schreiben.
- Beim hantieren mit Bytes, kann man die Lebensdauer des Flash's
erhöhen, in dem man pro HalfWord nur ein Byte schreibt, damit verringert
sich die Kapazität des Speichers, da man jedes zweite Byte wegschmeißt.
So ergibt sich bei Medium Size Device eine Kapazität von 512 Bytes /
Page.
6A66 schrieb:> Hi Uwe,>> hmmm, hast Dud as schon in der Praxis erprobt? Das wäre ja dann eine> durchaus erwägenswerte Alternative.
Im der Blackmagic Debug Probe im USB Bootloader wird es fuer die F103
Bausteine so gemacht.