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
Simon schrieb: > läuft der BL nicht korrekt und es werden falsche Zeichen über die UART > ausgegeben. [Glaskugelmodus]Das hört sich irgendwie an als ob du in den beiden Teilen die Hardware nicht richtig/vollständig initialisierst und dich stattdessen darauf verlässt das überall die Resetwerte drinstehen und du nur die jeweils notwendigen Bits änders. Du berücksichtigst vermutlich aber nicht welche du im jeweils anderen Teil bereits verändert hast.[/Glaskugelmodus]
Die Applikation springt in den Bootloader per Reset (Watchdogreset), dann ist alles fein. Der Bootloader springt nach 0x0000, nachdem er sämtliche eigenen Initialisierungen rückgängig gemacht hat. Da Bootloader nur einen einfachen Ablauf haben, ist es in der Regel nicht nötig, überhaupt Interrupts freizugeben. Der Datenempfang kann einfach per Polling erfolgen.
Ich habe in meinen Versuchen mit dem XMega noch folgendes gefunden:
1 | /* Procedure for jumping into the DFU bootloader */ |
2 | /* The normal jumping into the bootloader does not work as described in */ |
3 | /* document 1916, the usb interface does not come up correctly */ |
4 | /* The jumping into the bootloader is done if byte dfu_boot (in the */ |
5 | /* area which is not cleared in reset) contains the value BL_RUN. |
Ich kann aber nicht mehr genau sagen, wie das zusammenhing, ist ueber 6 Jahre her.
Simon schrieb: > ich habe folgendes Bootloader/Software Problem mit dem Xmega32A4U. > Programmiersprache: C Eigentlich ist die verwendete Programmiersprache hier egal. Was ist das für ein Bootlader? (ich selber benutze die Atmels nicht) a) ein vom Hersteller in das Silizium gesetzter Lader, der dann normalerweise außerhalb des normalen Programmspeichers angeordnet ist? b) ein von dir (oder einem anderen Programmierer) geschriebener Bootlader, der irgendwie in den normalen Programmspeicher gesetzt wird und sich den Platz dort mit der eigentlichen Anwendung teilen muß? Im Falle a) gibt es irgendwelche Hardware-Einrichtungen, die ab Reset entscheiden, ob der Bootlader gestartet werden soll oder ob die von dir geschriebene Firmware loslaufen soll. Wenn da der Hersteller nichts vorgesehen hat, um von der Anwendung in den Bootlader zu kommen, geht nur der Weg von außen: Reset und sowas wie Bootmode o.ä. applizieren. Also das Manual zum Chip gründlich durchlesen. Im Falle b) mußt du selber nachdenken, wie du die geordnete Koexistenz von Firmware und Bootlader organisierst. W.S.
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.