Forum: Mikrocontroller und Digitale Elektronik Bootloader ATMega16M1 Einsprung/Wechsel


von Thomas (kosmos)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte einen Bootloader integrieren damit ich den µC aus dem
bestehendem CAN Bus programmieren kann. Ich habe ein paar Fragen die mir
aus dem Datenblatt nicht ganz klar sind.

1. Einspung in den Bootloader, im Datenblatt steht das man das einfach
per Sprungbefehl an die entsprechende Adresse (0x1FFF) durchführen kann
oder in dem die Boot Reset Fuse programmiert wird, so das es eben im
Bootsector startet.

BOOTRST Reset address
1 Reset Vector = Application reset (address 0x0000)
0 Reset Vector = Boot Loader reset

Wenn man aber einfach dort hin springt wird doch bei der weiteren
Ausführung der Application Resetvector benutzt und nicht der Resetvector
des Bootloaders.

Wie kann man das bewerkstelligen, aus dem laufenden Programm in den
Bootloadermodus mit dessem Resetvector(Interrupttabelle)zu wechseln, den
Application Flash Bereich zu programmieren und danach wieder dorthin
wechseln und die Application Interrupttabelle zu nutzen.

Kann mir jemand den Ablauf erklären, wie ich aus dem laufenden Betrieb 
ein Programm im Bootflash ausführen kann und später das neue Programm im 
Apllication Flashbereich ausführe, da ja die Interruptvectoren irgendwie 
gewechselt werden müssen.

von Draco (Gast)


Lesenswert?

Die ISR verbiegen:
1
//Application:
2
3
    unsigned char Temp = GICR;
4
    GICR = Temp | (1<<IVCE);
5
    GICR = Temp & ~(1<<IVSEL);
1
//Boot
2
    unsigned char nTemp = GICR;
3
    GICR = nTemp | (1<<IVCE);
4
    GICR = nTemp | (1<<IVSEL);

Zum Bootloader springen:
1
//...
2
 void (*bootloader)( void ) = 0x1FFF;
3
 // Achtung, ist WORD, am besten in der Hex des BL schauen wo
4
 // der Einsprungsvector ist!
5
6
//...
7
8
 bootloader();

Zurück zum Hauptprogramm, aus dem Bootloader:
1
//...
2
 void (*start)( void ) = 0x0000;
3
//...
4
5
 start();

von Oliver S. (oliverso)


Lesenswert?

Es kommt ja drauf an, ob du nach einem Reset den bootloader oder deine 
Applikation starten willst.

Nach deiner Beschreibung willst du den bootloader von der Applikation 
aus aufrufen. Da brauchst du keinen Resetvektor, der auf den bootloader 
zeigt.

Oliver

von Thomas (kosmos)


Lesenswert?

@Draco: Danke für den Hinweis mit dem IVCE und IVSEL Bit, jetzt konnte 
ich es auch im Datenblatt nachschlagen.

Mit dem BOOTSZ Fuses kann man es fest einstellen, und im MCU Control 
Register kann man es im Betrieb umschalten.

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.