Forum: Mikrocontroller und Digitale Elektronik MSP430F149 Flashwrite


von Gerd K. (struuve)


Lesenswert?

Hallo,

weiß jemand wie ich in das Infosegment A einen Wert schreiben kann? 
Folgenes Listing zeigt wie ichs machen will, sieht jemand den Fehler?
  Flash_ptr = (char *) 0x1080;        // Initialize Flash pointer
  while(FCTL3 & BUSY);
  FCTL2 = FWKEY + FSSEL_1 + FN0;      // MCLK/2 for Flash Timing 
Generator
  FCTL3 = FWKEY;                      // Clear Lock bit
  FCTL1 = FWKEY + WRT;                // Set WRT bit for write operation
  P5OUT |=0x01;
  *Flash_ptr = 0x33;                  // Write value to flash
  while(FCTL3 & BUSY);
  P5OUT &=~0x01;
  FCTL1 = FWKEY;                      // Clear WRT bit
  FCTL3 = FWKEY + LOCK;               // Set LOCK bit

Am Port5.4 messe ich einen MCLK von 714kHz

Gruß
Gerhard

von Christian R. (supachris)


Lesenswert?

Was ist denn das Problem? Schon mal das TI-Beispiel angeschaut? Da steht 
doch alles drin.

von Gerd K. (struuve)


Lesenswert?

Hallo Christian,
das Problem ist, dass am Ende nichts im Flash-Speichersegment steht, 
alles FF. Natürlich habe ich das Beispiel von TI probiert, läuft auf 
meinem Eval.-Board auch nicht. Selbst der User-Guide hat mir nicht 
wesentlich weitergeholfen.

Gruß

von Christian R. (supachris)


Lesenswert?

Das hier klappt auf dem F1611 wunderbar:
1
unsigned char WriteInfoMemA(unsigned int *Data, unsigned char NumWords)
2
{
3
  if(NumWords < 129)
4
  {
5
    _DINT();
6
    WDTCTL = WDTPW + WDTHOLD;                       // Stop watchdog timer
7
      FCTL2 = FWKEY + FSSEL_SMCLK + FN1 + FN3;      // SMCLK/10 for Flash Timing Generator -> ~ 400Khz
8
    unsigned int *FlashPtr;
9
    unsigned char i;
10
    FlashPtr = (unsigned int*)0x1080;
11
    FCTL1 = FWKEY + ERASE;                    // Set Erase bit
12
      FCTL3 = FWKEY;                            // Clear Lock bit
13
      *FlashPtr = 0;                           // Dummy write to erase Flash segment
14
    FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
15
    
16
    for (i=0; i<NumWords; i++)
17
      {
18
        *FlashPtr++ = *Data++;                   // Write value to flash
19
      }
20
  
21
      FCTL1 = FWKEY;                            // Clear WRT bit
22
      FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
23
    _EINT();
24
    return i+1;
25
  }
26
  else return 0;
27
}
Mein SMCLK läuft mit 4,096MHz.

von Gerd K. (struuve)


Lesenswert?

Hallo Christian,

vielen Dank, ich habe dein Listing angepasst und ausprobiert, aber auch 
damit sehe ich keine Änderung im Flashsegment. Ich bin etwas ratlos, ich 
gehe jetzt erstmal eine Runde laufen.

Gruß

von Jörg S. (joerg-s)


Lesenswert?

Auch wenn auf dem ersten Blick die Takt Einstellungen auch OK scheinen, 
würde ich mal in der Richtung rumprobieren.

von Christian R. (supachris)


Lesenswert?

Vielleicht hast du in deinem Debugger eingestellt, er soll beim Flashen 
den Infomem mit löschen? Der Takt ist eigentlich recht weitläufig 
erlaubt...

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.