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)?