Hallo, ich möchte eine .hex Datei über den in LPC812 eingebauten ISP Bootloader einspielen. Dazu konvertiere ich sie vor dem Veschicken in das binäre Format. Das Konvertieren und Flashen funktioniert soweit auch ganz gut. Das Problem ist, dass der Code nach dem Reset nicht ausgeführt wird. Also habe ich mir die von LPCXpresso generierten .bin und .hex Dateien angeschaut. Das erste, was mir aufgefallen ist, ist der Wert 0x49EDFFEF in der .bin Datei bei adress 0x1C. In der .hex Datei ist dieser Bereich mit Nullen gefüllt. Wenn ich nur diese Stelle in der hex Datei ändere und die Checksumme für die Zeile aktualisiere, wird der Code ausgeführt... Wie bekomme ich diesen Wert aus der Hex Datei raus? Oder ist der Wert Hardware-spezifisch für den LPC8xx? In der Hex Datei gibt es noch in der vorletzten Zeile den "Start Segment Address Record", den ich aber wie die meisten hex2bin Konverter ignoriere.
Daniel W. schrieb: > ich möchte eine .hex Datei über den in LPC812 eingebauten ISP Bootloader > einspielen. Dazu konvertiere ich sie vor dem Veschicken in das binäre > Format Was verwendest Du zum Flashen? http://www.flashmagictool.com/ kann HEX direkt runterladen. Zudem kann man checken, ob der Bootloader wirklich läuft, und zum Programm einen Verify machen.
Ich habe meinen eigenen Flasher geschrieben, weil er direkt in eine etwas größere Anwendung integriert wird. Deshalb geht es mir hier eher um das Verständnis, woher der Wert aus der Binärdatei kommt...
Die NXP Controller benötigen an der Adresse 0x1C eine CRC ueber die ersten Bytes in der Vectortabelle. Wenn das nicht uebereinstimmt, springen sie direkt in den Bootloader. Da die IDEs sowas in der Regel von allein machen, kriegt man das erst mit wenn man drauf reinfällt. Ich kenne den LPC812 zwar nicht, denke aber das ist da auch so. Keil z.B. macht das immer beim Flashen von alleine. Ich benutze Crossworks und die machen das ueber ein tool mit dem Namen crossscript.exe. Der JS-Code dazu ist:
1 | function patch(filename) |
2 | {
|
3 | backupFilename = filename + ".prepatch"; |
4 | CWSys.removeFile(backupFilename); |
5 | CWSys.renameFile(filename, backupFilename); |
6 | ElfFile.load(backupFilename); |
7 | |
8 | // das ist der Teil der die CRC erzeugt und ins
|
9 | // elf-File einbaut
|
10 | crc = 0; |
11 | for (i = 0x00; i < 0x1C; i += 4) |
12 | crc += ElfFile.peekUint32(i); |
13 | ElfFile.pokeUint32(0x1C, ~crc + 1); |
14 | |
15 | |
16 | ElfFile.save(filename); |
17 | }
|
Wenn du nur mit hex- und bin-Files umgehst sollte sich das einfach durch ein kleines Programm lösen lassen. Vielleicht kennt ja jemand was fertiges.
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.