Forum: Mikrocontroller und Digitale Elektronik stm32 in den Flash byteweise schreiben


von Artata (Gast)


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.

von 6A66 (Gast)


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

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


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.

von Artata (Gast)


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.

von Thomas (Gast)


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.

von Der (Gast)


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.

von 6A66 (Gast)


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

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

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.

von 6A66 (Gast)


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

von ttl (Gast)


Lesenswert?

benutze doch die Eeprom Emulation aus den Beispielen von STM, geht 
problemlos damit.

von Artata (Gast)


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.

von Uwe Bonnes (Gast)


Lesenswert?

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.

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.