Hallo, da habe ich ein merkwürdiges verhalten vom Bootloader des STM32L431 festgestellt. (Oder ich hab die passende Stelle in den Datenblättern überlesen) Fall 1: Es ist bereits Software auf dem L4 und es soll per Bootloader eine neue Software aufgespielt werden. Dazu wird der L4 in den Reset gezogen und der BOOT0 Pin auf HIGH gezogen und dann der Resetzustand beendet. (Alle Timings sind eingehalten) Der Bootloader ist per UART ansprechbar, die Software wird draufgebügelt. Danach wieder am Reset wackeln und dabei BOOT0 auf LOW halten. -> Das funktioniert, die neue Software meldet sich. Fall2: Der L4 ist fabrikneu, also Flash leer. Daher muss eine initiale Software drauf. Dazu wird der L4 in den Reset gezogen und der BOOT0 Pin auf HIGH gezogen und dann der Resetzustand beendet. (Da der Flash leer ist, wird der BOOT0 Pin laut DB eh ignoriert, alle Timings sind eingehalten) Der Bootloader ist per UART ansprechbar, die Software wird draufgebügelt. Danach wieder am Reset wackeln und dabei BOOT0 auf LOW halten. -> Das funktioniert NICHT, der Bootloader meldet sich wieder. Damit die aufgespielte Software sich meldet braucht es einen Powercycle. Laut Datenblatt wird der BOOT0 Pin 4 Takte nach dem Reset L->H gesampelt. Zudem wird geprüft ob die erste Adresse im Flash nicht 0xFFFFFFFF ist. Dass der sich da was über den Resetzustand hinüber weg merkt ist nicht definiert. Jetzt wirds interessant: Führe ich nur einen Chip Erase aus (per J-Flash), dann tritt Fall 1 ein. Kommt nach dem Chip Erase noch ein Powercycle, dann tritt Fall 2 ein. Was ist denn da los? Hab ich irgendwo im DB noch was überlesen? Es ist ja recht verteilt über Refman, UART Bootloader Protokol und allgemine Bootloaderbeschreibung.
Gast
#6657683
Mw E. schrieb: > Hab ich irgendwo im DB noch was überlesen? Jein, im RM. "A Flash empty check mechanism is implemented ...". Dieser wird beim Laden der Option Bytes durchgeführt, und dies wiederum nur beim Power-On Reset. Oder beim setzen von OBL_LAUNCH. Im RM für den L431 steht das nicht (oder ich hab's übersehen) ausdrücklich, aber in einigen anderen, die auch den "Flash empty check" haben, ist das so erwähnt.
Gut Danke! Dass die Optionbytes nur geladen werden werden beim POR ist mir bekannt. Dass dann auch der empty check stattfindet war mir nicht bekannt und steht im L431 Refman wirklich nicht drinne. Daher hab ich mal willkürlich eins vom G071 geöffnet. Da gibts direkt im Flash Kapitel ein Eintrag dazu:
1 | |
2 | |
3 | |
4 | |
Scheint ja so auch für den L431 zu gelten. Also mal gucken ob dieses EMPTY Bit bei dem auch gibt. Im L431 Refman gibts dann was kleingedrucktes zum EMPTY Bit im FLASH_SR:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Das bräuchte dann aber ne Sonderbehandlung, denn wenn ich das Bit schreibe per Bootloader darf ich ja dann den STM32 nicht mehr resetten. Also ein OBL_LAUNCH auslösen. Dann resettet der STM32 von alleine und checkt den Flash mit. Vielen dank für den Hinweis!
Nochmal ne Rückmeldung zum Thema: Es funktioniert schon seit ner Weile, aber nicht so wie oben beschrieben. Per Bootloaderbefehlen lassen sich beim L4 nicht die Peripherieregister lesen/schreiben. (Warum auch immer, da hatte ich einfach nicht drann gedacht). Daher wird per Go Kommando die soeben aufgespielte Firmware gestartet, wenn das Empty Bit gesetzt ist führt diese dann ein OBL_LAUNCH durch. Interessanterweise hat der L431 diesen Fall, aber der L476 hat diesen Mechanismus nicht.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
