Forum: Mikrocontroller und Digitale Elektronik XMEGA Bootloader überschreiben


von Martin Z. (martin_z)


Lesenswert?

Hallo!

Ich habe mir anhand von Atmel Application Notes einen Bootloader für 
meinen XMEGA128A4 geschrieben (nutze das Atmel ASF nvm_common_spm). 
Dieser funktioniert soweit auch einwandfrei.
Nun wollte ich zusätzlich ein Updatemechanismus für den Bootloader 
implementieren. Dazu habe ich mir im Bootloader eine zweite Section 
erstellt in der ein Mini-Bootloader für den eigentlichen Bootloader 
liegt. Soweit sieht eigentlich alles gut aus, d.h. im lss liegen alle 
Funktionen da wo sie sollen und ich kann aus der Applikation in meine 
Bootloader-Update-Funktion springen. Diese ließt auch die neue Daten für 
den Bootloader (aus dem Applikationsbereich) jedoch schreiben tut sie 
nicht!
Ich habe es nun auch schon ganz einfach versucht, d.h. mein Bootloader 
sieht wie folgt aus:

int main (void)
{
nvm_common_spm(0x20000, NVM_CMD_ERASE_BOOT_gc);
while (1)
{
   PORTA.OUTTGL = 0x80;  // toggle LED
   delay_ms(300);
}
}

Eigentlich würde ich nun erwarten, dass sich der Bootloader selbst 
löscht und dann nichts mehr macht. Jedoch blinkt meine LED ganz 
munter...

Gibt es noch etwas zu beachten um in die Bootloadersektion zu schreiben? 
Lock-Bits sind keine gesetzt...

Vielen Dank.

: Verschoben durch User
von Wolfgang K. (opendcc)


Lesenswert?

Hallo,

ich habe mal in meinen Bootloader-Updater geschaut (basiert noch nicht 
auf ASF nvm_common_spm), aber den Routinen des NVM muß man normalerweise 
immer Wordadressen übergeben. Also versuchs mal mit 0x10000 beim 
128k-Chip.

Servus Wolfgang

von Martin Z. (martin_z)


Lesenswert?

Hallo Wolfgang,

danke für deinen Hinweis, jedoch will die nvm_common_spm-Routine die 
Byte-Adresse. Mit Byte-Adressen funktioniert es auch wenn ich die 
Applikation neu schreibe. Trotzdem habe ich auch schon die Word-Adresse 
verwendet, aber es passiert einfach nichts.

Gruß
Martin

von Wolfgang K. (opendcc)


Lesenswert?

Hallo,

'zu Fuß' mache ich folgende Schritte:
1
SP_LoadFlashPage(flash_data);
2
SP_EraseWriteApplicationPage(current_page);
3
SP_WaitForSPM();

wobei die Teilschritte aus sp_driver.s von Atmel kommen.

von Martin Z. (martin_z)


Lesenswert?

Hallo Wolfgang,

danke für den Hinweis auf den sp_driver.s. Habe mir den nochmal 
angeschaut und habe dadurch bei mir was gefunden. Jetzt funktionierts.

Grüße
Martin

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin Z. schrieb:
> habe dadurch bei mir was gefunden
Schön wäre es gewesen, wenn du geschrieben hättest, WAS du gefunden 
hast. Na gut wenigstens wissen wir, DASS du was gefunden hast und WIE du 
es gefunden hast...

von Martin Z. (martin_z)


Lesenswert?

Lothar Miller schrieb:
> Martin Z. schrieb:
>> habe dadurch bei mir was gefunden
> Schön wäre es gewesen, wenn du geschrieben hättest, WAS du gefunden
> hast. Na gut wenigstens wissen wir, DASS du was gefunden hast und WIE du
> es gefunden hast...


...ich hätte auch sehr gerne geschrieben was es konkret war. Da ich, 
durch den hier erhaltenen Hinweis, dann noch mehr umgebaut hatte wie 
wahrscheinlich notwendig war, kann ich es nicht mehr so recht 
nachvollziehen.
Meine Vermutung ist, da ich die Befehle aus der asf-Library etwas 
verkürzt hatte, dass mir zwischen NVM-Befehlen eine Überprüfung des 
Statusflag gefehlt hat...

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.