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!
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
constshortintbild1_bmp[]={0xF244,0x2A43,0x42C4};// 16 Bit Daten Array
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.
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?
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.
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.
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?
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_tvar1=123;
2
charmeinText[]="Ich bin ein String";
3
4
intmain(void)
5
{
6
printf("var1=%d, meinText=%s\n",var1,meinText);// ergibt "var1=123, meinText="Ich bin ein String"
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.
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.
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.
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.
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?
>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.
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?
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.
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?
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.
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
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 :-(
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.
>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?
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.