mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik in Atmel DFU Bootloader springen


Autor: CRuS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum.

Ich habe eine Software welche immer beim Gerätestart gestartet werden 
muss. Zusätzlich will ich aber einen Bootloader auf dem Prozessor haben, 
welcher mir es ermöglicht per USB zu flashen und das möglichst per Atmel 
FLIP.

Es handelt sich dabei um einen AT90USB162. Das Gehäuse des gesamten 
Gerätes ist hermetisch verschlossen. Deswegen fällt auch die Möglichkeit 
mit HWBE weg. Das einzige was von außen erreichbar ist, ist die 
USB-Schnittstelle.

Ich benutze für die Entwicklung IAR Workbench 5.11B

Laut dem Atmel Datenblatt zum Bootloader kann man per "special software 
condition" einfach an den Anfang vom Bootloader (0x3800) springen und es 
geht.

So habe ich versucht per asm("jmp 3800") dahin zu springen. Das geht 
aber leider nicht. Er verlässt dabei nicht mal die eigentliche 
Applikation.

Also versuchte ich es damit:
#define CALL(addr)      (((void(*)(void))(char *)addr)())
CALL( 0x3800 );

Damit springt er auch aus der Applikation raus. Aber der Bootloader 
meldet sich nicht richtig per USB an. Er übergibt nur 0x00 als VendorID 
sowie ProductID.

Wenn ich allerdings per BOOTRST den Prozessor beim Start zum Bootloader 
springen lasse, dann funktioniert der Bootloader anstandslos. Also ist 
dieser grundsätzlich okay.

Da meine Applikation Interrupts benutzt habe ich folgendes versucht:
__disable_interrupt();
CALL( 0x3800 );

Führt aber zum gleichem Symptom des Bootloaders.

Im Datenblatt des AT90USB162 habe ich gelesen, dass man die 
Interrupt-Tabellen vom Applikationsspeicherbereich in den 
Bootloaderspeicherbereich verschieben kann. Also habe ich es wie im 
Datenblatt beschrieben gemacht:

MCUCR = (1<<IVCE);
MCUCR = (1<<IVSEL);
CALL( 0x3800 );

Geht natürlich auch nicht g.

Um auszuschließen, dass der Prozessor nicht doch Wortadressen für den 
Sprung erwartet habe ich natürlich alle diese Methoden auch mit den 
Zieladressen 0x1800, 0x1C00 und 0x3000 probiert.

Hat jemand eine Idee was ich falsch mache, einen Vorschlag wie ich den 
Prozessor vor einem Sprung auf einen "nach-Reset-Zustand" setzten kann 
oder einen Vorschlag wie ich es sonst noch machen könnte?

Wie gesagt, ein Timeout am Anfang wäre unpraktikabel und eine 
Reset-Knopf wäre nicht umsetzbar.

Vielen Dank im Voraus,
Matthias

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Beitrag hast Du gelesen:

Beitrag "at90usb162 - Bootloader anspringen?"

Autor: CRuS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan.

Ich habe zwar unzählige Postings gelesen, aber grad diesen nicht. Habe 
wohl leider immer nach den falschen Schlagwörtern gesucht bzw. die 
falschen Überschriften bevorzugt.

Jedenfalls DANKE ich dir über alles. Das war wirklich der entscheidende 
Hinweis.

Vielen, vielen Dank nochmal,
Matthias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.