Datum:
Hi Leutz! Ich versuche mich gerade daran, Daten ins Flash vom MSP abzulegen. Klappt auch, aber ich stolpere über die seltsame Verteilung des Information Memorys im Controller. Laut DB ist dieser Speicherbereich zwischen 0x01000 und 0x010FF, also 256Byte. Dieser Bereich ist unterteilt in Segment A bis D. In A liegen die Kalibrierdaten für den DCO, dieser Bereich ist gesondet gesichert und muss erst freigeschaltet werden. Ist auch egal, ich will den garnicht benutzen. Normalsterblicher würde ja jetzt davon ausgehen, dass Segment A bei 0x1000 beginnt, das scheint aber nicht so zu sein, da auf diesen Bereich halt nicht ohne geschrieben werden kann, das Auslesen bringt hauptsächlich 1en, Speicher ist also größtenteils leer. Ab 0x1040 kann dann ohne Probleme geschrieben werden. Liegt Segment A daher ganz hinten? Also alles umgekehrt? So:
// Segment D: 0x01000 - 0x0103F // Segment C: 0x01040 - 0x0107F // Segment B: 0x01080 - 0x010BF // Segment A: 0x010C0 - 0x010FF |
Leider finde ich dazu im DB nichts, ist theoretisch auch egal, würde mich aber dennoch interessieren.
Datum:
>Liegt Segment A daher ganz hinten? Ja >Leider finde ich dazu im DB nichts Schau in den User Guide :)
Datum:
Das ist in der Tat so, jedenfalls steht es so in der z.B. slau144.pdf. Also Segment D beginnt tatsächlich bei 0x01000. Das findet man dann immer in der familiy guide zur jeweiligen MCU ... Qwerty
Datum:
Im Datenblatt steht nichts, aber hier http://www.ti.com/general/docs/lit/getliterature.t... auf Seite 317. Da siehst Du, dass Segment A tatsächlich oben im Speicher liegt und Segment D unten, anders als erwartet. Übrigens beim Main Memory liegt Segment 0 genz oben und Segment 63 ganz unten. Letztlich nur eine Definition. Es geht übrigens auch noch schlimmer: Freescale PowerPC (z.B. MPC823E) - Externes Businterface mit 26 Adressleitungen, A6 bis A31, wobei A6 die höchstwertige Adressleitung ist...
Datum:
Vielen Dank! Da stehts drin, tatsächlich ;-) Mal noch ne andere Sache: Ich schreibe ins Flash, sagen wir ein Wort1 an Speicherstelle x. Danach das nächste Wort2 an x+2, usw... Jetzt ändert sich während des Programms Wort1 und muss daher neu ins Flash gespeichert werden - kann ich das einfach überschreiben? Oder MUSS die Speicherstelle erst wieder gelöscht werden? Das ist doch generell ein Problem, das sich mir grad auftut...Ich kann ja nur Segmentweise löschen, ich müsste also erst das ganze Segment zwischenspeichern (64Byte bei 128Byte RAM), um dann alles zurückzuschreiben. Wie soll ich das denn machen?
Datum:
Oder immer ein Segment freihalten und die Daten da rüber schieben? Und dann wieder zurück...
Datum:
> Jetzt ändert sich während des Programms Wort1 und muss daher neu ins > Flash gespeichert werden - kann ich das einfach überschreiben? Oder MUSS > die Speicherstelle erst wieder gelöscht werden? Es geht immer nur ein eine Richtung. Ich weiss jetzt nicht wie es bei MSP ist, aber sagen wir mal das Flash lässt sich nur einmalig auf 0 setzen. Dann kannst du aus 0xF0 noch eine 0x00 machen ohne vorher zu löschen. Aus einer 0x00 kannst du aber keine 0x01 mehr machen. > Das ist doch generell ein Problem, das sich mir grad auftut...Ich kann > ja nur Segmentweise löschen, ich müsste also erst das ganze Segment > zwischenspeichern (64Byte bei 128Byte RAM), um dann alles > zurückzuschreiben. Ja, das ist halt Flash Speicher....
Datum:
Jörg S. schrieb: > Ja, das ist halt Flash Speicher.... Dann muss ich doch mal ganz dumm fragen, wie das bei einem USB-Stick gelöst ist? Das ist doch auch Flash. Bleibt da auch ein Segment immer frei, in dem man "arbeiten" kann, oder wie ist das?
Datum:
In den USB Sticks ist ja auch ein Controller drin der das alles steuert und optimiert. Siehe: http://de.wikipedia.org/wiki/Wear-Leveling#Reine_F...
Datum:
OK, das werde ich mir mal durchlesen - danke! Nochwas: Wie gesagt, das Schreiben klappt ja ohne Probleme. Wie kann ich denn dem Compiler (IAR) sagen, dass er mir nicht jedesmal den Information Memory löscht? Ich will ja testen, ob die Werte da auch drin bleiben. Nur dazu muss ich momentan immer sagen, dass er die erst da rein schreiben soll. Das Kompilieren schmeißt ja auch den Speicherbereichsinhalt wieder raus und setzt alles auf 0xFF. Gibt es da irgendeine Anweisung für den Compiler?
Datum:
Gerd schrieb: > Mal noch ne andere Sache: Ich schreibe ins Flash, sagen wir ein Wort1 an > Speicherstelle x. Danach das nächste Wort2 an x+2, usw... > > > Jetzt ändert sich während des Programms Wort1 und muss daher neu ins > Flash gespeichert werden - kann ich das einfach überschreiben? Oder MUSS > die Speicherstelle erst wieder gelöscht werden? Wenn Du eine solche Anwendung hast, ist Flash ungeeignet. Dafür eignet sich ein EEPROM viel besser, weil es byteweise gelöscht werden kann. Ansonsten gibt es sog. "EEPROM-Emulation" im Flash, d.h. ein Software-Algorithmus simuliert ein EEPROM, benutzt aber Flash zum Speichern. Sowas ist aber nicht trivial und braucht mehrere Instanzen des Datensatz im Flash, von denen immer nur eine gültig ist.
Datum:
Dosmo schrieb: > Wenn Du eine solche Anwendung hast, ist Flash ungeeignet. Dafür eignet > sich ein EEPROM viel besser, weil es byteweise gelöscht werden kann. Ja klar, nur leider ist das hier grad nicht drin. Es sind nur ein paar Werte, die ich speichern muss, dafür jetzt extra ein EEPROM...ich werde die Daten dann irgendwie zwischen zwei Segmenten hin und her kopieren und dazwischen eben immer ein Segment löschen.
Datum:
>Gibt es da irgendeine Anweisung für den Compiler?
Bei IAR Compiler?
Project -> Options -> FET Debugger ->
Datum:
TL431 schrieb im Beitrag #2648753: > Project -> Options -> FET Debugger -> Alles klar, habs gefunden! Danke!