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.
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(); |
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.