Forum: Mikrocontroller und Digitale Elektronik IAP mit LPC2xxx


von Michael (Gast)


Lesenswert?

Hallo Leute,

ich will daten im Flash meines LPC2148 ablegen.
Die entsprechenden Funktionen für den IAP zugriff zum Vorbereiten und 
schreiben habe ich auch scshon implementier. Diese Funktionieren auch.

Was mir allerdings noch nicht gelingt, ist diese Daten wieder zu lesen.

Wie geht das ? Gibt es da einen Trick, oder denke ich zu kompliziert ?

Viele Grüße

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du kennst die Adresse des Flash-Bereichs, in dem Du die Daten 
unterbringst?

Dann ist's einfach:
1
int* p = (int *) 0xdeadface;  // das sei die Adresse
2
3
printf("Wert %d\n", *p);

Oder habe ich Dich komplett missverstanden?

von Michael (Gast)


Lesenswert?

Nee denke du hast mich richtig verstanden.

Dann war meine Idee eigentlich auch in die richtige richtung,
nur die umsetzung schein noch nicht ganz zu stimmen.

Habe es wie folgt probiert.

-->

#define IAP_LOCATION 0x7FFFFFF1
#pragma location=IAP_LOCATION
__no_init Int8U flashDisk[512];

wenn ich deann flashDisk[0] oder so lese müsste es doch auch gehen.
Oder.

Werde mal deine Variante probieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn Dein Compiler selbst per #pragma dazu gebracht werden kann, 
Variablen an  bestimmten Adressen abzulegen, dann reicht natürlich ein 
Zugriff über den Variablennamen.

Bist Du Dir sicher, daß Du Dein Array an einer nicht ausgerichteten 
Adresse beginnen lassen möchtest?

von Michael (Gast)


Lesenswert?

Du hast recht.

#define IAP_LOCATION 0x80000000.

Funktionieren tut es trotzdem nicht :-(

Hier mal noch ein stück mehr code....

1
Int32U value;
2
    Int32U* p = (Int32U*)0x80000000;
3
    
4
    Int8U vektor[512];
5
    memset (vektor, 'X', 512);
6
    
7
    
8
     iap_entry=(IAP) IAP_LOCATION;
9
    // prepare for write operation
10
    command[0] = 50;
11
    command[1] = 0;
12
    command[2] = 1;
13
    iap_entry(command, result);
14
    
15
    // copy  ram to flash
16
    command[0] = 51;
17
    command[1] = 0x80000000;
18
    command[2] = (Int32U)vektor;
19
    command[3] = sizeof(vektor);
20
    command[4] = 60000;
21
    iap_entry(command, result);
22
    
23
    value= *p

noch eine idee warum das nicht geht ?

von Michael (Gast)


Lesenswert?

also IAP_LOCATION ist jetzt wieder 0x7ffffff1 weil das der LPC so 
braucht.

DAten werden dann ab 0x80000000 gechrieben.

von Michael (Gast)


Lesenswert?

Zur Info:
ich bekomme eine Exception wenn ich versuche *p zu lesen.

von Michael (Gast)


Lesenswert?

Nun ja.... asche auf mein Haupt.

Im Bereich 0x80000000 kann ich natürlich nix lesen und schreiben, wenn 
der flash in den Bereich ab 0x1000 gemapt ist !

--> Jetzt funktioniert es.

Danke für die Unterstützung !

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.