www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik msp430 flash löschen bevor schreiben?


Autor: gringo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag zusammen,

ich versuche das Flash meines MSP430F2618 zu beschreiben, genau zu sagen 
das Information Memory.
Das ganze geschieht während dem Programmablauf.
und es funktioniert auch, wenn ich das Segment vorher lösche, bevor ich 
es schreiben will.
Wenn das flash nur geschrieben wird, ohne das segment zu löschen dann 
stehts neues drin. Kann mir jemand sagen wo das problem liegt?

hier mein code:
uint8 nv_write( uint8 *addr, uint16 len, uint8 *buf )
{
  uint8 rtrn = NV_SUCCESS;
  if ( (len != 0) && (addr>=(uint8*)0x1000) && (addr<=(uint8*)0x10BF) )
  {
      //flashErasePage(addr);  <-- damit funktionierts, ohne nicht
      flashWrite(addr, len, buf);
      while ( len-- )
      {
         if(*addr++ != *buf++)
         {
           rtrn = NV_FAILURE;
         }
      }
  }
  else
  {
    rtrn = NV_FAILURE;
  }
  return rtrn;
}

void flashWrite( uint8 *addr, uint16 len, uint8 *buf )
{
  initFlash();
  FCTL3 = FWKEY;                     // Clear Lock bit
  FCTL1 = FWKEY + WRT;               // Set WRT bit for write operation
  while ( len-- )
  {
    *addr++ = *buf++;                // Write value to flash
  }
  FCTL1 = FWKEY;                     // Clear WRT bit
  FCTL3 = FWKEY + LOCK;              // Set LOCK bit
  doneFlash();
}

STATIC void initFlash(void)
{
  HAL_ENTER_CRITICAL_SECTION( fuIntState );  // Hold off interrupts.
  s_savWDT = WDTCTL & 0xFF;
  WDTCTL = WDTPW + WDTHOLD;    // Stop watchdog timer
  FCTL2 = FWKEY + FSSEL_1 + FN5 + FN3 + FN1 + FN0;  // 363kHz
}

STATIC void doneFlash()
{
  // restore WDT
  WDTCTL = WDTPW + s_savWDT;
  HAL_EXIT_CRITICAL_SECTION( fuIntState ); // Re-enable interrupts.
  return;
}

void flashErasePage(uint8 *addr)
{
  initFlash();
  FCTL1 = FWKEY + ERASE;   // Set Erase bit
  FCTL3 = FWKEY;           // Clear Lock bit
  *addr = 0;               // Dummy write to erase Flash segment
  FCTL1 = FWKEY;           // Clear ERASE bit
  FCTL3 = FWKEY + LOCK;    // Set LOCK bit
  doneFlash();
  return;
}

Vielen Dank für eure Hilfe.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne genau zu wissen, was Du da machst, würde ich sagen, daß Flash vor 
dem schreiben immer gelöscht werden muß, also alle Bits eines Bytes 
müssen vor dem Schreiben "1" sein, das Schreiben setzt die betreffenden 
Bits auf "0".

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn das flash nur geschrieben wird, ohne das segment zu löschen dann
>stehts neues drin.
Was bedeutet das?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du weisst, dass beim Programmieren des Flashs die Bits nur von 1 auf 0 
gesetzt werden können?

--> Wenn flash nicht leer und du willst was definiertes haben, musst du 
vorher löschen.

Peter

Autor: gringo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg S. :   nichts neues sollte es heissen.

das mit dem löschen habe ich befürchtet, ich habe es einfach nicht im 
MSP430x2xx Family User's Guide gefunden.

der nachteil ist einfach das es von den ca 10'000 mal die man das flash 
beschreiben kann, immer gleich 2 abgezogen werden  durch 
(löschen/schreiben), oder?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flash neu beschreiben ohne vorher zu löschen ist prinzipiell schon 
möglich, allerdings können dabei -wie schon gesagt- lediglich bits von 
'1' auf '0' gesetzt werden, nicht umgekehrt!
Es gibt aber Grenzen, der "Wiederbeschreibbarkeit"!
Les Dir mal das hier durch, insbesondere Kap3.2 und Kap3.3:
http://focus.ti.com/lit/an/slaa334a/slaa334a.pdf

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.