Forum: Mikrocontroller und Digitale Elektronik USB MSC Bootloader mit Arduino Due


von Yannik S. (stegy97)


Lesenswert?

Hallo,

ich bin seit Jahren Leser dieses Forums und bin jetzt zum ersten mal 
nicht fündig geworden:

Ich habe für den Arduino Due einen Bootloader geschrieben, der im Flash1 
sitzt und beim Start direkt geladen wird (GPNVM für Flash1 gesetzt). 
Dieser sucht auf einem USB Stick nach einer aktuelleren Firmware als die 
bereits installierte und schreibt diese gegebenenfalls an die Adresse 
0x80000 (Also beginn von Flash0).

Das Problem: Wenn die Firmware geschrieben ist, springt er scheinbar 
nicht an die richtige Stelle, bzw. das Programm in Flash0 wird nicht 
ausgeführt.

Das komische ist, die Firmware habe ich separat getestet und stand dabei 
genau an der gleichen Adresse, wie es der Bootloader schreiben würde 
(0x80000). Auch nachdem der Bootloader die Firmware geschrieben hat, ist 
das Speicherabbild von Flash0 identisch mit dem, das ich beim Test 
gelesen hab. Demnach funktioniert der Bootloader für sich schon, nur 
springt er danach nicht zu 0x80000.

Hat jemand eine Idee? Würde mich über jede Denkanregung freuen!

MfG Yannik

: Verschoben durch User
von Jim M. (turboj)


Lesenswert?

Yannik S. schrieb:
> Ich habe für den Arduino Due einen Bootloader geschrieben

Aha, Wo ist der Quellcode?

Yannik S. schrieb:
> Das Problem: Wenn die Firmware geschrieben ist, springt er scheinbar
> nicht an die richtige Stelle, bzw. das Programm in Flash0 wird nicht
> ausgeführt.

Tja, da haste dann einen Fehler drin. Von allein springt der nicht im 
Flash rum, und Cortex-M Programme haben an der untersten Addresse eine 
Vektortabelle und keinen ausführbaren Code. Also ist einfaches nach 
0x8000 springen schon mal falsch -> Hardfault.

von Stromverdichter (Gast)


Lesenswert?

Hallo Yannik,
warum schaust du nicht mit einem Debugger, an welche Adresse er springt?
Wenn du einen Bootloader schreiben kannst, weißt du auch sicherlich, wie 
die Linker-Skripte jeweils anzulegen sind?
Wohin springst du? In den Reset-Handler des neuen Programmbereiches?
Werden die Interrupt-Vektoren auch passend für den neuen Bereich 
umgestellt?
Schau dir doch mal an wie das andere machen. Ohne deinen Code 
preiszugeben, wirst du nur sehr schwer Hilfe bekommen können.
Ja wohin springt denn nun dein Bootloader?
Das kann dir keiner beantworten, außer du selbst.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jim M. schrieb:
> und Cortex-M Programme haben an der untersten Addresse eine
> Vektortabelle und keinen ausführbaren Code.

… wobei es ja fast passt: der erste Eintrag ist der Wert des
neuen Stackpointers (den der Bootloader selbst entsprechend
setzen sollte, bevor er die Firmware anspringt), der zweite ist
der Reset-Vektor.

von Yannik S. (stegy97)


Lesenswert?

Hallo!

Vielen Dank, dass ihr euch mit meinem Problem beschäftigt habt!

Stromverdichter schrieb:
> Wenn du einen Bootloader schreiben kannst, weißt du auch sicherlich, wie
> die Linker-Skripte jeweils anzulegen sind?

Kann ich eben nicht ;) Aber das mit dem Linken klappt wenigstens.

Nachdem ich alle euren Tipps berücksichtigt hab, komme ich zu folgendem 
(funktionierenden!!!!) Code zum laden der Software:
1
void (*application_code_entry)(void);
2
3
__disable_irq();
4
__set_MSP(*(uint32_t *)IFLASH0_ADDR);
5
6
for (int i = 0; i < 8; i ++) NVIC->ICER[i] = 0xFFFFFFFF;
7
for (int i = 0; i < 8; i ++) NVIC->ICPR[i] = 0xFFFFFFFF;
8
9
SCB->VTOR = ((uint32_t)IFLASH0_ADDR & SCB_VTOR_TBLOFF_Msk);
10
11
__enable_irq();
12
application_code_entry = (void (*)(void))(unsigned *)(*(unsigned *)(IFLASH0_ADDR +4));
13
application_code_entry();

Also wirklich nochmal vielen Dank an euch alle, ihr habt mir wirklich 
sehr geholfen!

Yannik

: Bearbeitet durch User
von Stromverdichter (Gast)


Lesenswert?

Hallo Yannik,
schön dass dein Code funktioniert. Ich finde es auch gut, dass du uns 
den Code zeigst. Es wäre für alle, und auch für dich hilfreich, wenn du 
im Code kommentierst, was welche Zeile macht. Z.B.:
//Interrupts abschalten
//anstehende Interrupts löschen
...
Wenn du in einem Jahr mal wieder an den Code ran musst, findest du dich 
dann viel leichter zurecht.

Schönes WE,
Stromverdichter

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.