Gast
#7012836
Hallo zusammen,
ich habe folgendes Bootloader/Software Problem mit dem Xmega32A4U.
Programmiersprache: C
Ich habe eine HauptApplication im folgenden Software(SW) genannt und
einen Bootloader(BL) - beide funktionieren für sich einwandfrei, das
Problem tritt auf wenn ich versuche vom BL zur SW oder von der SW zum BL
zu springen.
Wenn ich den BL erst starte und zur SW springe [ asm("jmp 0x0000") ]
läuft die SW nicht korrekt und es wird beispielsweise USB nicht mehr
initialisiert.
Wenn ich die SW zuerst starte und zum BL springe [ asm("jmp 0x8000") ]
läuft der BL nicht korrekt und es werden falsche Zeichen über die UART
ausgegeben.
Wenn ich einen Hardware-Reset durchführe funktioniert der Start von BL
respektive SW, jetzt stecke ich allerdings fest, da ich in beiden
Richtungen springen muss und ich das BLRST Bit zur Laufzeit nicht ändern
kann.
Ziel ist es OHNE Hardware-Reset von der SW zum BL als auch vom BL in die
SW zu springen. (Watchdog|Soft-Reset|RST-Pin scheiden daher aus)
Ich vermute das irgend ein interner Wert auf dem
Stack/Heap/Rücksprungadresse die Initialisierung behindern und es nicht
ausreicht Interrupts zu deaktivieren (einzeln und global erfolgt) bzw.
Systemclock auf Default (2 MHz) zu setzen.
Da der Hardware Reset funktioniert und Google nichts sinnvolles zum
Thema Warm-Reset ausgespuckt hat, würde mich noch interessieren ob es so
etwas für den Xmega32A4U gibt - Bei definierten Register Zuständen
laufen BL und SW schließlich einwandfrei.
In bestehenden BL Applicationen auf Git habe ich auch keine gravierenden
Unterschiede gesehen um erfolgreich in die SW zu springen und bin für
jeden Hinweis, was hier schieflaufen könnte, dankbar.
Vielen Dank für eure Hilfe!
Mit freundlichen Grüßen
Simon