mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik kann man nichtflüchtige Werte im MSP ablegen?


Autor: Hans Wurst (hans_wurst)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Zauberwort heisst Flash Speicher.

Autor: Peter Diener (Gast)
Datum:

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

Autor: Stephan Pl. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
struct InfoBlock
{
  .......
        .......
};

// daten im flash des Speichers ablegen!!!
const struct InfoBlock *const infoBlock = (const struct InfoBlock *)0x1000;

greetz

Autor: Stefan (Gast)
Datum:

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

Autor: Hans Wurst (hans_wurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
//******************************************************************************
//  MSP-430F22x4 Demo - Flash In-System Programming, Copy SegC to SegD
//
//  Description: This program first erases flash seg C, then it increments all
//  values in seg C, then it erases seg D, then copies seg C to seg D. Starting
//  addresses of segments defined in this code: Seg C-0x1040, Seg D-0x1000.
//  ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
//  //* Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash *//
//
//               MSP430F249
//            -----------------
//        /|\|              XIN|-
//         | |                 |
//         --|RST          XOUT|-
//           |                 |
//
//  B. Nisarga
//  Texas Instruments Inc.
//  September 2007
//  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include "msp430x24x.h"

char value;                               // 8-bit value to write to seg C

// Function prototypes
void write_SegC(char value);
void read_SegC(void);

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                     
  {  
    while(1);                               // If calibration constants erased
                                            // do not load, trap CPU!!
  }  
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
  DCOCTL = CALDCO_1MHZ;
  FCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing Generator
  value = 0;                                // initialize value

  while(1)                                  // Repeat forever
  {
    read_SegC();
    write_SegC(BIOS_value++);           // Write segment C, increment value
  }
}

void read_SegC(void)
{
  char value;
  char *Flash_ptr;                          // Flash pointer
  unsigned int i;

  Flash_ptr = (char *)0x1040;               // Initialize Flash pointer

  for (i = 0; i < 64; i++)
  {
    value = *Flash_ptr++;                   // Write value to flash
  }
}

void write_SegC(char value)
{
  char *Flash_ptr;                          // Flash pointer
  unsigned int i;

  Flash_ptr = (char *)0x1040;               // Initialize Flash pointer
  FCTL3 = FWKEY;                            // Clear Lock bit
  FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  *Flash_ptr = 0;                           // Dummy write to erase Flash seg

  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

  for (i = 0; i < 64; i++)
  {
    *Flash_ptr++ = value;                   // Write value to flash
  }

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


Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

was steht denn drin, wenn du das geschriebene ausließt, ohne 
zwischenzeitlich die Spannung abzuschalten?

Vielleicht wird ja garnichts geschrieben.

Peter

Autor: Peter Diener (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das obige Programm kann überhaupt gar nicht funktionieren.
"BIOS_value" ist nirgends definiert, der Compiler müsste mit Fehler 
abbrechen!

Autor: Hans Wurst (hans_wurst)
Datum:

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

Autor: Peter Diener (Gast)
Datum:

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

Autor: Hans Wurst (hans_wurst)
Datum:

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

Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

freut mich, dass es funktioniert.
Was mir gerade noch aufgefallen ist: Wenn du nicht im Debugmodus 
arbeitest, ist dieser code sehr gefährlich:
  while(1)                                  // Repeat forever
  {
    read_SegC();
    write_SegC(BIOS_value++);           // Write segment C, increment value
  }

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

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.