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:
1
// Segment D: 0x01000 - 0x0103F
2
// Segment C: 0x01040 - 0x0107F
3
// Segment B: 0x01080 - 0x010BF
4
// Segment A: 0x010C0 - 0x010FF
Leider finde ich dazu im DB nichts, ist theoretisch auch egal, würde
mich aber dennoch interessieren.
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
Im Datenblatt steht nichts, aber hier
http://www.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=slau144i&fileType=pdf
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...
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?
> 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....
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?
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?
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.
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.
AU das tut Wehh :-(
Ich programmiere MSP430er in purem Assembler seit es sie Gibt....
Habe mich doch Tasächlich mal aus der TI umgebung raus gewagt (Segmente
haben mich da nicht gekümmert da die xxx430Cxxxx versionen keinen
Haben)und den IAR zu verwenden. Bin doch tatsächlich dauernd darüber
gestolpert dass ich im IAR "SEGMENTB" beschreiben will und dies dan
offensichtlich im Segment C gesucht GRMPF :@
Jungs ich will euch einfach DANKE sagen habe dank diesem Beitrag lesen
endlich gefunden warum meine Parameter immer weg waren :-)
Jaja Handbuchlesen ist halt so ne Sache.. wen mann so Lange
eingefleischt Assembler programmiert und sich darauf spezialisiert hat
möglichst viele Funktionen in nur 2 K FLASH(MSP430F2013) zu
briingen.....
Desshalb nochmals DANKE für eure Beiträge hat mich nach 2Std suchen via
Google in 5 Minuten zum "Ahaaa" effekt geführt :-)
Grüsse vom Assembler(ALT)hasen ;-)