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
> 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.
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
Hey, in der Gefahr das ich mich jetzt oute: Was meinst du mit "thumb code" ? danke Mike
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).
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.