Forum: Mikrocontroller und Digitale Elektronik STM32 EEPROM Variable


von Uwe R. (grobbles)


Lesenswert?

Grüße

Ich habe ein Problem beim umstieg vom AVR auf STM32L152 Cortex-M3. Beim 
AVR kann man mit EEMEM eine Variable defienieren die im EEPROM liegt, 
welche beim flashen dan docht hin geschrieben wird. Da der STM32L152 
auch EEPROM beinhaltet muss das doch irgent wie bei diesem Controller 
Type gehen.

Ich kann aus dem laufendem Programm über eine FESTE Adresse den EEPROM 
lesen und schreiben. Nun will ich halt eine Variable defineieren.

Es würde mich freuen wenn mir jemand helfen kann, ich finde auch über 
google nichts im Netz.

von Arne Maximilian R. (arnemaximilian_r)


Lesenswert?

Moin moin,

als erstes solltest du in der Lib von ST nach dem Header für die Flash 
Funktionen suchen (sollte stm32l1xx_flash.h heißen). Dieser ermöglicht 
den Zugriff auf die Speicherzellen im Flash.
Die Aussage mit EEMEM und AVR ist nur teilweise richtig. Richtig ist, 
dass du dies nicht in deinem aktuellen Mikrocontroller hast. Jedoch ist 
es eine Besonderheit des Compilers und nicht jeder Compiler hat das 
(erste mal, dass ich davon was höre). Nun ist es abhängig von deinem 
aktuellen Compiler, wie du eine feste Adresse adressierst. Dies kann 
über statische Variablen geschehen oder indem du über den Linker und das 
Linkerskript festen Speicher reservierst.

von Uwe R. (grobbles)


Lesenswert?

Die Header ist auch schon eingebnden mit dieser schreibe und lese ich 
den EEPROM direkt über eine Adresse

   #define EEPROM_Adresse 0x08080000

Nun will ich halt dies über eine Variable machen, so das ich mich nicht 
mehr mit den Adressen herum ergern muss. Ich wollte die halt auch im 
Linker Skript definieren.

EEPROM (rx)     : ORIGIN = 0x08080000, LENGTH = 4K
und
     .eeprom :
  {
    . = ALIGN(4);
    *(.eeprom)
    . = ALIGN(4);
  } >EEPROM

und im Header dann
#define    EEMEM   _attribute_ ((section(".eeprom")))
EEMEM const uint8_t eepromArray[4095] ;

Aber wenn ich versuche dies dan zu flashen, kommt es zu einem absturz 
des ST-Link_gdb_server.exe

Aus spaß um die Syntax zuprüfen habe ich dann die Adresse auf
EEPROM (rx)     : ORIGIN = 0x08010000, LENGTH = 4K
geändert, so das der Code nicht im EEPROM landet sondern im Flash 
speicher. Dies lies sich auch dann übertragen.
Warum geht dies nicht im EEPROM?

von Arne Maximilian R. (arnemaximilian_r)


Lesenswert?

Ok, sorry, dass war mein Fehler. Der EEPROM Wird soweit ich das gerade 
verstehe extra angesprochen und adressiert. Er wird vermutlich nicht für 
das reguläre Programm oder den Linkprozess verwenden.
Du musst also entweder den Speicher über Pointer verwalten oder mit 
Speicher im Flash arbeiten, den du als Adressen definieren kannst. 
Soweit sehen deine Wege dafür richtig aus.

So es ist bei mir halb eins. Ich werde mir das morgen noch einmal 
anschauen aber wenn ich es gerade richtig sehen sind das deine Optionen.

von Uwe R. (grobbles)


Lesenswert?

Das Problem was ich habe ist halt, das ich für das Projekt 1K des EEPROM 
verwenden muss und soll, da sehr veile Parameter in den EEPROM 
geschrieben werden müssen. Der nutzer kann dan von ausßen über UART das 
Gerät sehr stark parametrieren. Dafür soll eine große Struct angelegt 
werden, worüber dan der zugrief erfolgt und man sich die Adressen holen 
kann.

Zudem hat der Flash nur eine begrenzt scheibzugriefe, nach diesen ist ja 
die ausfall Wahrscheinlichkeit sehr hoch, was beim EEPROM nicht der fall 
ist. Bei diesem leigen die maximalen Schreibzugriefe um den Faktor 10000 
höher.
Diese brauch ich auch.

Da wollte ich nicht für hunderte Variablen Adressen vergeben. Das muss 
doch auch indirekt gehen über Variablen.

Der EEPROM ist doch im selbem Adressraum wie der Flash und das auslesen 
funktioniert ja auch über einen Pointer.
Oder habe ich über den ST-Link keinen direkten zugrief auf den EEPROM, 
da dieser dann ja auch abstürzt. Muss dieser noch dafür irgent wie 
konfiguriert werden.

Wäre supper wenn es dafür neine Lösung gäbe.

Oder wie macht ihr das, wenn sehr viele Daten in den EEPROM geschrieben 
werden müssen.

von Jim M. (turboj)


Lesenswert?

Uwe Ro. schrieb:
> Oder habe ich über den ST-Link keinen direkten zugrief auf den EEPROM,
> da dieser dann ja auch abstürzt. Muss dieser noch dafür irgent wie
> konfiguriert werden.

Die meisten Programmier-Tools können nur den Flash beschreiben, nicht 
den EEPROM.

Was aber auch kein Beinbruch ist: Man reserviert sich ein 
Identifikationsword im EEPROM, und wenn das nicht den erwarteten Wert 
hat, dann initialisiert man das EEPROM mit den Default-Werten aus dem 
Flash.

Man könnte zwar auch eigene Tools zum Programmieren schreiben - der Weg 
dürfte aber ziemlich weit und steinig werden...

von Tipp (Gast)


Lesenswert?

Uwe Ro. schrieb:
> Das Problem was ich habe ist halt, das ich für das Projekt 1K des EEPROM
> verwenden muss und soll, da sehr veile Parameter in den EEPROM
> geschrieben werden müssen. Der nutzer kann dan von ausßen über UART das
> Gerät sehr stark parametrieren. Dafür soll eine große Struct angelegt
> werden, worüber dan der zugrief erfolgt und man sich die Adressen holen
> kann.
> Zudem hat der Flash nur eine begrenzt scheibzugriefe, nach diesen ist ja
> die ausfall Wahrscheinlichkeit sehr hoch, was beim EEPROM nicht der fall
> ist. Bei diesem leigen die maximalen Schreibzugriefe um den Faktor 10000
> höher.
> Diese brauch ich auch.
> Da wollte ich nicht für hunderte Variablen Adressen vergeben. Das muss
> doch auch indirekt gehen über Variablen.
> Der EEPROM ist doch im selbem Adressraum wie der Flash und das auslesen
> funktioniert ja auch über einen Pointer.
> Oder habe ich über den ST-Link keinen direkten zugrief auf den EEPROM,
> da dieser dann ja auch abstürzt. Muss dieser noch dafür irgent wie
> konfiguriert werden.

> Wäre supper wenn es dafür neine Lösung gäbe.


veile Parameter für den nutzer von ausßen im zugrief mit eine begrenzt 
scheibzugriefe brauch ich irgent wie auch, Wäre supper.!

von Uwe R. (grobbles)


Lesenswert?

Jim Meba schrieb:
> Was aber auch kein Beinbruch ist: Man reserviert sich ein
> Identifikationsword im EEPROM, und wenn das nicht den erwarteten Wert
> hat, dann initialisiert man das EEPROM mit den Default-Werten aus dem
> Flash.

Die Idee ist nicht schlecht, kann man machen, wenn man das Gerät auf 
Default zurücksetzen muss. Aber wenn der Nutzter werte ändert, müssen 
diese dann ja an die richtig EEPROM Adresse geschrieben werden und diese 
wollte ich über eine Variable (Struct) oranisieren, die mir die Adresse 
dan liefert.

Kann man vielleicht die im Flash liegende Variable (Struct) als 
ausgangspunkt nutzen und einen Offset Wert für die Adresse diffinieren, 
das man somit in den EEPROM landet?

Müsste doch auber auch einfacher gehen ohne Speicher im Flash 
zuverbrauchen.

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.