www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TLV Struktur vom MSP430F247 (interner Flash)


Autor: Hans Wurst (hans_wurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Hans Wurst (hans_wurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, so wie ich das verstanden habe, ist das der Bereich Info-Memory.

Das schreiben habe ich so versucht:

#define ADRESSE_OFFSET  (CAL_ADC_25T85+1)*2+4  

volatile unsigned char *p_adresse;
p_adresse= &TLV_ADC12_1_TAG;     // setze auf Adresse TLV_ADC12_1_TAG
p_adresse += ADRESSE_OFFSET;     // Springe weiter auf Adresse 0x10EE

(*p_adresse) = 0x00;             // enthält sonst den Wert 0xFF

Auch wenn ich den Wert auf dieser Adresse im Debug-Modus ändern möchte, 
ändert er ihn nicht. (Auf "normalen" Adressen geht es aber)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch ein Code-Ausschnitt von TI, in dem genau dieser INFO-A Bereich 
neu beschrieben wird:
  Flash_ptrA = (char *)0x10C0;              // Point to beginning of seg A
  FCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing Generator
  FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  FCTL3 = FWKEY + LOCKA;                    // Clear LOCK & LOCKA bits
  *Flash_ptrA = 0x00;                       // Dummy write to erase Flash seg A
  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  Flash_ptrA = (char *)0x10F8;              // Point to beginning of cal consts
  for (j = 0; j < 8; j++)
    *Flash_ptrA++ = CAL_DATA[j];            // re-flash DCO calibration data
  FCTL1 = FWKEY;                            // Clear WRT bit
  FCTL3 = FWKEY + LOCKA + LOCK;             // Set LOCK & LOCKA bit

Man beachte hierbei, dass das LOCKA-Bit durch 1-setzen zwischen den 
Werten 0 und 1 getoggelt wird! (0-setzen hat keine Wirkung!)

Autor: Arno H. (arno_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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!

Autor: Hans Wurst (hans_wurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste mal Deinen Code, ansonsten kann man nur raten, was passiert oder 
eben nicht passiert!

Autor: Hans Wurst (hans_wurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

// Meine Anwendung läuft ohne externen Quarz
//  for (i = 0; i < 0xfffe; i++); // Delay for XTAL stabilization

  j = 0;                                    // Reset pointer

  CAL_DATA[j++] = CALDCO_16MHZ;
  CAL_DATA[j++] = CALBC1_16MHZ;
  CAL_DATA[j++] = CALDCO_12MHZ;
  CAL_DATA[j++] = CALBC1_12MHZ;
  CAL_DATA[j++] = CALDCO_8MHZ;
  CAL_DATA[j++] = CALBC1_8MHZ;
  CAL_DATA[j++] = CALDCO_1MHZ;
  CAL_DATA[j++] = CALBC1_1MHZ;

  Flash_ptrA = (char *)0x10C0;      // Point to beginning of segA
  FCTL2 = FWKEY + FSSEL0 + FN1;     // MCLK/3 for Flash Timing Generator
  FCTL1 = FWKEY + ERASE;            // Set Erase bit
  FCTL3 = FWKEY + LOCKA;            // Clear LOCK & LOCKA bits
  *Flash_ptrA = 0x00;               // Dummy write to erase Flash segA
  FCTL1 = FWKEY + WRT;              // Set WRT bit for write operation
  Flash_ptrA = (char *)0x10F8;      // Point to beginning of cal consts
  for (j = 0; j < 8; j++)
    *Flash_ptrA++ = CAL_DATA[j];    // re-flash DCO calibration data
  Flash_ptrA = (char *)0x10C4;

  *Flash_ptrA++ = 0x00;    // zum Testen geschrieben
  *Flash_ptrA++ = 0x0f;    // Diese Werte sind jedoch nach einem
  *Flash_ptrA++ = 0xf0;    // erneuten Start des Mikrocontrollers
                           // wieder auf dem Wert 0xFF

  FCTL1 = FWKEY;                    // Clear WRT bit
  FCTL3 = FWKEY + LOCKA + LOCK;     // Set LOCK & LOCKA bit
}

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.