Hallo, ich bin gerade dabei einen Weg zu finden meinen SAM7A3 über RS232 updatefähig zu machen. Das heißt ich suche einen Weg ihn "in field" mit neuer Firmware zu bespielen. Dazu dachte ich mir, setze ich einen einfachen bootloader auf adresse 0x0 des internen flash, der nach einem Timeout automatisch auf Adresse 0x8000 springt, wo die Firmware liegt. Wird vor Ablauf des Timeouts über die rs232 ein Steuerkommando gesendet ermögliche ich das beschreiben des Flash. Ich arbeite hier mit der IAR EWARM. Ich habe den Sprung vom Bootloader zur Firmware folgendermaßen getestet: asm ( "mov r0, #0x00008000\n" "BX r0 \n" ); dieses Stück inline Assembler funktioniert einwandfrei. Problem ist jetzt, die Firmware findet nun keinen frisch resetteten Controller mehr vor und lässt ihren Startup-Code da drüber laufen. Es klappt alles bis ich zum __enable_interrupt() komme. Dort spielt er dann verrückt. Wahrscheinlich stimmt entweder etwas mit der Interrupt Vektor Tabelle nicht oder er kommt in die Systeminterrupts (Abort, Spurious, o.ä.). Meine Frage ist jetzt, da ich den Sprung von "BootLoader" zu Firmware schon etwas rücksichtslos durchführe, was muss ich beachten um einen sauberen Softwarewechsel durch zu führen ohne den Prozessor zu resetten? Beziehungsweise kennt jemand eine fertige Software die soetwas kann? hatte schon an RedBoot o.ä. gedacht. Aber der SAM7A3 hat nur 32k RAM, da kann ich die Firmware nicht erst in den RAM kopieren bevor ich sie laufen lasse. Und Redboot an sich würde schon ein drittel meiner 256k internen Flash fressen. Vielen Dank schonmal.
Ok, ich habe jetzt einfach die irq vector tabelle des BootLoaders kurz nach dem Branch mit der der Firmware überschrieben. Das scheint bis jetzt zu funktionieren.
Mit diesem Problem habe ich mich auch gerade für den SAM7S beschäftigt und das gefunden:
1 | asm("swi 0x00"); //swiSoftReset(); |
2 | asm("bx lr"); |
Und was machen die 2 Zeilen? ;) Habe jetzt das Problem, dass mein Bootloader aus dem Flash läuft. Wenn ich also nun versuche den Flash aus dem er läuft zu Flashen, bleibt er natürlich stehen. Wie kann ich das umgehen?
Wenn ich das richtig verstehe setzt der swi Befehl den SAM in den Supervisor-Modus. Anschließend wird zu lr = Linkregister Adresse gesprungen. Hier noch einmal im Zusammenhang: http://sylvainhb.blogspot.com/2007/08/arm7-et-arm9-sont-sur-un-bateau-arm9.html Da das ganze Thema aber nicht so einfach ist schau erst mal hier in den arm Beispielen: http://www.mikrocontroller.net/articles/Bootloader
Naja, wie gesagt, das Springen zur Firmware geht soweit. Ich habe nur das Problem mit meinem Bootloader, der aus dem Flash läuft andere Bereiche im Flash zu programmieren. Gibt es eine Möglichkeit den Bootloader aus dem SRAM laufen zu lassen (ohne jtag) ?
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.