Forum: Mikrocontroller und Digitale Elektronik Bootloader starten


von Johann (Gast)


Lesenswert?

Hallo Leute,

ich verwende momentan 2 XMEGA Mikrocontroller den XMEGA256A3U und den 
XMEGA32A4U. Für beide habe ich bereits einen Bootloader geschrieben. Ich 
habe dabei die ATMEL SP_DRIVER.c verwendet. Das scheint auch schon alles 
ganz gut zu funktionieren.

Ich flashe den Bootloader mit den AVR Studio in den XMEGA. Anschließend 
stelle ich mit Hilfe des AVR Studios das Bootfuse auf Bootloader um und 
schon startet der Bootloader.

Jedoch möchte ich den Bootloader nicht über das AVR Studio starten 
sondern über ein RS232 Kommando. Und genau hier tue ich mich momentan 
sehr schwer.

Hier mein Code:

BOOTRST_BOOTLDR_gc;

CCP = CCP_IOREG_gc;
RST.CTRL = RST_SWRST_bm;

Nur leider startet der Bootloader nicht. Auch wird das FUSE Bit nicht 
verändert. Der Softwarereset wird ausgeführt. Das konnte habe ich 
geprüft.

von Johann (Gast)


Lesenswert?

Aus den Bootloader selber kann ich ja die Fuse mit Hilfe der SP_DRIVER 
manipulieren.

Geht das auch aus der Applitkation herraus dann wäre das ja schon die 
Lösung?

von Johann (Gast)


Lesenswert?

Viele benutzen ja das EIND (Extended Indirect Register). Dies ist ja 
24Bit groß. Das EIND besteht aus dem Z-Register (Low-Byte und Hight 
Byte) und dem EIND (1Byte)

von Johann (Gast)


Lesenswert?

3.10.3 EIND - Extended Indirect Register

EIND is concatenated with the Z-register to enable indirect jump and 
call to locations above the first 128KB (64K words) of the program 
memory

von Axel (Gast)


Lesenswert?

Johann schrieb:
> Geht das auch aus der Applitkation herraus dann wäre das ja schon die
> Lösung?

Hi Johann,

kamst du mitlerweile weiter mit dem Start von deinem Bootloader? Ich ich 
möchte auch aus der Application in den Bootloader jumpen (zB nachdem 
seriell ich ein bestimmtes Command schicke) und frage mich wie es am 
gescheitesten tue. Soll ich es über EIND o. Software Reset machen? Danke

von Purzel H. (hacky)


Lesenswert?

Naja, was ist der Unterschied zwischen einem Jump und einem Reset ? Die 
Register. Passt das so fuer dich ?

von Axel (Gast)


Lesenswert?

Ja, das passt. Danke!

Ich probiere gerade die Lösung mit dem Reset in meiner Application. So 
kann ich, bevor die Hauptschleife im Bootloader startet RST.STATUS-Bit 
abfragen. Nur funktioniert es nicht ganz, wie ich es mir vorstelle....

Nachdem ich RST.CTRL manipuliere, wird das SRF-Flag zwar 1, nur wird 
dieser nicht mehr zurückgesetzt. Soll ich es manuell auf 0 setzen? Sonst 
gelange ich immer in den Bootloader, egal welchen Reset ich mache. Und 
meine (RST.STATUS & RST_SRF_bm) Abfrage nutzt dann nichts. Schreiben mit 
(RST.STATUS &= ~(RST_SRF_bm) hat keine Auswirkung.

Ich habe genauso mit dem WDT-Reset probiert. Genauso hier, nachdem der 
WD STATUS-Bit gesetzt wird, wird dieser nicht zurückgesetzt.

Also wie kann ich die RST.STATUS Register zurücksetzen??

von Axel (Gast)


Lesenswert?

OK, alles klar, wer lesen kann ist klar im Vorteil... Laut Datenblatt: 
"The flag will be cleared by a power-on reset or by writing a one to the 
bit
location." Also anstatt ne 0 zu schreiben, soll man ne 1 setzen.

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.