Forum: Mikrocontroller und Digitale Elektronik AT91SAM7A3 boot loader


von Benjamin R. (sensed)


Lesenswert?

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.

von Benjamin R. (sensed)


Lesenswert?

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.

von hp-freund (Gast)


Lesenswert?

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");

von Benjamin R. (sensed)


Lesenswert?

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?

von hp-freund (Gast)


Lesenswert?

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

von Benjamin R. (sensed)


Lesenswert?

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
Noch kein Account? Hier anmelden.