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 | 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 ST gibt es eine Lib, die ein Pseudo-EEPROM im Flash einrichtet. Ich denke, das ist genau, was Du brauchst. Gruß, Stefan
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_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.
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.
Neueinsteiger schrieb: > Brauche dringend Hilfe! Es gibt von ST eine Appnote dafür, wie man veränderliche Daten im Flash unterbringen kann.
900ss D. schrieb: > Wenn du natürlich die Änderungen auch erhalten willst, dann ist das was > > anderes. Hab ich doch geschrieben...
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?
Neueinsteiger schrieb: > Wo genau kann ich das finden? http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00165693.pdf
>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?
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"
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00165693.pdf http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/an2594.zip
A. K. schrieb: > http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00165693.pdf Jetzt hat er es doppelt. Hält vielleicht besser ;-)
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.
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?
>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 glaube, hier reden alle aneinander vorbei. Was will Neueinsteiger eigentlich. Hat Dein STM32 nicht erstmal genug RAM für die Daten?
Noch einmal: Ich kann die Daten nicht im RAM halten, weil sie erhalten bleiben sollen, auch wenn keine Spannung mehr anliegt
Werde mal konkret, wie die "Daten" aussehen und um vieviel Byte reden wir überhaupt?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.