Hallo Leute!
Ich versuche seit ein paar Tagen den Flash Speicher zu verwenden.
Bei TI hab ich die Beispielcodes angeschaut und getestet. Besonders der
(msp430x21x2_flashwrite_01.c)
Ich arbeite mit IAR 4.20 und ein eZ430-RF2500 FET debugger.
Mein MSP430 kriegt Saft aus eine on-board Supply.
Nehme ich die Speisung weg (sowohl externes Netzteil als USB Anschlüsse
weg), wird diese Information Memory gelöscht!
In (Projects -> Options -> FET Debugger) hab ich die 3 "Flash erase
option" verwendet, ohne Erfolg. (Bei "Erase Main and Information Memory"
ohne Überraschung :) )
Zuerst lade ich den Beispielcode und lasse es ein paar mal laufen.
Sagen wir dass ich jetzt in Segment C und D überall den Wert 04 habe.
Dann halte ich der debugger und nehme die Speisung weg.
Bei verschiedene Tests (verschiedene debug kommandos) hab ich folgendes
rausgefunden (bei aktivierung des (View -> Memory -> Filter auf "INFO"):
Debug without download -> Segment C gelöscht, Segment D random Werte
Download & debug -> Segment C gelöscht, Segment D gelöscht
Als Test hab ich versucht die Speisung konstant zu behalten. Hier der
Resultat:
Debug without download -> alles OK
Download & debug -> Segment C gelöscht, Segment D OK
Was ist da Falsch? Der Code nehme ich mal an, ist korrekt. Die erwähnten
Optionen sind die einzige die ich in Zusammenhang mit Flash memory
gefunden habe...
Wird beim debuggen in die erwähnte Memoryfenster den aktuellen Flash
zustand gezeigt? Vielleicht ist der Wert auf die Flash korrekt, nur die
Darstellung auf den Bildschirm ist falsch...
bin ratlos! Danke für eure Hilfe!
Es ist eher unwahrscheinlich, daß sich das Info-Memory von selber
löscht, auch der Debugger ist dafür nicht verantwortlich zu machen.
Vielleicht liegt das Problem doch irgendwo in Deinem Code versteckt.
Du könntest, sofern Du irgendeine Art Schnittstelle zur Verfügung stehen
hast (was beim 'F2013 und seinen kleineren Brüdern nicht ganz einfach
ist), eine Prüfsumme über den Inhalt der von Dir genutzten
Info-Memory-Seiten bilden und diese ausgeben, wenn Du dem Debugger nicht
traust.
Sofern es das winzige Römchen des 'F2013 zulässt, könntest Du auch einen
Hexdump des Info-Memory über diese Schnittstelle ausgeben.
> In (Projects -> Options -> FET Debugger) hab ich die> 3 "Flash erase option" verwendet, ohne Erfolg.> (Bei "Erase Main and Information Memory" ohne Überraschung :) )
Du solltest "Erase main memory" verwenden, nicht mehr.
Ich verwende einen 'F5438 mit IAR, und diese Einstellung lässt das
Info-Memory unangetastet.
Also ich sehe diese Fehlermöglichkeiten:
1. Du hast das Flash gar nicht beschrieben
2. Du überschreibst das Flash selber wieder unerwartet
3. Durch den Einsatz des Debuggers wird das Flash überschrieben
4. Du läufst in einen Hardwarebug des MSP430F5XXX (Interrupts müssen
während des Löschvorgangs ausgeschaltet sein)
Zieh mal lieber die Codebeispiele zum MSP430F5XXX zu Rate:
http://www.ti.com/litv/zip/slac166j
@ Johnny
1. nach ein Test sieht nicht so aus
2. Ich hab ein Breakpoint und die option "leave target running" gelöscht
3. Die erwähnten Optionen ("Flash erase option") habe ich auf "Erase
main Memory" und nicht erase Information Memory (wie von Rufus gesagt)
4. Ich arbeite mit ein F2132
Ich vermute doch etwas mit den Punkt 3, aber weiss nicht was das problem
sein könnte :(
Schalte ich die Speisung ab, entferne der debugger und starte von neu
aus...
ein schreckliches Resultat!
Segment D ist gelöscht
Segment C hat irgend ein Random Wert
(würde der Code alleine weitergehen, würden die 2 Segmente den gleichen
Wert haben !)
Deine Screenshots legen nahe, dass Du möglicherweise im Single-Stepping
Mode durch Deinen Code durchläufst. Das kann während des
Flash-Programmings tödlich sein.
Siehe hierzu auch einen Auszug aus den FAQs des TI-FET:
21. When programming the flash, do not set a breakpoint on the
instruction immediately followingthe write to flash operation. A simple
workaround to this limitation is to follow the write to flash operation
with a NOP, and set a breakpoint on the instruction following the NOP
(see FAQ Debugging
#23).
23. Multiple internal machine cycles are required to clear and program
the flash memory. When single stepping over instructions that manipulate
the flash, control is given back to C-SPY before these operations are
complete. Consequently, C-SPY updates its memory window with erroneous
information. A workaround to this behavior is to follow the flash access
instruction with a NOP, and then step past the NOP before reviewing the
effects of the flash access instruction (see FAQ Debugging #21).
und:
19. C-SPY utilizes the system clock to control the device during
debugging. Therefore, device counters, etc., that are clocked by the
Main System Clock (MCLK) are affected when C-SPY has control of the
device. Special precautions are taken to minimize the effect upon the
Watchdog Timer. The CPU
core registers are preserved. All other clock sources (SMCLK, ACLK) and
peripherals continue to operate normally during emulation. In other
words, the Flash Emulation Tool is a partially intrusive tool.
Devices that support clock control (Emulator ® Advanced ® Clock Control)
can further minimize these effects by selecting to stop the clock(s)
during debugging (see FAQ Debugging #24).
irgendwie hast du recht Stefan.
Ich bin den Beispielcode vorbeigegangen und habe ein "Flash manager" in
mein Code eingebaut und es funktioniert makellos.
Es geht ein bisschen gegen mein Kredo "probieren mit Beispiel, verstehen
und einbauen" aber naja, diesmal hat es funktioniert...
Danke nochmals für euren Einsatz!