Hallo Forum, Ich habe vor, den USB Bootloader von Atmel über Flip in den ATXMega128AU3U zu integrieren. Jetzt meine Frage, da die Hardware der Anwendung schon fertig ist wollte ich die Möglichkeit nutzen, den Bootloader aus der Applikation heraus anzuspringen. Wäre es möglich, bei dem entsprechenden Pin (E3) des Xmega den Pulldown zu setzen und dann den Reset über die Software auszulösen, oder wird der Pulldown beim Reset wieder gelöst? Danke für Eure Ideen VG Daniel
> Wäre es möglich, bei dem entsprechenden Pin (E3) des Xmega den Pulldown > zu setzen und dann den Reset über die Software auszulösen, oder wird der > Pulldown beim Reset wieder gelöst? Der Reset dient dazu die Register in einen definierten Zustand zu versetzen - IO-Register gehören i.d.R. ebenfalls dazu (das Datenblatt kann's dir sagen, ob's bei deinem Controller auch so ist). Ich kenne die (X)Mega's nicht im Detail, aber soweit ich weiss implementieren diese eine Bootloader-Fuse, d.h. wenn du die setzt springt der Controller beim Reset erstmal in die Bootloader-Sektion. Du könntest einen Bootloader schreiben, der dann den Pin prüft und entsprechend agiert. Zusätzlich könntest du nette Features wie eine Integritätsprüfung des Firmware-Images etc. einbauen uswusf. Ralf
Du kannst per Software einfach an "BOOT_SECTION_START/2 + 0x1FC/2" springen, so wie in der dfu Doku beschrieben (zumindest musst du bei gcc durch zwei teilen wegen der Wort-Adressierung)
Vielen Dank Timmo :-) Das nüsste sich doch dann so realisieren lassen, oder?
1 | void (* boot_loader) (void); |
2 | |
3 | boot_loader = (BOOT_SECTION_START >> 1) + (0x1FC >> 1); |
4 | |
5 | boot_loader(); |
(Code im Forum gefunden und etwas angepasst) Danke. Daniel
Ich habe noch etwas recherchiert und im ASF etwas Beispielcode gefunden. Funktioniert perfekt :-) Die Bootloader Fuse ist auf "Application" gesetzt.
1 | void(* start_bootloader)(void) = (void (*)(void))(BOOT_SECTION_START/2+0x1FC/2); |
2 | |
3 | void UpdateFW(void) |
4 | {
|
5 | udc_stop(); |
6 | EIND = BOOT_SECTION_START>>17; |
7 | start_bootloader(); |
8 | }
|
Danke nochmal an die Mithelfer :-)
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.