Forum: Compiler & IDEs STM32F4 bootloader bauen


von Andreas R. (df8oe)


Lesenswert?

Ich möchte mir einen Bootloader bauen, der es mir erlaubt, später die 
Firmware per USB-Stick upzudaten. Dazu habe ich mir zum Üben & Lernen 
dieses Projekt gezogen:
https://github.com/rowol/stm32_discovery_arm_gcc/tree/master/STM32F4-Discovery_FW_V1.1.0

Ich arbeite unter Linux auf der Konsole.

Ich konnte das Bootloader-Binary auch problemlos mit make im Ordner 
Projects/FW_upgrade/src bauen - es war unter anderem eine .bin-Datei mit 
ca. 35KB Größe. Wenn ich den Bootloader nun aber im dfu-Mode übertragen 
will, dann benötige ich eine .dfu-Datei. Diese ist in dem oben genannten 
Projekt auch als Binary vorhanden - sie ist ca. 18KB groß. OK - .bin != 
.dfu. Also gegoogelt und ein Python-Script namens "hex2dfu" gefunden. 
Dieses auf die .hex losgelassen - im Ergebnis eine .dfu :) Dummerweise 
ist diese sogar ein paar Byte größer als die ursprünglich erhaltene .bin 
- von den 18KB bin ich auf jeden Fall weit entfernt. Kann mir jemand auf 
die Sprünge helfen?

Mit freundlichem Gruß
Andreas

von Jim M. (turboj)


Lesenswert?

Wenn das Original größenoptimiert mit Keil oder IAR Compiler erstellt 
wurde, hat man mit GCC + newlib eher schlechte Karten. Wurde mit -Os 
optimiert?

Bei außreichend Flash könnte man den Bootloader Bereich vergrößern.

von Andreas R. (df8oe)


Lesenswert?

Leider kann ich nicht mehr nachvollziehen, wie das Original gebaut 
wurde. Scheinbar nicht mit dem im Projekt enthaltenen makefile :(

Ich bin wie gesagt hier auf Neuland: Ich habe noch nie einen Bootloader 
gebaut und in ein STM geflasht. Ich habe einfach Zweifel, ob mein 
Bootloader überhaupt lauffähig ist/wäre oder ob es einfach nur ein 
Haufen Binärschrott ist.

Die Größe wäre nicht so das Problem - wenn ich erstmal den Weg 
verstanden habe und mich nicht verrenne...


Ist diese Vorgehensweise richtig?
- bootloader bauen (.hex, .elf, .bin
- mit hex2dfu.py ein dfu erzeugen
- dieses .dfu im dfu-mode auf den STM32F4 schieben
oder anstelle der beiden unteren Punkte auch mit stlink-v2 das Binärfile 
flashen (dann bräuchte ich das dfu nicht zu erzeugen und auch den 
dfu-mode nicht benutzen).

Wenn ich weiss, dass das der richtige Weg ist, dann wäre mir schon 
geholfen ;)

Mit freundlichem Gruß
Andreas

von W.S. (Gast)


Lesenswert?

Andreas R. schrieb:
> Ich bin wie gesagt hier auf Neuland: Ich habe noch nie einen Bootloader
> gebaut und in ein STM geflasht. Ich habe einfach Zweifel, ob mein
> Bootloader überhaupt lauffähig ist/wäre oder ob es einfach nur ein
> Haufen Binärschrott ist.

Ein Bootlader, der per USB-Stick funktioniert? Ich bin mir ziemlich 
sicher, daß das ein schlechtes Unterfangen ist. Dein Bootlader müßte ja 
zu allererst die volle Funktionalität eines USB-Hosts enthalten, dazu 
noch ein Filesystem, dazu noch den eigentlichen Bootlader, dazu noch ne 
Sicherung gegen unbeabsichtigtes Flaschen und so weiter. Das wird ein 
halbes oder sogar ganzes Betriebssystem!

Normalerweise funktionieren Bootlader einfach über eine sinnvolle 
Schnittstelle (seriell, USB-CDC, SPI oder so ähnlich) und nur zusammen 
mit einem Gegenstück an Software auf dem PC. Sowas ist auch für dich 
machbar, du mußt eben bloß beide Parts planen und (extrem wichtig!) 
zuvor dir ein sinnvolles und robustes Protokoll auf dem Übertragungsweg 
ausdenken. Warum? Damit du bei beiden Teilen - dem PC-Programm und dem 
µC-Programm unabhängig vom jeweils anderen planen und entwickeln kannst 
und im Fehlerfall anhand des festgelegten Protokolls genau weißt, 
welcher Part das Karnickel ist.

Vielleicht ist es für dich am einfachsten, den bereits im Controller 
eingebauten Bootlader zu benutzen. Soweit ich weiß, haben wohl alle 
STM32 einen im ROM eingebaut. Der muß bloß aktiviert werden über /Reset 
und /Boot

W.S.

von Andreas R. (df8oe)


Lesenswert?

Klar haben die den! Das Projekt, um das es geht, nutzt zur einmaligen 
Behandlung den dfu-Mode und brennt damit ein knapp 50KB großes 
Progrämmchen. Die eigentliche Firmware kommt dann einen Block später.
Wenn man bei Starten einen Affengriff macht, dann kommt man in dem 
Modus, mit dem man mit einem proprietären Programm die FW einspielen 
kann.

Das o.g. Projekt macht im Prinzip das Gleiche - nur eben nicht via 
proprietäres Programm sondern via USB-Stick. Und Du hast Recht: es ist 
aufwändiger. FAT_FS ist mit drin etc. Das Ganze ist aber nur "35KB" 
groß... Das klingt gut - ich möchte damit experimentieren :)

Es läuft auf dem Disco-Board, welches ich auch habe. Das endgültige Ziel 
ist dann ein SDR-Transceiver, der den STM32F4 als Kontroller einsetzt.

Ich habe schon mit PICs gearbeitet und allem anderen, was mehr als 20 
Beine hat - aber mit dem STM32F4 fange ich erst an und muß eben noch 
viel lernen :)

Danke für die Hilfe - ich werde mal testen!

Mit freundlichem Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Hallo,

muss es wirklich USB sein?
Mit einer SD Karte ist die Sache sehr viel einfacher.
Es gibt auch sicher schon fertige Projekte dazu.

Kannst ja an Stelle eines USB-Sticks einen USB-SD-Stick + Karte 
ausliefern.

von Andreas R. (df8oe)


Lesenswert?

Es muß USB sein. Ich möchte die Hardware des Gerätes so wenig wie 
möglich (am Besten gar nicht) modifizieren. Zwei USB-Buchsen (OTG und 
Host) sind schon vorhanden.

Aber das Projekt aus dem Link den ich in meinem Ursprungspost 
geschrieben habe ist ja exakt sowas und es ist von ST selbst mit 
Application Note und allem drum und dran. Ich denke, ich muss da einfach 
dran bleiben und verstehen, verstehen, verstehen...

Mit freundlichem Gruß
Andreas

von W.S. (Gast)


Lesenswert?

Andreas R. schrieb:
> Ich denke, ich muss da einfach
> dran bleiben und verstehen, verstehen, verstehen...

Brems dich mal damit ein wenig. Der ganze Krempel von ST ist mit deren 
ominöser ST-Lib derart aufgeblasen, daß man eigentlich ständig nur deren 
komische Strukturen jonglieren muß und zusätzlich auch noch sich um 
die eigentliche Hardware kümmern muß.

Irgendwann ist da der Punkt gekommen, wo man all das von ST so promotete 
Zeugs in die Tonne treten muß und sich sein eigenes Zeugs für die 
unterste Hardwareebene schreibt. Ich denke mal, das ist bei dir jetzt 
Mode.

Was benutzt du als Tools? GCC oder Keil oder IAR?
Bei deiner Idee von Bootlader muß der Bootlader tatsächlich bereits ein 
fast vollwertiges Betriebssystem sein. Also liegt es nahe, es 
tatsächlich so zu tun: Ein Betriebssystem und dazu die Applikationen, 
die nachgeladen werden können. Das gibt nen Sinn.

Guck mal in die Lernbetty (hier im Forum) rein, ich hatte dort eine Art 
System-Schnittstelle per SVC implementiert, die bei deinem Vorhaben von 
Nutzen wäre. Da können sich die Applikationen via API des 
Betriebssystems der Funktionen bedienen, die das BS so bietet, also in 
erster Linie die eigentliche Hardwarebedienung (Bildschirm, Tasten, 
sonstige E/A, Dateisystem usw.)

Dann brauchst du bloß noch den Teil, der vermutlich im RAM laufend das 
Löschen und Beschreiben der hinter dem Betriebssystem liegenden Blöcke 
des Flash's organisiert.

W.S.

von Andreas R. (df8oe)


Lesenswert?

Das klingt sehr vielversprechend. Danke für den Hinweis - das lese ich 
mir mal durch. Ich brauche auch andere Hardwarefunktionen wie Keyboard 
via USB etc. da macht diese Vorgehensweise in der Tat sehr viel Sinn...

Mit freundlichem Gruß
Andreas

von W.S. (Gast)


Lesenswert?

Ich hatte dich nicht aus daffke nach deiner Toolchain gefragt. Der Keil 
kann SVC's sehr elegant implementieren, da bestehen die Funktionsaufrufe 
eben nur aus dem Laden der Argumente und dann einem Soft-Interrupt. Der 
GCC hingegen kann keine SVC's. Das ist doof, weil man da einen 
umständlicheren Wrapper in Assembler braucht. Beim IAR kenne ich mich 
nict aus, vermute aber, daß er ebenfalls SVC direkt kann.

W.S.

von Gerd E. (robberknight)


Lesenswert?

W.S. schrieb:
> Bei deiner Idee von Bootlader muß der Bootlader tatsächlich bereits ein
> fast vollwertiges Betriebssystem sein. Also liegt es nahe, es
> tatsächlich so zu tun: Ein Betriebssystem und dazu die Applikationen,
> die nachgeladen werden können. Das gibt nen Sinn.

Bevor man diesen Schritt geht, muss man sich ganz klar vor Augen halten, 
warum man einen Bootloader verwenden möchte:

a) weil man als Entwickler oft neue Firmware ins Gerät laden möchte und 
das über die vom Bootloader angebotene Schnittstelle bequemer ist. Wenn 
man aber mal den Bootloader selbst ändern möchte oder was schief geht, 
ist das mit SWD etc. aber auch kein großes Problem.

b) weil ein Gerät beim Kunden draußen auch vom Kunden aktualisiert 
werden können soll. Der Kunde hat keine Möglichkeit einen Debugger 
anzuschließen und ein Fehler im Bootloader bedeutet Gerät defekt mit 
Einsatz eines Servicetechnikers vor Ort oder Einschicken des Geräts.

Für Fall b) würde ich den Bootloader so klein und einfach halten wie 
möglich, denn Du wirst den Bootloader selbst nicht ohne Risiko updaten 
können. Ein Bootloader als eine Art Betriebssystem mit ladbaren Modulen 
verbietet sich da dann eigentlich.

Für Fall a) kann man natürlich solche Szenarien mit ladbaren 
Applikationsmodulen andenken. Aber vorher sollte man schon mit 
Linkerskripts, Startadressen etc. sattelfest sein.

: Bearbeitet durch User
von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich hatte mal Embedded Linux zu tun. Da gab es eine Ebene, die solche 
Grundfunktionalitäten ermöglichte.

Das ganze nannte sich uboot von der Firma Denx.
http://www.denx.de/wiki/U-Boot

Wie weit es für den STM32 Portierungen gibt weiß ich nicht. Würde abe 
genau in deiner Wellenlänge liegen.

von xyda (Gast)


Lesenswert?

Kann mir mal einer erklären was das ganze gewusel soll?

von Andreas R. (df8oe)


Lesenswert?

Ich weiß es auch nicht so recht.

Nach dem Post von W.S. habe ich mich mal an das Projekt gemacht und bin 
nach ein paar Stunden fertig gewesen. Das Beispiel lief ja auf dem 
Disco-Board - ich musste also die Beschaltung des vorliegenden Gerätes 
(Leuchtdioden, Taster etc.) anpassen und auch ein paar Adressen. War 
aber nicht wirklich wild. Das fertige Produkt möchte ich bei knapp 20kb 
Größe irgendwie nicht als "komplettes Betriebssystem" bezeichnen und es 
tut genau das, was es soll...

Daher möchte ich den Thread gerne schließen, wenn das ginge, und Leute, 
die sowas auch machen möchten, auf das von mir erwähnte Projekt 
aufmerksam machen. Da ist alles drin, was man braucht. Die kleinen 
Fehlerchen (sichern der bestehenden Firmware NACH dem neuflashen...) 
kann man leicht selbst geradebiegen.

Viele Grüße
Andreas

von U-Boot User (Gast)


Lesenswert?

René D. schrieb:
> Ich hatte mal Embedded Linux zu tun. Da gab es eine Ebene, die solche
> Grundfunktionalitäten ermöglichte.
>
> Das ganze nannte sich uboot von der Firma Denx.
> http://www.denx.de/wiki/U-Boot
>
> Wie weit es für den STM32 Portierungen gibt weiß ich nicht. Würde abe
> genau in deiner Wellenlänge liegen.

gibt es hier als source:

https://github.com/EmcraftSystems/u-boot

und hier als binary:

http://www.emcraft.com/stm32f429discovery#release-materials

von Clonephone (Gast)


Lesenswert?

Openblt ... Fix und fertig
Lg

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.