Hallo, die uC's der MSP430x2xx-Famile besitzen einen Speicherbereich (TLV-Structure) in dem spezifische Werte für den Abgleich des Taktes und des ADC-Wandlers enthalten sind. Dieser Bereich bleibt auch erhalten, wenn der uC stromlos ist und wird auch garantiert nicht von anderen Teilen neu überschrieben. Einige Speicheradressen sind dort noch frei und ich würde sie gerne verwenden um eigene Daten ablegen zu können. (sozusagen als Ersatz für einen externen Speicher) Hat jemand damit bereits Erfahrungen? Ich schaffe es nämlich nicht diesen Teil zu überschreiben. (Habe versucht den Wert 0xFF auf der Adresse 0x10EE zu überschreiben)
Ist das nicht der Teil des Flash-ROMs, der auch als INFO-Memory bezeichnet wird? Der sollte dann genauso beschrieben werden können, wie das restliche Flash-ROM. Wie hast Du denn versucht, den Bereich zu beschreiben?
Ja, so wie ich das verstanden habe, ist das der Bereich Info-Memory. Das schreiben habe ich so versucht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Auch wenn ich den Wert auf dieser Adresse im Debug-Modus ändern möchte, ändert er ihn nicht. (Auf "normalen" Adressen geht es aber)
Gast
#929245
Der INFO-Bereich ist ein Flash-Speicher, der nicht wie RAM beschrieben werden kann, sondern programmiert werden muss. Wie das geht, steht im User-Guide unter Kap.7 (Flash Memory Controller) und in den Code-Beispielen von TI. Ausserdem ist dieser INFO-Bereich extra gegen Löschen und Überschreiben geschützt, da er "sensible" Daten enthält (also z.B. Kalibrierung des internen DCO usw.) Zum Löschen muss daher zusätzlich zu LOCK = 0 auch LOCKA = 0 gesetzt werden!
Gast
#929272
Hier noch ein Code-Ausschnitt von TI, in dem genau dieser INFO-A Bereich neu beschrieben wird:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Man beachte hierbei, dass das LOCKA-Bit durch 1-setzen zwischen den Werten 0 und 1 getoggelt wird! (0-setzen hat keine Wirkung!)
Die beiden mittleren Segmente B und C sind offensichtlich unbelegt, hier solltest du deine Versuche machen. So wie ich das DB interpretiere, kannst du nur ein komplettes Segment löschen und die DCO-Kalibrierung ab 01F8H in Segment A wäre in deinem Fall mit weg. Arno
Gast
#929625
>kannst du nur ein komplettes Segment löschen und die DCO-Kalibrierung ab >01F8H in Segment A wäre in deinem Fall mit weg. Ja und nein! Richtig, man kann immer nur ein komplettes Segment löschen und die Daten darin wären somit futsch. Da aber in der Regel immer nur ein paar Bytes im INFO-Segment neu beschrieben werden und der Rest erhalten bleiben soll, kommt man eigentlich eh nicht drumherum, vor dem Löschen ein Backup des Segments im RAM abzulegen, dort die entsprechenden Daten zu ändern und dann das komplette Segment neu zu beschreiben. Somit werden die Kalibrierdaten erhalten. Wenn man allerdings mit den anderen INFO-Bereichen (B,...) auskommt, sollten man tatsächlich das INFO-A zunächst mal unangetastet lassen!
Stimmt, es ist dann sicher besser ich nutze nur die Segmente B bis D. Ich habe mal den oben genannten Code (auch im Codebeispiel "msp430x24x_dco_flashcal.c" von TI enthalten) probiert. Damit kann ich komischerweise aber nur die Werte für den Quarz ändern. Gehe ich auf eine andere Adresse (z.B. 0x10EE), dann steht dort bei einem Neustart immer nur der Wert 0xFF. (Das gleiche passiert wenn ich auf ein anderes Segment zugreifen möchte)
Gast
#930502
Poste mal Deinen Code, ansonsten kann man nur raten, was passiert oder eben nicht passiert!
Das hier ist der Code, bei dem ich versuche die Werte für den Quarz (was auch gelingt), und einen Wert auf der Adresse 0x10C4 (was nicht gelingt) zu ändern:
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 | |
Gast
#933023
Entweder es ist schon zu spät... ... oder ich sehe da eigentlich wirklich keinen Fehler?! Allerdings behaupte ich mal, dass (aus welchem Grund auch immer) bei Dir gar nichts ins INFO geschrieben wird, nicht mal die Kalibrierwerte. Du kopierst Dir ja die derzeitigen Werte in CAL_DATA[] und schreibst dieselben dann zurück ins Flash. Du siehst also gar nicht, was und ob überhaupt geschrieben wird! Kontrolliere mal Deinen Systemclock (DCO ?) und den Teiler für den Flash Controller. Der braucht 257 - 476kHz, ansonsten kann Müll rauskommen. Schau Dir vielleicht mal das FAIL-Flag in FCTL3 an (vorher löschen), ob der Clock Probleme macht. Ausserdem muss Vcc > 2,2V sein! Mehr fällt mir jetzt gerade auch nicht ein.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.