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