Hi,
ich baue derzeit für ein Projekt eine Bootloader Firmware in C für den
o.g. Mikrocontroller. Die Bootloader Firmware soll bei jedem Start
ausgeführt werden. Ziel der Bootloader Firmware ist es:
1) Checken, ob eine valide Firmwareversion in mindestens einer von zwei
Flash-Regionen vorliegt. Sind valide Firmwareversionen vorhanden? Dann
lade die neueste Version. Ich möchte hierfür Flash Sektor 8-9(ab
0x08080000) und 10-11(ab 0x080C0000) verwenden. Diese Regionen habe ich
bereits im Linkerscript des Bootloaders vermerkt. Hier habe ich noch
nicht dran gearbeitet. Meine Idee ist, an festen Positionen im Flash
eine Prüfsumme zu hinterlegen, die dann durch Auslesen des Flashs
verifiziert werden kann.
2) Firmwareupdate per RS485 Schnittstelle als .Hex File. Ist keine
valide FW-Version vorhanden ODER ist ein FW-Update explizit gewünscht,
lass dir von einem PC eine neue FW-Version als .Hex File übertragen.
Was hierbei bereits funktioniert: Per PC liest das.Hex-File aus, dieses
wird Zeile für Zeile übertragen. Die Datenverarbeitung des .Hex-Files
funktioniert auch. D.h. ich erhalte entsprechend
https://de.wikipedia.org/wiki/Intel_HEX#End_of_File_Record_(Typ_01)
Bytecount, Adresse, Typ, Datenfeld und Prüfsumme. Die Verarbeitung des
Addressoffsets passt auch. Jede Zeile wird auch bereits per Prüfsumme
verifiziert. Im Prinzip schaffe ich es auch, den Flash jetzt ab der
angegebenen Adresse Byte pro Byte zu beschreiben.
Ich habe mir ein Probeprogramm geschrieben, zu dem der Bootloader nach
dem Flashprozess springen soll. Bei dem Compilieren dieses
Probeprogrammes habe ich im Linker den ROM - Bereich auf die absolute
Adresse 0x08080000 geändert und habe das Vector Table Offset auf
0x00080000 gestellt. ABER:
Wie springe ich nach erfolgreichem Flashen zu dem Programm? Muss ich
wirklich einfach nur an die gegebene Adresse springen mit irgendeiner
Art Jump Befehl?