ARM Cortex M3 STM32F107 Daten in den Flash

Gast #2264661
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!
#2264710
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   "};
Gast #2264734
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.
Gast #2264763
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?
#2264773
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.
#2264788
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.
Gast #2264799
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.
Gast #2264803
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?
Gast #2264832
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?
#2264851
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.
Gast #2264858
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
#2264879
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 :-(
Gast #2427842
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren