Hallo, nach meine Beobachtungen haben gelöschte Flash Seiten den Wert "0" in den einzelnen Bytes. Aber in welchen ST Dokument ist das dokumentiert? Bin für Hinweise dankbar!
Gute Frage... Üblich ist bei Flashbit ja 1, nicht 0. Aber beim querlesen habe ich das auch nirgends explizit erwähnt gefunden. Allerdings steht drin, dass man programmierte Zellen genau und nur mit 0x0000 überbraten kann. Daraus kann man schliessen, dass es wie üblich gelöscht auf 0xFFFF steht. Auch der Code der AN für EEPROM Emulation geht davon aus, dass gelöschte Bits auf 1 stehen.
Bei diesem Chip wird Flash untypischerweise nach 0 gelöscht, steht auch so in der Flash Programming AN.
In der AN2594 steht jedenfalls: #define ERASED ((uint16_t)0xFFFF) /* PAGE is empty
AN2594 bezieht sich auf die EEPROM Emulation in ST32F Bausteinen, und #define ERASED ((uint16_t)0xFFFF) /* PAGE is empty bezieht sich auf den Rückgabewert einer dieser Emulationsroutinen. Aber das definiert nicht den Wert gelöschten Flash Zellen.
In der AN selbst wird der Inhalt gelöschter Zellen als FF gezeigt. Im Code wird der Makro ERASE für gelöschte Pages verwendet, und zwar direkt als Vergleichswert mit dem Inhalt vom Flash, nicht über ein API-Mapping. Der Code der AN nutzt dem Umstand, dass gelöschte Zellen auf 0xFFFF stehen und nacheinander auf 0xEEEE und danach 0x0000 programmiert werden.
Uwe Bonnes schrieb: > bezieht sich auf den Rückgabewert einer dieser Emulationsroutinen. Aber > das definiert nicht den Wert gelöschten Flash Zellen. Geraten oder gewusst? Zur Ästhetik von STs Beispielcode gehört auch, dass der Programmierer wenig Sinn für saubere Trennung von Interfacedefinition und Implementierung hat und gefährlich unspezifische Namen wie ERASED für interne Zustände verwendet, sie aber ohne Schutz ins globale Include-File reinpinnt. Statt sie wie es sich gehört nur in die Implementierung zu schreiben. Diese 3 Namen stehen für das erste 16-Bit Wort einer Flash-Page, das den Blockzustand kennzeichnet. Sie werden ausserhalb der EE_xxx Funktionen nicht verwendet, auch nicht als Return-Wert:
1 | /* Page status definitions */
|
2 | #define ERASED ((uint16_t)0xFFFF) /* PAGE is empty */ |
3 | #define RECEIVE_DATA ((uint16_t)0xEEEE) /* PAGE is marked to receive data */ |
4 | #define VALID_PAGE ((uint16_t)0x0000) /* PAGE containing valid data */ |
Argh: STM32L hat 0 als gelöschten Zustand, STM32F1/F4 0xff. Fuer F2 muss ich noch testen...
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.