Forum: Mikrocontroller und Digitale Elektronik ARM Cortex M3 STM32F107 Daten in den Flash


von Neueinsteiger (Gast)


Lesenswert?

Hallo

ich programmiere seit neustem mit KEIL uVision 4 den STM32F107VCT6.

In meinem Programm habe ich verschiedene Variablen, denen ich beim Start 
Werte zuweisen möchte. Diese Werte möchte ich im Flash beim Übertragen 
des Programms auf den Controller abspeichern. Die Werte müssen in den 
Flash, weil sie auch nach dem Ein- und Ausschalten des Controllers 
erhalten bleiben sollen. Außerdem müssen die Werte solange das Programm 
läuft geändert werden können.

Mein Problem ist, dass ich nicht weiß, was ich in C schreiben muss. 
Wichtig ist, dass beim Programmstart nicht jedes Mal die vordefinierten 
Werte wieder geschrieben werden, sondern eben nur beim Laden des 
Programms vom PC auf den Controller.

Brauche dringend Hilfe!

von Matthias K. (matthiask)


Lesenswert?

Deine Fragestellung lässt vermuten, dass der STM32 ein Nummer zu groß 
für Dich ist. Das sind absolute C-Grundlagen. Besorge Dir ein C Buch und 
installiert auf dem PC einen Compiler zum üben. Dann erst ran an den 
STM32..

Ansonsten ist const vermutlich das was Du suchst!
1
const short int bild1_bmp[] = {0xF244,0x2A43,0x42C4}; // 16 Bit Daten Array
2
const char lcd_txt1[] = "14.07.2011"; // String Array
3
const char *wochentage_TXT[] = { // Zeigerfeld
4
  /* 0 */ "Montag    ",
5
  /* 1 */ "Dienstag  ",
6
  /* 2 */ "Mittwoch  ",
7
  /* 3 */ "Donnerstag",
8
  /* 4 */ "Freitag   ",
9
  /* 5 */ "Samstag   ",
10
  /* 6 */ "Sonntag   "};

von Stefan (Gast)


Lesenswert?

Von ST gibt es eine Lib, die ein Pseudo-EEPROM im Flash einrichtet. Ich 
denke, das ist genau, was Du brauchst.

Gruß, Stefan

von Neueinsteiger (Gast)


Lesenswert?

Mag sein, oder mein Problem wurde nicht richtig verstanden.

Wenn ich mit const ein Array anlege, werden die Daten im Flash 
gespeichert, richtig?
Wie kann ich die Daten dann in meinem Programm ändern?
Die geänderten Daten sollen ja auch erhalten sein, wenn der Controller 
zwischendruch stromlos ist.

von Neueinsteiger (Gast)


Lesenswert?

Stefan schrieb:
> Von ST gibt es eine Lib, die ein Pseudo-EEPROM im Flash einrichtet. Ich
>
> denke, das ist genau, was Du brauchst.

Hallo Stefan,

davon habe ich gelesen, aber nicht gefunden.
Hast du einen konkreten Link?

von Matthias K. (matthiask)


Lesenswert?

Neueinsteiger schrieb:
> Wenn ich mit const ein Array anlege, werden die Daten im Flash
> gespeichert, richtig?

Ja, sofern auch alles in den Flash gelinkt wird. Ändern während der 
Laufzeit geht nicht oder nur schwierig.

Bleibt noch der Weg von Stefan, einzelne Flash-Bereiche kann man auch 
während der Laufzeit ändern. Ist aber kein Anfängerthema.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Den Flash kann man auch nicht unendlich Löschen/wieder beschreiben.
Besser ein externes EEPROM verwenden. Einen in DIP8 mit Fassung kann man 
zur Not auch mal auf ein neues Board drauf stecken wenn das mal 
abfackelt.

von Neueinsteiger (Gast)


Lesenswert?

Matthias K. schrieb:
> Bleibt noch der Weg von Stefan, einzelne Flash-Bereiche kann man auch
>
> während der Laufzeit ändern. Ist aber kein Anfängerthema.

Ich weiß, dass es kein Anfängerthema ist, deshalb habe ich mich an 
dieses Forum gewendet.
Das mit mit EEPROM hört sich gut an.
Kann mir jemand sagen wie das geht?

von 900ss (900ss)


Lesenswert?

Das erledigt doch alles der Compiler und Linker für dich. Du brauchst 
doch garnichts dafür tun außer den Variablen im Programm direkt 
Initialisierungswerte zuweisen.

Beispiel:
1
uint32_t var1 = 123;
2
char meinText[] = "Ich bin ein String";
3
4
int main( void )
5
{
6
  printf("var1=%d, meinText=%s\n", var1, meinText);  // ergibt "var1=123, meinText="Ich bin ein String"
7
8
  var1 += 100;
9
  strcpy(meinText,"Hallo");
10
  printf("var1=%d, meinText=%s\n", var1, meinText);  // ergibt "var1=223, meinText="Hallo"
11
12
}

Fertig. Der Startupcode kopiert die Initialisierungswerte beim 
Programmstart in die Variablen. Danach kannst du diese ändern. Die 
Änderungen bleiben bei Power-Off natürlich nicht erhalten.

Du brauchst keine EEProm Simulation oder sonst was dafür. Ist alles da, 
was du brauchst.

Wenn du natürlich die Änderungen auch erhalten willst, dann ist das was 
anderes.

von (prx) A. K. (prx)


Lesenswert?

900ss D. schrieb:

> Das erledigt doch alles der Compiler und Linker für dich. Du brauchst
> doch garnichts dafür tun außer den Variablen im Programm direkt
> Initialisierungswerte zuweisen.

Sachte. Er will sie zur Laufzeit ändern können. Das ist mitnichten 
trivial.

von (prx) A. K. (prx)


Lesenswert?

Neueinsteiger schrieb:

> Brauche dringend Hilfe!

Es gibt von ST eine Appnote dafür, wie man veränderliche Daten im Flash 
unterbringen kann.

von Neueinsteiger (Gast)


Lesenswert?

900ss D. schrieb:
> Wenn du natürlich die Änderungen auch erhalten willst, dann ist das was
>
> anderes.

Hab ich doch geschrieben...

von 900ss (900ss)


Lesenswert?

A. K. schrieb:
> Sachte. Er will sie zur Laufzeit ändern können. Das ist mitnichten
> trivial.

Ich hab es nicht so verstanden, dass er die Initialisierungswerte 
während der Laufzeit verändern will, sondern nur die Inhalte der 
Variablen.

Ansonsten ist mitnichten trivial, da hast du Recht.

von 900ss (900ss)


Lesenswert?

Neueinsteiger schrieb:
> 900ss D. schrieb:
>> Wenn du natürlich die Änderungen auch erhalten willst, dann ist das was
>>
>> anderes.
>
> Hab ich doch geschrieben...

Hab dich da irgendwie nicht richtig verstanden. Wenn es nur ein paar 
Werte sind, kannst du die auch in das Batterie gepufferte Backup RAM 
schreiben. Dann brauchst du allerdings auch eine kleine Knopfzelle zum 
puffern.

Da wäre sonst tatsächlich die schon erwähnte EEPROM-Simulation das Beste 
denke ich.

von Neueinsteiger (Gast)


Lesenswert?

A. K. schrieb:
> Es gibt von ST eine Appnote dafür, wie man veränderliche Daten im Flash
>
> unterbringen kann.

Wo genau kann ich das finden?
Wie funktioniert es?

von 900ss (900ss)


Lesenswert?


von ♪Geist (Gast)


Lesenswert?

>das mit mit EEPROM hört sich gut an.
>Kann mir jemand sagen wie das geht?

Das hat man dir bereits gesagt: AppNote suchen, bzw. code gibt es hier:
http://svnmios.midibox.org/listing.php?repname=svn.mios32&path=%2Ftrunk%2Fmodules%2Feeprom%2F

Aber wie ein Vorredner meinte, das ist ncihts für Anfänger und außerdem 
sidn die schreibzyclen liminiert. Am einfachsten ist, du nimmst einen 
SPI EEPROM.

von Neueinsteiger (Gast)


Lesenswert?

So, ich denke, jetzt haben alle mein Problem verstanden.
Es handelt sich also nicht um ein Anfängerproblem. Schön, dass wir das 
geklärt haben!

Es sind nicht gerade wenig Daten, deshalb kommt das Backup-RAM nicht in 
Frage, habe ich alles schon gecheckt.

Kann mir jetzt bitte jemand ernsthaft mit dem EEPROM-Emulation helfen?

von 900ss (900ss)


Lesenswert?

Neueinsteiger schrieb:
> Kann mir jetzt bitte jemand ernsthaft mit dem EEPROM-Emulation helfen?

??? Ist doch passiert.

Beitrag "Re: ARM Cortex M3 STM32F107 Daten in den Flash"

von (prx) A. K. (prx)


Lesenswert?


von 900ss (900ss)


Lesenswert?


von Neueinsteiger (Gast)


Lesenswert?

A. K. schrieb:
> http://www.st.com/internet/com/TECHNICAL_RESOURCES...
>
> http://www.st.com/internet/com/SOFTWARE_RESOURCES/...

Vielen Dank,
die pdf hatte ich schon gelesen, nur das Programm nicht gefunden.

von (prx) A. K. (prx)


Lesenswert?

Appnotes nicht über das Modell vom Controller suchen. Da kommt nur ein 
Subset der ANs. Gleich im Einstieg bei den STM32 unter Resources, da 
kommen alle 58 und da kommt auch die Software.

von Neueinsteiger (Gast)


Lesenswert?

Jetzt bleibt noch die Frage:
Wie bekomme ich die Daten am Anfang in den simulierten EEPROM.

Ich möchte keine Funktion haben, die die Werte am Anfang reinschreibt.
Ich möchte keine Initialisierung haben, die jedes Mal beim Programmstart 
ausgeführt wird.
Ich möchte die Werte gern einmal beim Übertragen des Programms schreiben 
und dann sollen die Werte erhalten bleiben, bis ich eine Funktion 
aufrufe, die mir die Werte ändert.

Wie lege ich also die Werte richtig an?

von (prx) A. K. (prx)


Lesenswert?

Neueinsteiger schrieb:

> Wie bekomme ich die Daten am Anfang in den simulierten EEPROM.
> Ich möchte keine Funktion haben, die die Werte am Anfang reinschreibt.

Dann schreib sie eben beim Programmieren gleich mit hinein, als 
spezielle Datensection und Bestandteil des Programms. Wirst deinen 
Compiler/Linker etwas striezen müssen bis er die die Speicherverteilung 
hinbiegt, aber das geht (zumindest bei GCC, andere kenne ich nicht). 
Macht er dann natürlich jedes Mal wenn du das Flash neu programmierst.

Einfacher wärs aber. wenn du vorher reinschaust ob in dem Segment was 
drin liegt und es initialisiert wenn nicht.

Jedenfalls wirst du dich auch drum kümmern müssen, dass er beim 
Neuprogramieren diesen Teil vom Flash nicht platt bügelt (chip erase), 
es sei denn du willst ebendies.

> Wie lege ich also die Werte richtig an?

Massiver Einsatz von "Ich möchte" plus virtuellem Fussaufstampf bringt 
dich auch nicht weiter. Was wir anbieten können sind Lösungswege. Ein 
anderer Weg ist externes EEPROM oder FRAM per SPI - FRAM das ist 
byteweise unbegrenzt schreibbar. Aber irgendwie muss das Zeug auch da 
anfangs mal rein und irgend eine arme Sau muss sich drum kümmern. 
Schätze mal das bist du, auch wenns dir nicht schmeckt.

von Neueinsteiger (Gast)


Lesenswert?

A. K. schrieb:
> Dann schreib sie eben beim Programmieren gleich mit hinein, als
>
> spezielle Datensection und Bestandteil des Programms. Wirst deinen
>
> Compiler/Linker etwas striezen müssen bis er die die Speicherverteilung
>
> hinbiegt, aber das geht (zumindest bei GCC, andere kenne ich nicht).
>
> Macht er dann natürlich jedes Mal wenn du das Flash neu programmierst.

Das ist kein Problem.
Der Controller ist auf einer Karte verbaut. Er wird einmal programmiert.
Dann wird nur noch über CAN oder serielle Schnittstelle neue Parameter 
vorgegeben.

Meine Frage von ganz am Anfang war eben die, wie ich die Daten beim 
Programmieren gleich mit hineinschreibe...

Bitte um Hilfe

von 900ss (900ss)


Lesenswert?

A. K. schrieb:
> Einfacher wärs aber. wenn du vorher reinschaust ob in dem Segment was
> drin liegt und es initialisiert wenn nicht.

Das würde auch die AN schon unterstützen. Ansonsten mußt du das Format, 
wie die AN-Lib das ablegt, erstmal ermitteln damit du das Flash 
kompatibal dazu initialisierst. Natürlich nur, wenn du die AN-Lib nutzen 
willst.
Und dann kann man sich überlegen, wie man die Daten da reinbekommt.
Wie A. K. schon schrieb: mußt dem Compiler/Linker ein paar Infos zu dem 
Datensegment geben.

Allerdings würden beim Initialisieren die Daten doppelt vorhanden sein. 
Einmal für die Initialisierungssequenz und später dann im EEPROM.

Neueinsteiger schrieb:
> Wichtig ist,

.... dass man alles ließt. Diesen Teil hatte ich wohl unterschlagen :-(

von 900ss (900ss)


Lesenswert?

Neueinsteiger schrieb:
> Dann wird nur noch über CAN oder serielle Schnittstelle neue Parameter
> vorgegeben.

Dann nutze diesen Mechanismus doch auch zum Initialisieren, dann 
brauchst du dir nichts extra überlegen.

von Neueinsteiger (Gast)


Lesenswert?

Gibt es also in uVision 4 (KEIL) keine einfache Möglichkeit Daten fest 
in den Flash zu speichern?

von holger (Gast)


Lesenswert?

>Gibt es also in uVision 4 (KEIL) keine einfache Möglichkeit Daten fest
>in den Flash zu speichern?

Könnte es sein das du einfach nur ein bißchen blöd bist?

von Matthias K. (matthiask)


Lesenswert?

Ich glaube, hier reden alle aneinander vorbei. Was will Neueinsteiger 
eigentlich. Hat Dein STM32 nicht erstmal genug RAM für die Daten?

von Neueinsteiger (Gast)


Lesenswert?

Noch einmal: Ich kann die Daten nicht im RAM halten, weil sie erhalten 
bleiben sollen, auch wenn keine Spannung mehr anliegt

von Matthias K. (matthiask)


Lesenswert?

Werde mal konkret, wie die "Daten" aussehen und um vieviel Byte reden 
wir überhaupt?

von (prx) A. K. (prx)


Lesenswert?

Apropos Bytes: Diese STM32 haben 84 Bytes internes RAM, das durch 
Batterie gepuffert werden kann.

von Cell1985266 (Gast)


Lesenswert?

ich wollte nur mal sagen das ich genau dieses problem hatte.

konkret ging es bei mir darum, das betriebsstundenzähler die ich 
erstellt hatte nach einem stromausfall nicht ihre werte verlieren 
sollten.

und wenn es ein strommausfall gibt oder zum reset kommt, sollen die 
zähler von dem letzten wert aus weiterzählen.

möglichkeiten

a) eeprom emulation -> keine gute idee wegen begrenzter schreib zyklen 
etc.
wenns aber einmal gemacht ist und nich so oft geändert wird ist es auch 
egal.

b) gepuffertes ram, geht ist aber blöd wenn die batterie mal stirbt

c) extrenes eeprom per spi hab ich gemacht, funktioniert super.

d) hab jetzt weil ich das immer öfters nutze ein sdcard slot mit einer 
sd karte die ich als speicher benutze. funktioniert genau so super wie 
das spi eeprom. vorteil: austauschbar, nachteil: kostet evtl. mehr.

e) usb stick als eeprom benutzen. noch nich ausprobiert geht aber auch.

alles in keil mit nem stm32f103ze

bei fragen: sam@superkato.net, ich helfe gerne.

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.