Flash-Speicher beschreiben mit Microcontroller...

C

Carla Schneider

Guest
https://www.makermatrix.com/blog/read-and-write-data-with-the-pi-pico-onboard-flash/

-------
There are two functions in the Pi Pico SDK used to write into the flash:

flash_range_erase(uint32_t flash_offs, size_t count);
flash_range_program(uint32_t flash_offs, const uint8_t *data, size_t count);


The flash_range_erase() function resets count bytes of flash (which needs to be a multiple
of the sector size, 4096) beginning at address flash_offs, to 0xFF (all ones). This task
appears to be the failure mode of flash when it wears out, as some of the bits won\'t be
flipped from zero back to one. Thus, you want to do this as infrequently as possible on
each sector, to avoid wearing the media out. Once you have one or more sectors in this
known state, use the flash_range_program() function to program one or more 256-byte pages
(stored in *data) to the count bytes beginning at address flash_offs. Remember that in
this case count needs to be a multiple of FLASH_PAGE_SIZE (256). It will then flip some
of the bits to zeroes, in order to program one or more pages of flash to the values stored
in *data. In my case I want to write one 32-bit integer to the first four bytes of the first
page of the last sector:

-------

Und dann braucht er fuer seinen Zweck jeweils eine Page um eine 4Byte Zahl zu speichern.
Die Frage ist ob man eine Page nicht mehrmals programmieren kann ohne sie zu loeschen,
Die Bytes die unprogrammiert bleiben sollen setzt man auf 0xFF und die bereits programmierten Bytes
setzt
man auf den Wert den sie bereits haben. Dann koennte man die Zahlen hintereinander in die
Page setzen, und haette auch keinen abnutzung, denn die kommt ja nur durchs Loeschen,
nicht durchs Programmieren...

Der Zweck waere ein Datenlogger der regelmaessig eingeschaltet wird, dann Temperatur, Luftfeuchte
usw. misst
diese in den Flash schreibt und dann wieder abschaltet, ohne dass man noch einen weiteren
Speicher braucht. Man wuerde sich also ein 256Byte batteriegepuffertes RAM sparen in das
man die Daten schreibt bis es voll ist, und das dann auf eine Page im Flash.


In jedem Fall wuerde ich mir solche Funktionen auch fuer SD-Karten wuenschen,
aber da verstecken die sich in der Firmware der Karte und man kennt noch nichtmal sector size und
page size.
 
Am 22.09.23 um 16:05 schrieb Carla Schneider:
Und dann braucht er fuer seinen Zweck jeweils eine Page um eine 4Byte Zahl zu speichern.
Die Frage ist ob man eine Page nicht mehrmals programmieren kann ohne sie zu loeschen,

Theoretisch ja, praktisch eher nein.

Die Bytes die unprogrammiert bleiben sollen setzt man auf 0xFF und die bereits programmierten Bytes
setzt
man auf den Wert den sie bereits haben. Dann koennte man die Zahlen hintereinander in die
Page setzen, und haette auch keinen abnutzung, denn die kommt ja nur durchs Loeschen,
nicht durchs Programmieren...

Das Problem sind die Multi-Level Cell und Fehlerkorrekturinformationen.
Mindestens letztere ändern sich natürlich jedes mal.

Der Zweck waere ein Datenlogger der regelmaessig eingeschaltet wird, dann Temperatur, Luftfeuchte
usw. misst
diese in den Flash schreibt und dann wieder abschaltet, ohne dass man noch einen weiteren
Speicher braucht. Man wuerde sich also ein 256Byte batteriegepuffertes RAM sparen in das
man die Daten schreibt bis es voll ist, und das dann auf eine Page im Flash.

Oder ein kleines serielles EEProm. Die sind auch hart im nehmen und
brauchen keine Batterie.

In jedem Fall wuerde ich mir solche Funktionen auch fuer SD-Karten wuenschen,
aber da verstecken die sich in der Firmware der Karte und man kennt noch nichtmal sector size und
page size.

Wie gesagt, der interne Controller kann ja alles mögliche mit den Daten
machen. Er könnte gar versuchen, sie zu komprimieren.


Marcel
 
On 9/22/23 16:40, Marcel Mueller wrote:
Am 22.09.23 um 16:05 schrieb Carla Schneider:
Und dann braucht er fuer seinen Zweck jeweils eine Page um eine 4Byte
Zahl zu speichern.
Die Frage ist ob man eine Page nicht mehrmals programmieren kann ohne
sie zu loeschen,

Theoretisch ja, praktisch eher nein.

Die Bytes die unprogrammiert bleiben sollen setzt man auf 0xFF und die
bereits programmierten Bytes
setzt
man auf den Wert den sie bereits haben. Dann koennte man die Zahlen
hintereinander in die
Page setzen, und haette auch keinen abnutzung, denn die kommt ja nur
durchs Loeschen,
nicht durchs Programmieren...

Das Problem sind die Multi-Level Cell und Fehlerkorrekturinformationen.
Mindestens letztere ändern sich natürlich jedes mal.

Der Zweck  waere ein Datenlogger der regelmaessig eingeschaltet wird,
dann Temperatur, Luftfeuchte
usw. misst
diese in den Flash schreibt und dann wieder abschaltet, ohne dass man
noch einen weiteren
Speicher braucht. Man wuerde sich also ein 256Byte batteriegepuffertes
RAM sparen in das
man die Daten schreibt bis es voll ist, und das dann auf eine Page im
Flash.

Oder ein kleines serielles EEProm. Die sind auch hart im nehmen und
brauchen keine Batterie.

Ja, die gibts inzwischen bis 4MBit, also 512 KB mit SPI. 25CSM04 von
Microchip. Da kann man sich das Flash schon fast sparen, abhängig von
der Datenmenge die man loggen will.

Gerrit
 
Gerrit Heitsch wrote:
On 9/22/23 16:40, Marcel Mueller wrote:
Am 22.09.23 um 16:05 schrieb Carla Schneider:
Und dann braucht er fuer seinen Zweck jeweils eine Page um eine 4Byte
Zahl zu speichern.
Die Frage ist ob man eine Page nicht mehrmals programmieren kann ohne
sie zu loeschen,

Theoretisch ja, praktisch eher nein.

Die Bytes die unprogrammiert bleiben sollen setzt man auf 0xFF und die
bereits programmierten Bytes
setzt
man auf den Wert den sie bereits haben. Dann koennte man die Zahlen
hintereinander in die
Page setzen, und haette auch keinen abnutzung, denn die kommt ja nur
durchs Loeschen,
nicht durchs Programmieren...

Das Problem sind die Multi-Level Cell und Fehlerkorrekturinformationen.
Mindestens letztere ändern sich natürlich jedes mal.

Der Zweck  waere ein Datenlogger der regelmaessig eingeschaltet wird,
dann Temperatur, Luftfeuchte
usw. misst
diese in den Flash schreibt und dann wieder abschaltet, ohne dass man
noch einen weiteren
Speicher braucht. Man wuerde sich also ein 256Byte batteriegepuffertes
RAM sparen in das
man die Daten schreibt bis es voll ist, und das dann auf eine Page im
Flash.

Oder ein kleines serielles EEProm. Die sind auch hart im nehmen und
brauchen keine Batterie.

Ja, die gibts inzwischen bis 4MBit, also 512 KB mit SPI. 25CSM04 von
Microchip. Da kann man sich das Flash schon fast sparen, abhängig von
der Datenmenge die man loggen will.

Das Flash hat den Vorteil dass es bereits im Raspberry Pi pico eingebaut ist.





 
Am 22.09.2023 um 17:34 schrieb Carla Schneider:
Gerrit Heitsch wrote:

On 9/22/23 16:40, Marcel Mueller wrote:
Am 22.09.23 um 16:05 schrieb Carla Schneider:
Und dann braucht er fuer seinen Zweck jeweils eine Page um eine 4Byte
Zahl zu speichern.
Die Frage ist ob man eine Page nicht mehrmals programmieren kann ohne
sie zu loeschen,

Theoretisch ja, praktisch eher nein.

Die Bytes die unprogrammiert bleiben sollen setzt man auf 0xFF und die
bereits programmierten Bytes
setzt
man auf den Wert den sie bereits haben. Dann koennte man die Zahlen
hintereinander in die
Page setzen, und haette auch keinen abnutzung, denn die kommt ja nur
durchs Loeschen,
nicht durchs Programmieren...

Das Problem sind die Multi-Level Cell und Fehlerkorrekturinformationen.
Mindestens letztere ändern sich natürlich jedes mal.

Der Zweck  waere ein Datenlogger der regelmaessig eingeschaltet wird,
dann Temperatur, Luftfeuchte
usw. misst
diese in den Flash schreibt und dann wieder abschaltet, ohne dass man
noch einen weiteren
Speicher braucht. Man wuerde sich also ein 256Byte batteriegepuffertes
RAM sparen in das
man die Daten schreibt bis es voll ist, und das dann auf eine Page im
Flash.

Oder ein kleines serielles EEProm. Die sind auch hart im nehmen und
brauchen keine Batterie.

Ja, die gibts inzwischen bis 4MBit, also 512 KB mit SPI. 25CSM04 von
Microchip. Da kann man sich das Flash schon fast sparen, abhängig von
der Datenmenge die man loggen will.

Das Flash hat den Vorteil dass es bereits im Raspberry Pi pico eingebaut ist.

Bei STM-Controllern habe ich das schon öfter gemacht, sogar bitweise als
Betriebsstundenzähler. Funktioniert prima. Bei den Typen mit ECC geht\'s
bei 64-Bit Speicher leider nur 8-Byte-Weise.

Gruß Andreas
 
On 2023-09-22, Carla Schneider <carla_schn@proton.me> wrote:
-------

Und dann braucht er fuer seinen Zweck jeweils eine Page um eine 4Byte Zahl zu speichern.
Die Frage ist ob man eine Page nicht mehrmals programmieren kann ohne sie zu loeschen,
Die Bytes die unprogrammiert bleiben sollen setzt man auf 0xFF und die bereits programmierten Bytes
setzt
man auf den Wert den sie bereits haben. Dann koennte man die Zahlen hintereinander in die
Page setzen, und haette auch keinen abnutzung, denn die kommt ja nur durchs Loeschen,
nicht durchs Programmieren...

Korrekt, bei NOR-Flash geht das so. Entweder, man hat Versionszähler an den
Daten, so daß man erkennen kann, welches die neueste Version ist. Oder man
überschreibt die alten, ungültigen Daten mit 0x00 und schreibt die neuen
Daten in den ersten freien Bereich dahinter. Wenn Du mehr als einen
Datenblock hast, wirst Du mindestens 2 Flash-Pages brauchen, damit Du eine
davon löschen kannst, ohne alle Daten zu verlieren.

Alternativ könntest Du fertigen Code nehmen, der das bereits kann, z.B.
spiffs:

https://github.com/pellepl/spiffs

cu
Michael
--
Some people have no respect of age unless it is bottled.
 
On 9/22/23 5:34 PM, Carla Schneider wrote:

> Das Flash hat den Vorteil dass es bereits im Raspberry Pi pico eingebaut ist.

Wo ist das ein Vorteil, wenn Du Bedenken wegen des mehrfachen
Überschreibens hast? Ist der Flash ausreichend geschädigt, ist der ganze
Controller Schrott :-(

DoDi
 
On 9/23/23 01:56, Hans-Peter Diettrich wrote:
On 9/22/23 5:34 PM, Carla Schneider wrote:

Das Flash hat den Vorteil  dass es bereits im Raspberry Pi pico
eingebaut ist.

Wo ist das ein Vorteil, wenn Du Bedenken wegen des mehrfachen
Überschreibens hast? Ist der Flash ausreichend geschädigt, ist der ganze
Controller Schrott :-(

Hingegen kann man ein externes SPI-EEPROM in einen Sockel stecken und
bei Bedarf tauschen.

Gerrit
 
On 9/23/23 8:00 AM, Gerrit Heitsch wrote:
On 9/23/23 01:56, Hans-Peter Diettrich wrote:
On 9/22/23 5:34 PM, Carla Schneider wrote:

Das Flash hat den Vorteil  dass es bereits im Raspberry Pi pico
eingebaut ist.

Wo ist das ein Vorteil, wenn Du Bedenken wegen des mehrfachen
Überschreibens hast? Ist der Flash ausreichend geschädigt, ist der
ganze Controller Schrott :-(

Hingegen kann man ein externes SPI-EEPROM in einen Sockel stecken und
bei Bedarf tauschen.

Kann dann ggf. sogar zum Datenaustausch benutzt werden...

Im Arduino Forum wird auch FRAM empfohlen, mit fast unbeschränktem
Überschreiben. Kernspeicher rulez?

DoDi
 
Hans-Peter Diettrich wrote:
On 9/22/23 5:34 PM, Carla Schneider wrote:

Das Flash hat den Vorteil dass es bereits im Raspberry Pi pico eingebaut ist.

Wo ist das ein Vorteil, wenn Du Bedenken wegen des mehrfachen
Überschreibens hast?

Der Vorteil ist weniger Arbeit wenn man mehrere von den Dinger zusammenbasteln
will.
Die Bedenken sind ja nicht das Problem, sondern die tatsaechlichen Eigenschaften
des Geraets.

Ist der Flash ausreichend geschädigt, ist der ganze
Controller Schrott :-(

Nicht der ganze Controller ich brauche nur einen Teil des Flashs
zum Datenloggen.

Ich habe da GPS Logger, gekauft vor 10 Jahren deren Memory war schon 3 Jahre
nach dem Kauf nicht mehr funktionfaehig. Und mehr als 200 Stunden haben die pro
Jahr nicht geloggt.
Die waren etwa 10 mal teuer wie ein Raspberry Pi Pico, der eine taugt noch als GPS-Maus
der andere geht gar nicht mehr.
 
On 9/23/23 11:27, Hans-Peter Diettrich wrote:
On 9/23/23 8:00 AM, Gerrit Heitsch wrote:
On 9/23/23 01:56, Hans-Peter Diettrich wrote:
On 9/22/23 5:34 PM, Carla Schneider wrote:

Das Flash hat den Vorteil  dass es bereits im Raspberry Pi pico
eingebaut ist.

Wo ist das ein Vorteil, wenn Du Bedenken wegen des mehrfachen
Überschreibens hast? Ist der Flash ausreichend geschädigt, ist der
ganze Controller Schrott :-(

Hingegen kann man ein externes SPI-EEPROM in einen Sockel stecken und
bei Bedarf tauschen.

Kann dann ggf. sogar zum Datenaustausch benutzt werden...

Im Arduino Forum wird auch FRAM empfohlen, mit fast unbeschränktem
Überschreiben. Kernspeicher rulez?

Letzteren muss man heutzutage aber selber stricken.

Gerrit
 

Welcome to EDABoard.com

Sponsor

Back
Top