Forum: Mikrocontroller und Digitale Elektronik [MSP430] Flash lesen in C (Assembler geht)


von Anonymous (Gast)


Lesenswert?

Guten Tag,

ich habe folgenden Code der mir lesenden Flashzugriff erlaubt:
1
long base=0x00030000;
2
long badr;
3
WORD dat;
4
WORD flpage[128];
5
6
// [...]
7
8
void ReadFlPage(WORD adr)
9
{
10
  WORD anz=128;
11
  badr = base+(adr<<1);
12
  badr&= 0xFFFFFF80;
13
  
14
  while(anz)
15
  {
16
    badr = base+(adr<<1);
17
    
18
    asm("dint");
19
    asm("nop");
20
    asm("mova &badr, r15");
21
    asm("movx.w 0x0(r15),dat");    
22
    asm("eint");
23
24
    flpage[adr]=dat;
25
    adr++;
26
    anz--;
27
  }
28
}

Mit dem Debugger kann ich wunderbar nachvollziehen, dass das Lesen 
klappt. Ich würde jetzt gerne dasselbe einfach in C haben wollen. Mein 
Ansatz:
1
void ReadFlPage(WORD adr)
2
{
3
  WORD anz=128;
4
  badr = base+(adr<<1);
5
  badr&= 0xFFFFFF80;
6
  
7
  while(anz)
8
  {
9
    badr = base+(adr<<1);
10
    long *pFlash = &badr;
11
    
12
     __disable_interrupt(); 
13
    asm("nop");
14
    
15
    dat = *pFlash; // dat wird immer 0?
16
    
17
    //asm("mova &badr, r15");
18
    //asm("movx.w 0x0(r15),dat");
19
    
20
     __enable_interrupt(); 
21
    flpage[adr]=dat;
22
    adr++;
23
    anz--;
24
  }
25
}

dat wird beim derefenzieren des Pointes pFlash immer 0 (es steht aber FF 
im Speicher). Wie bilde ich die auskommentierten Assemblerbefehle 
korrekt in C ab?

Und nebenbei: Wieso funktioniert das Schreiben nicht mit dem 
Beispielcode von TI: 
http://www.ece.uah.edu/~jovanov/msp430/FlashTemplate_F149.pdf? Hier mein 
angepasster Code:
1
void write_SegA(WORD value) {
2
    long base = 0x00030000;
3
    long badr = base + ((long) 0 << 1);
4
    long *Flash_ptr = &badr; // Initialize Flash pointer ; // Flash pointer 
5
    unsigned int i;
6
7
    FCTL1 = FWKEY + ERASE; // Set Erase bit 
8
    FCTL3 = FWKEY; // Clear Lock bit 
9
    
10
11
    *Flash_ptr = 0; //Dummy write to erase Flash segment 
12
    FCTL1 = FWKEY + WRT; // Set WRT bit for write operation 
13
    for (i = 0; i < 128; i++) {
14
        *Flash_ptr++ = value; // Write value to flash 
15
    }
16
    FCTL1 = FWKEY; // Clear WRT bit 
17
    FCTL3 = FWKEY + LOCK; // Reset LOCK bit 
18
}

Es passiert nichts, im Speicher bleibt stets FF anstatt value? Liegt das 
vlt. an meinem Prozessor (MSP430F5438A)?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was bitte treibst Du da?

Das Flash ist beim MSP430 mit einem ganz simplen Pointerzugriff zu 
lesen, exakt genauso wie das RAM zu lesen ist.


Wenn Du Dir Beispielcode zum Beschreiben des Flash ansehen willst, dann 
nimm Beispielcode, der zum von Dir verwendeten MSP430-Familienmitglied 
passt. Der 'F5438 hat einen anderen CPU-Kern als der steinalte 'F149.

Codebeispiele findest Du bei TI, die für den 'F5438 hier:

http://www.ti.com/litv/zip/slac375c

hier insbesondere msp430x54xA_flashwrite_02.c

von Neumann (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das Flash ist beim MSP430 mit einem ganz simplen Pointerzugriff zu
> lesen, exakt genauso wie das RAM zu lesen ist.

weil von Neumann :-)

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.