Forum: Mikrocontroller und Digitale Elektronik MSP430 flash löscht sich?


von Nicco (Gast)


Lesenswert?

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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Nicco (Gast)


Angehängte Dateien:

Lesenswert?

Also, den Code ist der Originale von TI, nichts geändert!
Hier auch als Anhang.
Sieht genau gleich aus wie Beispiele für andere MSP430.

von Johnny (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Nicco schrieb:

> Mein MSP430 kriegt Saft aus eine on-board Supply.

Was genau darf man darunter verstehen?

von Johnny (Gast)


Lesenswert?

Er meint wohl, dass er eine eigene Speisung hat und nicht die des 
Debuggers verwendet.

von Nicco (Gast)


Angehängte Dateien:

Lesenswert?

@ A.K. Genau was Johnny sagt

Ich hab den Code erweitert mit eine Test routine, um tatsächlich den 
Wert aus Flash zu lesen.
1
//FOR TESTING
2
  //initialize variables and pointers
3
  char *Flash_ptrC;
4
  char *Flash_ptrD;
5
  char testvalue1 = 0;
6
  char testvalue2 = 0;
7
  Flash_ptrC = (char *)0x1040;
8
  Flash_ptrD = (char *)0x1000;
9
10
  //store flash value in variable
11
  testvalue1 = *Flash_ptrC;
12
  testvalue2 = *Flash_ptrD;
13
  
14
//END TESTING

Siehe Anhang: Printscreens (01 - Writing on flash) (02-checking value on 
flash)

von Nicco (Gast)


Angehängte Dateien:

Lesenswert?

und zweites Printscreen

von Nicco (Gast)


Lesenswert?

@ 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 :(

von Nicco (Gast)



Lesenswert?

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 !)

von Stefan (Gast)


Lesenswert?

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).

von Stefan (Gast)


Lesenswert?

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).

von Nicco (Gast)


Lesenswert?

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!

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
Noch kein Account? Hier anmelden.