Forum: Mikrocontroller und Digitale Elektronik MSP430 FLASH beschreiben Problem


von MSP_Newbie (Gast)


Lesenswert?

Hallo zusammen,

ich möchte eine bestimmte Variable im Falle eines Spannungsverlustes im 
Flash Speicher ablegen und Sie beim nächstern power on wieder auslesen, 
als Sicherung sozusagen.

Zunächst habe ich versucht überhaupt mal irgendeinen Wert zur Laufzeit 
im Flash abzulegen. Beim ersten Mal schreiben wird der Wert der Variable 
(Wert = 60) noch richtig abgespeichert. Beim nächsten Programmdurchlauf 
nur noch Blödsinn, Wert = 16, Wert = 0. Danach wird nur noch 0 
geschrieben.

Jemand eine Idee was hier schief läuft?
1
void write_memory (unsigned int value)
2
{
3
  unsigned int *Flash_ptr;               // Flash pointer
4
5
  Flash_ptr = (unsigned int *) 0xFF00;              
6
  FCTL2 = FWKEY + FSSEL0 + FN1;
7
  FCTL3 = FWKEY;                         // Clear Lock bit
8
  *Flash_ptr = 0;                  
9
  FCTL1 = FWKEY + WRT;                   // Set WRT bit for write operation
10
11
  *Flash_ptr = value;                   // Write value to flash
12
13
  FCTL1 = FWKEY;                         // Clear WRT bit
14
  FCTL3 = FWKEY + LOCK;                  // Set LOCK bit
15
}


Viele Grüße

von beschreiben Pro (Gast)


Lesenswert?

Flash vor dem Beschreiben löschen?

von MSP_Newbie (Gast)


Lesenswert?

Super, danke!

Jetzt funktioniert es. Das Beispiel von TI ist da sehr hilfreich:
1
void write_SegC (char value)
2
{
3
  char *Flash_ptr;                          // Flash pointer
4
  unsigned int i;
5
6
  Flash_ptr = (char *) 0x1040;              // Initialize Flash pointer
7
  FCTL1 = FWKEY + ERASE;                    // Set Erase bit
8
  FCTL3 = FWKEY;                            // Clear Lock bit
9
  *Flash_ptr = 0;                           // Dummy write to erase Flash segment
10
11
  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
12
13
  for (i=0; i<64; i++)
14
  {
15
    *Flash_ptr++ = value;                   // Write value to flash
16
  }
17
18
  FCTL1 = FWKEY;                            // Clear WRT bit
19
  FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
20
}

Beste Grüße

von voila (Gast)


Lesenswert?

MSP_Newbie schrieb:
> Das Beispiel von TI ist da sehr hilfreich

Das sollte immer die erste Anlaufstelle sein.

MSP_Newbie schrieb:
> *Flash_ptr = 0;                           // Dummy write to erase
> Flash segment

Und unbedingt den Kommentar beachten, es wird ein Segment gelöscht. 
;-)

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.