stm32 in den Flash byteweise schreiben

Gast #3164746
Lesenswert?

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.
Gast #3164758
Lesenswert?

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
(Firma: TU Darmstadt) #3164767
Lesenswert?

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.
Gast #3164768
Lesenswert?

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.
Gast #3164780
Lesenswert?

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.
Gast #3164797
Lesenswert?

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.
Gast #3164800
Lesenswert?

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
Gast #3165066
Lesenswert?

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
Gast #3166554
Lesenswert?

@ 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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren