Hallo zusammen,
ich versuche gerade die Funktion eines Firmwareupdates auf einem
ATSAMD51J19 zu implementieren. Hierzu werden per UART Daten vom PC
übertragen und auf die Bank B des Flash (Adresse 0x40000) geschrieben.
Nach CRC-Prüfung der Daten wird final mit
1 | /* wait until it is ready to accept a new command */
|
2 | while (!NVMCTRL->STATUS.bit.READY);
|
3 |
|
4 | /* execute the command BKSWRST (Bank swap and system reset) */
|
5 | NVMCTRL->CTRLB.reg = NVMCTRL_CTRLB_CMD_BKSWRST | NVMCTRL_CTRLB_CMDEX_KEY;
|
6 |
|
7 | /* wait until command done */
|
8 | while (NVMCTRL->INTFLAG.bit.DONE);
|
9 | /* At the end of this command, code starts running from 0x00000 upon reset*/
|
der Bank Swap sowie Reset durchgeführt.
Leider funktioniert das nur selten, bzw eigentlich nur dann, wenn ich
z.B. in der Zeile
1 | (NVMCTRL->INTFLAG.bit.DONE);
|
einen Breakpoint setze. Sonst funktioniert der Bank Swap und Reset
nicht. Nach einem manuellen Reset (z.B. neu einstecken) und auslesen des
NVMCTRL.Status.AFIRST bits ist dann auch keine Änderung zu sehen. Wird
kein manueller Reset durchgeführt, startet der µC auch nicht
selbstständig neu hängt wohl irgendwo?!
Interrupts sind global aktiviert, wobei aber während des Updates aber
nur der Peripheral-Interrupt für den UART freigegeben ist. Alle anderen
sind währenddessen deaktiviert.
Gibt es hier spontan weitere Vorschläge, was man noch beachten muss?
Falls nicht, werde ich versuchen ein Minimalbeispiel zu erzeugen.
Beste Grüße,
Firmwareupdater