Forum: Mikrocontroller und Digitale Elektronik USB Bootloader AtxMega64A3U aus der Applikation starten


von Georg X. (schorsch666)


Lesenswert?

Hallo Leute,

ich versuche im Moment den USB-UDF Bootloader mit der Version 1.04 auf 
meinem
AtxMega63A3U zum Laufen zu bekommen.

Ich möchte den bootloader aus meiner Applikation starten.
Die Abfrage des IOs zum Starten des Bootloaders habe ich ausgebaut.
So dass dieser starten sollte. Kompiliert habe ich mit IAR.

Die Fusebits habe ich auf die Applikaiton gestellt.

In meiner Applikation benutze ich die USB-Schnittstelle um mit dem PC zu
kommunizieren. USB-Stack läuft als HID-Gerät. Ich arbeite mit dem 
AVR-Studio 6.

Mir fehlt jetzt noch der Jump aus der Applikation in den Bootloader.
Ich habe zwar schon einiges hier gelesen aber ich kriege es nicht hin.

Hat jemand dies schon zuverlässig lösen können?

Ich habe folgenden Code getestet. Aber leider lande ich damit immer 
wieder in der Applikation.

void (*start_bootloader) (void)=(void (*)(void))BOOT_SECTION_START + 
0x1FC;

cpu_irq_disable();
start_bootloader();

Danke.

Gruß,
Georg.

von blinki (Gast)


Lesenswert?

eingentlich musst Du doch nur einen Reset erzeugen (z.B. per Watchdog) - 
um den Bootloader zu aktivieren, oder?

von Georg X. (schorsch666)


Lesenswert?

Hallo,

ja das geht natürlich auch. Aber dann muss ich die Fusebits auf 
Bootloader setzen und dieser würde dann nach jedem Anlegen der 
Versorgung gestartet. Dass möchte ich eigentlich nicht. Es soll die 
Applikation gestartet werden und aus dieser auf Anweisung der 
Bootloader.

Außer ihr kennt noch einen anderen eleganteren Weg?

Gruß,
Georg.

von Max D. (max_d)


Lesenswert?

Georg X. schrieb:
> Außer ihr kennt noch einen anderen eleganteren Weg?

Ich kenn einige Applikationen die einen "Soft-Jumper" im EEPROM nutzen.

Ansonsten noch die Fragen: Ist "BOOT_SECTION_START" richtig definiert ?
Sicher, dass dein Bootloader noch lebt (ISP überschrieben oder so ?)

von Georg X. (schorsch666)


Lesenswert?

Hallo,


#define BOOT_SECTION_START     (0x10000)

Der Bootloader lebt bzw. ist im Bootsector abgelegt. Meine Applikation 
überschreibt diesen Bereich nicht. Ich habe das Projekt so konfiguriert 
dass nur der Applikationsbereich gelöscht wird.
Den Bootloader kann ich auch testen wenn ich die Fusebits auf Bootloader 
setze und dann versuche die Applikation zu debuggen. Da wird automatisch 
erst der Bootloader gestartet. Zu sehen an der USB-Anmeldung am PC.

Wie hast du deine Soft-Jumps realisiert?

Gruß,
Georg.

von Hans M. (Gast)


Lesenswert?

Und was ist, wenn du im EEPROM vom Hauptprogramm für den Bootloader eine 
Info hinterlegst und dann den Reset ausführst?
Der Bootloader schaut dann im EEPROM nach, ob er sich selbst ausführen 
oder in die Hauptapp springen soll.

Hans

von blinki (Gast)


Lesenswert?

Georg X. schrieb:
> Hallo,
>
> ja das geht natürlich auch. Aber dann muss ich die Fusebits auf
> Bootloader setzen und dieser würde dann nach jedem Anlegen der
> Versorgung gestartet. Dass möchte ich eigentlich nicht. Es soll die
> Applikation gestartet werden und aus dieser auf Anweisung der
> Bootloader.
>
> Außer ihr kennt noch einen anderen eleganteren Weg?
>
> Gruß,
> Georg.

Na dann - wie oben schon erwähnt - ein Kennzeichen im Eeprom setzen, den 
Bootloader grundsätzlich starten und bei gesetztem EEprom-Kennzeichen 
sofort die Application starten.

Am Anfang der Application Kennzeichen zurücksetzen, wenn bootloader 
aufgerufen werden soll: Kennzeichen setzen und booten per watchdog.

Nur mal so interessehalber: Wofür brauchst Du den Bootloader, wenn Du 
ihn gar nicht vewenden willst?

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.