Forum: Projekte & Code STM32 OTA Flasher mit ESP8266


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Oft ist ein in ein Gerät eingebauter STM32 schlecht erreichbar, um ein 
Firmware-Update durchzuführen.

Mit dem STM32-OTA-Flasher kann man einen angeschlossenen STM32 über WLAN 
flashen. Damit vermeidet man nicht nur unnötigen Kabelsalat, sondern es 
erübrigt sich auch, das Gerät, in dem der STM32 eingebaut ist, erst 
komplett auseinanderzunehmen.

Außerdem kann man den STM32-OTA-Flasher verwenden, um Protokoll-Ausgaben 
des STM32 über UART per telnet (über das WLAN) mitzulesen. Auch kann der 
STM32 ferngesteuert resettet werden.

Das Flashen geschieht über eine Web-Oberfläche, welche der ESP8266 
bereitstellt, siehe anhängende Bilder. Diese Oberfläche kann auch vom 
Entwickler erweitert werden, um den STM32 über einen Browser zu steuern 
oder Messwerte/Protokolle abzufragen.

Dabei kann der STM32-OTA-Flasher sowohl als WLAN-AP als auch als 
Wifi-Client eines bestehenden WLAN-Netzwerkes arbeiten. Die Firmware des 
ESP8266 kann natürlich auch über WLAN aktualisiert werden.

Verwendet wird ein NodeMCU für eine Handvoll Euro. Es kann aber auch ein 
"nackter" ESP8266 ESP12-E oder ESP12-F verwendet werden - dann aber mit 
etwas Hühnerfutter drumherum. Das NodeMCU-Board hat den Vorteil, dass 
ein USB-UART-Umsetzer (i.d.R. ein CP2102) bereits On-Board ist, um den 
ESP8266 einmalig zu flashen. Einfach ein USB-Kabel anschließen, einmal 
den ESP8266 flashen und fertig. Danach geht alles über WLAN.

Das Flashen des am ESP8266 angeschlossenen STM32 geschieht mit folgenden 
Schritten:

- Upload HEX-File
- Flash STM32
- Reset STM32

Optional kann man die hochgeladene HEX-Datei auch vorab vom ESP8266 
prüfen lassen, ob die CRCs soweit korrekt sind - okay, das macht der 
nachfolgende Flash-Vorgang sowieso, aber sicher ist sicher :-)

Ich habe das Projekt bei github eingestellt:

https://github.com/ukw100/STM32-OTA-Flasher

Die Arduino-Sources sind bereits komplett bei Github abgelegt. Für 
Nicht-Arduino-User werde ich auch eine fertige BIN-Datei zur Verfügung 
stellen, die einfach durch ein gängiges ESP-Flash-Programm einmalig 
geladen werden muss.

Die Dokumentation wird in den nächsten Tagen nachgereicht, vermutlich am 
kommenden Wochenende.

: Bearbeitet durch Moderator
von Ralph S. (jjflash)


Lesenswert?

wow.... das werde ich in der Tat ausprobieren. Ich bin jetzt mal über 
den Code "geflogen" und sehe, dass du den STM32 über den seriellen 
Bootloader flasht (sehe ich doch richtig).

Ich bin sehr gespannt ob ich das so an's laufen bekomme.

Gruß, Ralph

von Johannes S. (Gast)


Lesenswert?

Es gibt auch BMP für den ESP32, damit kann man per Wifi flashen und 
debuggen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ralph S. schrieb:
> Ich bin jetzt mal
> über den Code "geflogen" und sehe, dass du den STM32 über den seriellen
> Bootloader flasht (sehe ich doch richtig).

Ja, das ist korrekt.

> Ich bin sehr gespannt ob ich das so an's laufen bekomme.

Ja, ich muss endlich die Doku dafür fertigmachen. Ich versuchs in den 
nächsten Tagen.

von Stefan (kellers76)


Lesenswert?

Hallo,

danke dass du deinen Code publiziert hast, genau danach habe ich 
gesucht.

Leider habe ich das Problem, dass scheinbar meine Hex Datei, die ich aus 
dem Arduino IDE Temp Verzeichnis heraus kopiere, den Fehler hat dass 
kein EOF enthalten sei.
Diese Files lassen sich nicht flashen...

Ich steh da komplett aufm Schlauch und weiß nicht weiter.

Hast du oder habt ihr mir vielleicht einen Tipp was ich falsch mache?

lg
stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan schrieb:
> Leider habe ich das Problem, dass scheinbar meine Hex Datei, die ich aus
> dem Arduino IDE Temp Verzeichnis heraus kopiere, den Fehler hat dass
> kein EOF enthalten sei.

Erzeugst Du die Hex-Datei für den STM32 mittels Arduino? Kannst Du so 
eine hier mal anhängen?

von Stefan (kellers76)


Angehängte Dateien:

Lesenswert?

ja, ich habe einen F429ZI Nucleo, den ich mit der Arduino IDE 
programmiere.
Normalerweise lade ich den Sketch direkt per eingebautem ST-Link hoch, 
jedoch möchte ich mit Hilfe deinem Projekt die Firmware auch per Web 
aktualisieren.
Im besten Fall beide, die vom ESP und die vom STM...

Die hex Datei wird beim kompilieren automatisch mit erstellt und liegt 
dann in dem besagten Temp Verzeichnis.

P.s. kann es sein dass du die Aktualisierung des ESP selbst nicht 
umgesetzt hast? Da kommt bei mir die Meldung dass er die Webseite 
"/update" nicht findet...


Danke schon mal fürs helfen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan schrieb:
> Die hex Datei wird beim kompilieren automatisch mit erstellt und liegt
> dann in dem besagten Temp Verzeichnis.

Ist ein wirklich fettes Teil, mehr als 1MB...

Ich habe Deine Hex-Datei in den OTA-Flasher hochgeladen und anschließend 
einen Check (per Check-Button) drüberlaufen lassen. Die Datei wird als 
korrekt eingestuft, Ergebnis siehe Anhang. Allerdings muss ich sagen, 
dass ich mittlerweile eine weiter entwickelte Version benutze - auch 
nicht mehr das obsolete SPIFFS, sondern den Nachfolger davon.

Es kann durchaus sein, dass SPIFFS solche großen Dateien gar nicht 
unterstützt und deshalb u.a. der EOF-Datensatz in der Hex-Datei gar 
nicht mehr gespeichert werden konnte.

> P.s. kann es sein dass du die Aktualisierung des ESP selbst nicht
> umgesetzt hast? Da kommt bei mir die Meldung dass er die Webseite
> "/update" nicht findet...

Auch das scheint ein Bug in der ca. 1 Jahr alten Version zu sein - ist 
schon seit längerer Zeit gefixt. Ich lade gleich mal die aktuelle 
Version hoch und melde mich dann nochmal.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Ich lade gleich mal die aktuelle
> Version hoch und melde mich dann nochmal.

Ich habe das github-Repository 
https://github.com/ukw100/STM32-OTA-Flasher aktualisiert. Im 
wesentlichen sind es zwei Änderungen:

- Wechsel von SPIFFS auf LittleFS (aktuelle IDE verwenden!)
- Fix ESP8266-Update

@Stefan: Ich denke, dass damit beide Probleme behoben sein sollten.

Viel Spaß,

Frank

von Stefan (kellers76)


Lesenswert?

Hallo Frank,

vielen Dank für die schnelle Hilfe!

Ich hatte es schon mit mehreren OTA Bespielen von Anderen versucht 
gehabt und bin fast verzweifelt.
Dein Projekt ist das erste was ich bei mir dann richtig ans Laufen 
bekommen habe.

Dein Code ist starker Tobak für mich, sehr schlank geschrieben aber für 
mich als Laie extrem schwer durch zu steigen.


Ich versuche die neue Version...

lg
stefan

von Stefan (kellers76)


Lesenswert?

Hallo Frank,

das Flashen des STM funktioniert tadellos!

Beim Update des ESP bekomme ich noch die gleiche Meldung im Webbrowser 
"not found: /update" nachdem ich den Update Button gedrückt habe.
Die bin Datei habe ich mit der Arduino IDE erzeugt, muss ich daran noch 
was ändern oder liegt es noch an einer anderen Stelle?

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Stefan schrieb:
> Beim Update des ESP bekomme ich noch die gleiche Meldung im Webbrowser
> "not found: /update" nachdem ich den Update Button gedrückt habe.

Ich flashe den ESP per OTA immer so:

- Menü "Update ESP8266" anklicken
- Die URL wechselt auf http://x.x.x.x/upd - nicht update!
- Es erscheint dann im Browser der anhängende Screenshot (1)
- Datei mit "Durchsuchen" auswählen
- Button "Update" klicken
- Der Browser lädt die Bin-Datei rauf....
- Es erscheint die Meldung "Update Success! Rebooting..."
- Gleichzeitig wechselt die URL auf http://x.x.x.x/update
- Nach einigen Sekunden erscheint "Welcome to STM32 OTA Flasher!" (2)
- Gleichzeitig wechselt die URL auf http://x.x.x.x/

Bei welchem dieser Schritte hakts bei Dir?

: Bearbeitet durch Moderator
von Stefan (kellers76)


Lesenswert?

Frank M. schrieb:
> Stefan schrieb:
>> Beim Update des ESP bekomme ich noch die gleiche Meldung im Webbrowser
>> "not found: /update" nachdem ich den Update Button gedrückt habe.
>
> Ich flashe den ESP per OTA immer so:
>
> - Menü "Update ESP8266" anklicken
> - Die URL wechselt auf http://x.x.x.x/upd - nicht update!
> - Es erscheint dann im Browser der anhängende Screenshot (1)
> - Datei mit "Durchsuchen" auswählen
> - Button "Update" klicken
> - Der Browser lädt die Bin-Datei rauf....
> - Es erscheint die Meldung "Update Success! Rebooting..."
> - Gleichzeitig wechselt die URL auf http://x.x.x.x/update
> - Nach einigen Sekunden erscheint "Welcome to STM32 OTA Flasher!" (2)
> - Gleichzeitig wechselt die URL auf http://x.x.x.x/
>
> Bei welchem dieser Schritte hakts bei Dir?

Ich mache die ersten 5 Schritte und nach dem Klick auf Update kommt 
binnen 2 Sekunden die Browsermeldung "not found: /update".
Es scheint dass die .bin Datei nicht hoch geladen wird und dadurch alle 
weiteren Schritte nicht abgearbeitet werden.
Ich habe die Datei firmware.bin benannt, zumindest habe ich das so im 
Sketch gelesen, leider ohne Erfolg.

Ich generiere die .bin Datei ebenfalls mit der Arduino IDE. Muss ich 
dort noch etwas besonderes machen?

Sorry wenn ich dir da noch so lästig bin...

von Peter (Gast)


Lesenswert?

Hallo,
Das Projekt gefällt mir sehr, nur dummerweise Flashe ich die meisten 
Projekte von mir über die swd / jtag pins. Die sio ist meistens nicht 
erreichbar, oder das ganze funktioniert nicht richtig (f407).

Hast du mal dran gedacht die anderen Schnittstellen einzubauen?

von Stefan (kellers76)


Lesenswert?

Hallo Frank,

könntest du mir vielleicht deine .bin Datei exemplarisch zukommen 
lassen, so dass ich ausschließen kann dass ich beim Erstellen der Datei 
einen Fehler mache.

Zudem die Frage bzw. eine nähere Info:
Ich verwende eine Amica NodeMCU und bin mir nicht sicher ob diese 
Hardware kompatibel zu deinem Projekt ist bzw. ob ich hier noch 
irgendeinen Pegel manuell setzen muss (auf dem Board ist ein Button der 
Flash heißt)...

lg
stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Stefan schrieb:
> könntest du mir vielleicht deine .bin Datei exemplarisch zukommen lassen

Siehe Anhang.

Stefan schrieb:
> Zudem die Frage bzw. eine nähere Info:
> Ich verwende eine Amica NodeMCU und bin mir nicht sicher ob diese
> Hardware kompatibel zu deinem Projekt ist bzw. ob ich hier noch
> irgendeinen Pegel manuell setzen muss (auf dem Board ist ein Button der
> Flash heißt)...

Keine Ahnung. Ich dachte, NodeMCU heißt NodeMCU?

Der Flash-Button ist normal. Diesen aktiviert die Arduino-IDE beim 
Flashen über den RTS-Pin des UARTs. Wenn man ein Flash-Programm benutzt, 
welches zwar den UART benutzt aber den RTS-Pin nicht bedienen kann, muss 
man den Button selber drücken. Schlag mich nicht, wenns CTS und und 
nicht RTS ist. So genau weiß ich das auch nicht, was da die Arduino-IDE 
beim Flashen über den UART genau macht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:

> Hast du mal dran gedacht die anderen Schnittstellen einzubauen?

Der OTA-Flasher nutzt den internen Bootloader des STM32. Ein Flashen 
über SWD/JTAG ist eine komplett andere Geschichte. Ist das Flashen über 
SWD überhaupt irgendwo öffentlich dokumentiert?

von Peter (Gast)


Lesenswert?

Ich denke schon das das Protokoll  bekannt ist. Denn irgendwie müssen 
die ganzen open-source Debugger es ja auch gefunden haben.

Wie gesagt für mich wäre es die beste Lösung weil ich selten an die sio 
komme, eigentlich nur ein Projekt von gut 27 und das ist dann auch noch 
ein f407 der Probleme mit dem bootloader hat.
Ist halt bei mir so gebaut und nicht unbedingt so bei den meisten 
anderen.

von J. S. (jojos)


Lesenswert?

Frank M. schrieb:
> Ist das Flashen über
> SWD überhaupt irgendwo öffentlich dokumentiert?

Im CoreSight Kern der Cortex-M, da gibt es dicke Dokumente bei ARM.

Im Prinzip ist das auch in BMP drin:
https://github.com/blackmagic-debug/blackmagic

Das ist mit libopencm3 gebaut, aber nicht so modular das die Logik 
einfach in andere Projekte einzubauen ist. Ich habe mir mal einen Remote 
Debugger auf Basis von Mbed gebaut und die Quellen entsprechend 
geändert. Das war aber zuviel um das einfach in den main branch zu 
mergen.
Immerhin ist ein low level Teil als Treiber mit Funktionszeigern drin 
und libopencm3 wird nicht verwendet wenn es als 'Hosted' Version 
kompiliert wird, dann wird aber auch einiges andere umgestellt. Also 
ziemliche Fummelei.
Das lesen der Binärdatei übernimmt bei BMP der gdb, und der sendet dann 
die zu programmierenden Blöcke an den gdbserver in BMP. Das sind 
überschaubare Kommandos die eine eigene SW dann aufrufen muss. 
Komplizierter ist das Debuggen, da gibt es doch jede Menge 
Sonderbehandlung für die verschiedenen Cortex Kerne und Derivate.

Es gibt wie Anfangs geschrieben auch eine ESP32 Portierung, damit läuft 
BMP dann wireless. Hatte ich auch mal probiert und es funktionierte gut. 
BMP ist aber gerade aktuell bei V 1.9, der ESP Port benutzte noch eine 
V1.7.x. Auch das ist nicht im original Repo sondern in einem Fork, wie 
aktuell das jetzt ist weiß ich nicht.
https://github.com/Ebiroll/esp32_blackmagic
sieht nicht sehr lebendig aus.

Meinen Remote Debugger habe ich bisher nicht mehr gebraucht, ich habe an 
dem Remote Platz jetzt einen PC und arbeite von meinem Windows PC über 
VSCode remote auf einem Linux PC an dem die HW steckt. Das funktioniert 
absolut transparent und zuverlässig.

: Bearbeitet durch User
von Stefan (kellers76)


Lesenswert?

Frank M. schrieb:
> Stefan schrieb:
>> könntest du mir vielleicht deine .bin Datei exemplarisch zukommen lassen
>
> Siehe Anhang.
>
> Stefan schrieb:
>> Zudem die Frage bzw. eine nähere Info:
>> Ich verwende eine Amica NodeMCU und bin mir nicht sicher ob diese
>> Hardware kompatibel zu deinem Projekt ist bzw. ob ich hier noch
>> irgendeinen Pegel manuell setzen muss (auf dem Board ist ein Button der
>> Flash heißt)...
>
> Keine Ahnung. Ich dachte, NodeMCU heißt NodeMCU?
>
> Der Flash-Button ist normal. Diesen aktiviert die Arduino-IDE beim
> Flashen über den RTS-Pin des UARTs. Wenn man ein Flash-Programm benutzt,
> welches zwar den UART benutzt aber den RTS-Pin nicht bedienen kann, muss
> man den Button selber drücken. Schlag mich nicht, wenns CTS und und
> nicht RTS ist. So genau weiß ich das auch nicht, was da die Arduino-IDE
> beim Flashen über den UART genau macht.

Hallo Frank,

ich hab meinen Fehler gefunden...
Ich verwende an meinem Rechner den Opera Browser und scheinbar geht bei 
dem der Update des ESP mit deinem Sketch nicht.
Ich hab das aber leider erst fest gestellt als ich die Beispiele der 
Bibliothek getestet habe.

Beim Edge Browser funktioniert der Update wunderbar und auf anhieb.

Danke dir nochmals für deine Unterstützung!

lg
stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan schrieb:
> Ich verwende an meinem Rechner den Opera Browser und scheinbar geht bei
> dem der Update des ESP mit deinem Sketch nicht.

Gut zu wissen.

> Beim Edge Browser funktioniert der Update wunderbar und auf anhieb.

Nicht nur da. Auch bei Firefox und Chrome funktioniert es.

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.