[MSP430] Flash lesen in C (Assembler geht)

Gast #2914879
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)?
Persönliche Seite #2914933
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.