Forum: Mikrocontroller und Digitale Elektronik LPC2103 - Daten persistent speichern


von Mike (Gast)


Lesenswert?

Hallo,

mache gerade meine ersten Erfahrungen mit dem LPC2103(Olimex Board) und 
bin momentan an dem Punkt, wo ich spezifische Daten(z.B. Seriennummer) 
im Mikrocontroller speichern möchte.

Jetzt meine allgemeine Frage. Wie funktioniert das beim LPC2103? Ist 
hier der Ansatz über den Flash und IAP der richtige oder sollte man dies 
anders lösen?

danke
Mike

von Frank N. (arm-fan)


Lesenswert?

> Ist hier der Ansatz über den Flash und IAP der richtige oder
> sollte man dies anders lösen?

Wenn du ohne externe Bauelemente (ser. EEPROM, etc.) auskommen wilst,
dann ist das genau der richtige Weg.

von Mike (Gast)


Lesenswert?

Hallo,

danke für die Antwort.

Bin gerade dabei die Flash und IAP zu implementieren.
Code wie folgt:

[c]
/************** defines 
******************************************************/
#define IAP_LOCATION 0x7FFFFFF1

/************** module internal variables 
************************************/
unsigned char write[512];
typedef void (*IAP)(unsigned int [],unsigned int[]);
IAP iap_entry;

unsigned char flashiap_WriteBlock(void)
{
  unsigned int uiCMD[5];            // store command
  unsigned int uiResult[2];         // store result


  memset(write, 'A', 512);          // dummy to test

  iap_entry=(IAP) IAP_LOCATION;     // map function

  // prepare for write operation
  uiCMD[0] = 50;                    // prepare sector for write 
operation
  uiCMD[1] = 1;                     // start sector 1 @ 0x00001000
                                    // ... 0x00001FFF
  uiCMD[2] = 1;                     // end sector 1 @ 0x00001000
                                    //... 0x00001FFF
  iap_entry(uiCMD, uiResult);       // execute command
  if (uiResult[0] != FLASHIAP_CMD_SUCCESS)
    return uiResult[0];

  // copy  ram to flash
  uiCMD[0] = 51;                    // copy data from RAM to flash
  uiCMD[1] = 0x1000;                // write @ 0x00001000 ...
                                    // 0x00001FFF (sector 1)
  uiCMD[2] = (unsigned int) write;  // set data source pointer
  uiCMD[3] = 512;                   // write 512 bytes
  uiCMD[4] = 60000;                 // CPU CLK = 60MHz
  iap_entry(uiCMD, uiResult);       // execute command

  return uiResult[0];
}[\c]

Teste ich die Funktion mit dem Debugger, erkenne ich, dass diese ohne 
Fehlercode(also erfolgreich) vom IAP durchgeführt wird. Betrachte ich 
jetzt aber den Flash Memory ab 0x1000 hat sich hier nicht verändert.

Habe ich noch etwas vergessen?
Ich benutze Rowley CrossStudio, falls dies noch von Interesse sein 
sollte.

danke
Mike

von (prx) A. K. (prx)


Lesenswert?

Die IAP Adresse riecht nach Thumb-Code. Berücksichtigt?

von Mike (Gast)


Lesenswert?

Hey,

in der Gefahr das ich mich jetzt oute:

Was meinst du mit "thumb code" ?

danke
Mike

von (prx) A. K. (prx)


Lesenswert?

Mike wrote:

> Was meinst du mit "thumb code" ?

http://en.wikipedia.org/wiki/ARM_architecture#Thumb

Ungerade Adressen (Bit0=1) riechen nach Thumb Code. Wenn der aufrufende 
Code nativer ARM Code ist, dann wird ein Compiler alle Funktionen auch 
als nativen ARM Code auszuführen versuchen, es sei denn man teilt dem 
Compiler mit, dass er mit einem Mix aus ARM und Thumb Code zurecht 
kommen muss (interworking, siehe Rowley Doku).

von Mike (Gast)


Lesenswert?

Hallo

NXP Doku

"... The IAP routine resides at 0x7FFF FFF0 location and it
is thumb code. ..."

Habe mal in den Projekteigenschaft(CrossStudio) nachgeschaut und hier 
war bereits das interworking aktiviert.

Das Problem besteht also weiterhin.

danke
Mike

von Mike (Gast)


Lesenswert?

Hallo,

hat schon mal jemand CrossStudio, LPC2103 + IAP zum Laufen gebracht?

Ich stehe echt auf dem Schlauch und weiß eigentlich nicht, warum ich die 
geschriebenen Daten nicht im entsprechenden Flashbereich sehen kann.

Gibt es noch einen Offset oder ähnliches, was zu berücksichtigen ist?

Wenn ich via IAP auf die Adresse 0x00001000 schreibe, dann muss ich doch 
über ein Memory Watch @ 0x00001000 die geschriebenen Bytes sehen oder 
nicht?

Danke
Mike

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Mit LPC2103 noch nicht gearbeitet, jedoch mit anderen LPC2k. Somit unter 
Vorbehalt:

Betr. THUMB: es ist wie schon geschrieben. IAP-Funktion ist thumb-code. 
Um sicherzustellen, dass dies richtig übersetzt wurde, Assembler-Listing 
oder Disassembly anschauen. Dort sollte irgendwo ein Register mit der 
"Entry-Adresse" geladen werden und kurz darauf ein bx Register folgen. 
Falls der Debugger durchgelaufen ist, wird da aber wahrscheinlich schon 
o.k. sein (sonst wäre wohl eine Exception aufgetreten). Ansonsten hilft 
eine Minifunktion in inline-Assembler bei GNU-Tools weiter.

Welche Wert hat der return-code von "ram to flash"?

Betr. "flashen" allgemein: falls der Sektor, in dem die zu beschreibende 
Seite(n) liegt/liegen nicht schon gelöscht wurde: vorher löschen. Also 
testweise diese Abfolge:
1. prepare sector(s) for write
2. erase sector(s)
3. prepare sector(s) for write (also nochmal 1)
4. copy ram -> falsh
Erase muss man nicht jedes mal von neuem ausführen, wenn eine weitere 
Seite (page) geschrieben werden soll, die zu einem Sektor gehört, der 
vorher schon gelöscht wurde. Nur "Seite überschreiben" funktioniert 
nicht, falls diese bereits vorher geschrieben wurde. Wenn man 
"überschreiben/ändern" will, muss der Sektor, zu der die Seite gehört, 
vorher gelöscht werden.

von Mike (Gast)


Lesenswert?

Hey,

ich habe immer noch Probleme mit dem Speichern von Daten im Flash via 
IAP.

Ich vermute aber, dass ich noch einen Fehler in der CrossStudio 
Konfiguration habe. Ich habe hier "Active Configuration" -> "ARM Flash 
Debug" selektiert. Der Programmcode wird also auch ins Flash kopiert. Da 
der Programmcode aber nur die unteren Segmente belegt, müßte es doch 
möglich sein, das oberste Segment(@ 0x00007000) mit spezifischen Daten 
zu belegen. Anscheinend führt dies aber zu Problemen. Führe ich die 
Kopierfunktionen aus und versuche dannach im Debugmodus den Flash 
auszulesen, bekomme ich von CrossStudio Fehlermeldungen wie:

"Loader verify failed"

Wenn ich mir die "Philips_LPC2103_MemoryMap.xml" angucke, so ist zu 
erkennen, dass der Bereich von 0x00000000 ... 0x00008000 als ReadOnly 
deklariert ist.

Die Möglichkeit die aktive Konfiguration auf "ARM RAM Debug" zu setzen 
entfällt, da die Codegröße den erlaubten Bereich schon überschritten 
hat.

Danke
Mike

von Mike (Gast)


Lesenswert?

Hallo

Problem ist jetzt gelöst. Mein Fehler war, dass zwar das ARM/Thumb 
interworking aktiviert war, aber man muss noch separat das instruction 
set für die IAP Zugriffe auf Thumb setzen. Ein generelles Setzen des 
Thumb Mode funktioniert nicht, da für alle ISR's der ARM mode aktiviert 
sein muss.

Immer wieder spannend zu sehen, wie lange man an einem Problem sitzen 
kann, dass dann durch Veränderung einer Kleinigkeit gelöst werden 
konnte.

gruss
Mike

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.