Hallo, ich möchte gerne einen Wert im Speicher des MSP430F247 ablegen, der allerdings nichtflüchtig ist. (Ähnlich wie beim Atmel im internen EEPROM). Hierfür bietet der MSP (möglicherweise?) einen Bereich, der sich "TLV structure" nennt. Ich schaffe es allerdings nur in die Register zu schreiben, in denen die Werte für die interne Takterzeugung und den ADC stehen. Diese Werte möchte ich ungerne überschreiben. Hat jemand damit bereits Erfahrung/Tipps gesammelt? Danke für eure Hilfe.
Das Zauberwort heisst Flash Speicher.
Gast
#1039400
Hallo, dein MSP hat 256 Byte Configuration Flash. Da kann man es reinspeichern. Ich weiß nur nicht, ob das zur Laufzeit geht, die Antwort darauf liefert aber bestimmt der Family Guide. Aber ich denke, du möchtest es zur Laufzeit speichern, sonst könntest du es ja schon im Programm als const deklarieren. Gruß, Peter
Gast
#1039438
Hallo, also ich habe das im MSPx1232 mal so realisiert. Funzt auch mit zugriff ausser main(). Den Bereich 0x1000 musst du im Handuch noch mal nachschauen ist bei jedem MSP anders.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
greetz
Gast
#1039443
Dazu benutzt man das Information Memory. Dein MSP hat davon 4 Segmente a 64 Byte. Das ganze ist selbstverständlich auch zur Laufzeit beschreibbar, allerdings -wie bei Flash-Speicher so üblich- muss erst ein komplettes Segment gelöscht werden, bevor man Daten darin neu schreiben kann. User-Guide, Kapitel 7 "Flash Memory Controller". Codebeispiele wie immer bei TI Wenn Du mehr Daten zu speichern hast, kannst Du das auch im Programm-Flash ablegen. Zwischen Programm-Flash und Info-Flash gibt es, bis auf die Segmentgröße keinen Unterschied. Oder andersrum, kann man auch Programmcode ins Info ablegen! Das kann man im Linker-File einstellen.
Danke für die Antworten. Ich habe jetzt versucht mit dem Codebeispiel msp430x24x_flashwrite_01.c von TI auf das SegmentC zu schreiben. Sobald ich die Versorgungsspannung (nach Programmdurchlauf) wieder wegnehme und erneut anschließe, steht wieder nur 0xff im Speicher von SegmentC. PS: meine Versorgungspannung beträgt 3V (also mehr als die benötigten 2,2V) hier noch der Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
Gast
#1040189
Hallo, was steht denn drin, wenn du das geschriebene ausließt, ohne zwischenzeitlich die Spannung abzuschalten? Vielleicht wird ja garnichts geschrieben. Peter
Gast
#1040205
Hallo, warum schreibst du eigentlich 64 Byte mit dem gleichen Wert value voll, einer würde doch zum Testen ausreichen. Wo gibst du value überhaupt aus? Über den Degugger? Es kann sein, dass mit dem Degubber keine Flashoperationen zulässig sind, bzw. das Timing nicht stimmt. Peter
Gast
#1040208
Das obige Programm kann überhaupt gar nicht funktionieren. "BIOS_value" ist nirgends definiert, der Compiler müsste mit Fehler abbrechen!
@ Peter Diener: Wenn ich nach dem Schreiben die Adressen erneut auslese, sehe ich auch meine geschriebenen Werte. Nach einem Reset steht wieder 0xff drin. Das ich gleich die ganzen 64 Byte schreibe habe ich gemacht, da ich den Beispielcode von TI möglichst unverändert übernehmen wollte. Die Variable "value" lasse ich mir beim debuggen direkt anzeigen. @ Stefan : Sorry, den Wert "BIOS_value" habe ich vergessen wieder zurück zu ändern. Um Verwirrung zu vermeiden, wollte ich nicht meinen ganzen Code ins Forum einfügen.
Gast
#1040269
Hallo, prinzipiell solte das aber funktionieren. Ich kann mir aber vorstellen, dass das Timing nicht stimmt. Im User Guide steht: The flash timing generator operating frequency, fFTG, must be in the range from ~ 257 kHz to ~ 476 kHz Außerdem verändert deine Read Segment Funktion value nicht, dort ist es ja neu definiert. Werf die Definition raus! Peter
Riesen DANKESCHÖN an euch. Peter Diener hatte Recht. Es lag daran, dass ich mir die Werte im Debugg-Modus angesehen habe. Im Run-Modus funktioniert jetzt endlich alles. War mittlerweile echt am verzweifeln.
Gast
#1040293
Hallo, freut mich, dass es funktioniert. Was mir gerade noch aufgefallen ist: Wenn du nicht im Debugmodus arbeitest, ist dieser code sehr gefährlich:
1 | |
2 | |
3 | |
4 | |
5 | |
Das schreibt beliebig oft das Flash, daduch wird es auf Dauer zerstört, es sind nur etwa 10000 Löschzyklen zulässig. Aber vielleicht hast du das ja schon nicht mehr drin. Viele Grüße, Peter
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.