Forum: Mikrocontroller und Digitale Elektronik Bootloader STM32L4 und der leere Flash


von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

Lesenswert?

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.

von A. B. (Gast)


Lesenswert?

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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
During the OBL phase, after loading all options, the Flash memory interface checks whether the first location of the Main memory is programmed. The result of this check in conjunction with the boot0 and boot1 information is used to determine where the system has to boot from. It prevents the system to boot from Main Flash memory area when i.e. no user code has been programmed.
2
The Main Flash memory empty check status can be read from the EMPTY bit in FLASH
3
access control register (FLASH_ACR). Software can modify the Main Flash memory empty
4
status by writing an appropriate value to the EMPTY bit.
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
Set by hardware on power-on reset or after OBL_LAUNCH command execution
2
if the Flash is not programmed and the user intends to boot from the main Flash.
3
Cleared by hardware on power-on reset or after OBL_LAUNCH command
4
execution if the Flash is programmed and the user intends to boot from main
5
Flash. This bit can also be set and cleared by software.
6
1: The bit value is toggling
7
0: No effect
8
This bit can be set to clear the Program Empty bit if an OBL_LAUNCH is done by
9
software after Flash programming (boot in main flash selected). It finally forces
10
the boot in the main flash, without loosing the debugger connection
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!

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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.

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.