Forum: Mikrocontroller und Digitale Elektronik Was ist ein Bootloader?


von Eiscreme (Gast)


Lesenswert?

Moin zusammen,

ich habe da eine Frage zum Thema Bootloader. Ich habe da natürlich schon 
was dazu gelesen, aber es ist noch ein wenig unklar, was das genau sein 
soll.

Wenn ich z.B. den Arduino Bootloader anschaue. Ist das der Grund warum 
man einen AVR Arduinomäßig programmieren kann, nachdem man es auf den 
Controller geflasht hat?

MfG

von NichtWichtig (Gast)


Lesenswert?

Gegenfrage: Was ist Arduino?

von Matthias S. (da_user)


Lesenswert?

Eiscreme schrieb:
> Ist das der Grund warum
> man einen AVR Arduinomäßig programmieren kann,

Nein und ja. Kommt darauf an, was du in diesem Falle unter 
"programmieren" verstehst: Quellcode oder Flashen.
Der Bootloader ist der Grund, warum du den AVR Arduinomäßig flashen 
kannst. Also über die serielle Schnittstelle (USB) statt per ISP.

von Eiscreme (Gast)


Lesenswert?

Matthias S. schrieb:
> Der Bootloader ist der Grund, warum du den AVR Arduinomäßig flashen
> kannst. Also über die serielle Schnittstelle (USB) statt per ISP.

Vielen Dank. Das heißt also, damit kann nur der Controller über USB 
geflasht werden. Ich dachte zunächst, das wäre auch der Grund, wieso man 
Funktionen wie "digitalWrite()" benutzen kann.

Haben STM32 Controller auch einen Bootloader, um sie mit USB 
programmieren zu können bzw. kann man diesen Bootloader herunterladen 
und auf "nackte" STM32 Controller flashen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Eiscreme schrieb:
> Das heißt also, damit kann nur der Controller über USB
> geflasht werden.

Er wird genau genommen über UART geflasht. Du verwendest dafür an der 
USB-Schnittstelle Deines PCs einen USB-UART-Converter.

> Haben STM32 Controller auch einen Bootloader,

Ja, sogar mehrere, u.a. für UART. Und die sind fest "eingebaut", müssen 
also nicht erst vorher ins Flash des µCs übertragen werden.

> um sie mit USB programmieren zu können

Geht ebenso unter anderem über einen USB-UART-Converter.

> bzw. kann man diesen Bootloader herunterladen
> und auf "nackte" STM32 Controller flashen?

Wie gesagt: Diese sind bei STM32 bereits fest eingebaut. Aber man kann 
auch eigene Bootloader nutzen - wenn es unbedingt sein soll.

: Bearbeitet durch Moderator
von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Eiscreme schrieb:
> Haben STM32 Controller auch einen Bootloader, um sie mit USB
> programmieren zu können bzw. kann man diesen Bootloader herunterladen
> und auf "nackte" STM32 Controller flashen?

Letzteres (zumindest die mir bekannten STM32).

Die STM32 haben einen Boot-Loader (nicht löschbar in einem nur dem 
hersteller zugänglichen Extrabereich des Flash-Speichers programmiert), 
der allerdings nur eine Art serieller Schnittstelle implementiert.

Wenn Du darüber einen eigenen Bootloader ablegst, dann kannst Du den 
natürlich so schreiben, dass er jede Schnittstelle des Bausteins 
bedient, u.a. auch USB.

Nach außen hin kannst Du den STM32 dann per USB flashen (mit etwas 
weniger Speicher, da der Bootloader ja Platz benötigt).

: Bearbeitet durch Moderator
von Eiscreme (Gast)


Lesenswert?

Frank M. schrieb:
> Er wird genau genommen über UART geflasht. Du verwendest an der
> USB-Schnittstelle einen USB-UART-Converter.

Wenn der Controller über USB verfügt, dann entfällt der USB-UART Wandler 
oder? Dann kann ich die USB-Buchse direkt an die passenden Anschlüsse 
des Mikrocontrollers anschließen(DP+,DP-,VBUS und GND)?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Eiscreme schrieb:
> Wenn der Controller über USB verfügt, dann entfällt der USB-UART Wandler
> oder?

Meines Wissens nach kann der Arduino-Bootloader, von dem Du oben 
schreibst, nur UARTs bedienen, kein USB direkt. Von daher ist Deine 
Annahme falsch.

Für STM32 gibt es auch USB-Bootloader (google), jedoch haben die erstmal 
gar nichts mit Arduino zu tun.

Bitte konkretisiere Deine Fragen. Es hat keinen Sinn, Arduino und 
Bootloader generell in einen Topf zu werfen. Arduino verwendet einen 
speziellen Bootloader, z.B. bei AVRs. Der hat erstmal mit eingebauten 
Bootloadern  von STM32 oder auch speziell programmierten (wie z.B. 
USB-Bootloader) nichts zu tun.

: Bearbeitet durch Moderator
von Matthias S. (da_user)


Lesenswert?

Eiscreme schrieb:
> Ich dachte zunächst, das wäre auch der Grund, wieso man
> Funktionen wie "digitalWrite()" benutzen kann.

Nein, der Quellcode wird ja vor dem übertragen kompiliert.
Hast du dir mal angeguckt, wie man eine Methode schreibt und/oder eine 
Library erstellt?
Die Arduino-Funktionen sind da eigentlich nix anderes.

Beitrag #5907802 wurde von einem Moderator gelöscht.
von Eiscreme (Gast)


Lesenswert?

Frank M. schrieb:
> Meines Wissens nach kann der Arduino-Bootloader, von dem Du oben
> schreibst, nur UARTs bedienen, kein USB direkt. Von daher ist Deine
> Annahme falsch.
>
> Für STM32 gibt es auch USB-Bootloader (google), jedoch haben die erstmal
> gar nichts mit Arduino zu tun.
>
> Bitte konkretisiere Deine Fragen. Es hat keinen Sinn, Arduino und
> Bootloader generell in einen Topf zu werfen. Arduino verwendet einen
> speziellen Bootloader, z.B. bei AVRs. Der hat erstmal mit eingebauten
> Bootloadern  von STM32 oder auch speziell programmierten (wie z.B.
> USB-Bootloader) nichts zu tun.

Das mit dem Arduino habe ich nur erwähnt, weil ich sehen wollte, ob ich 
es verstanden habe. Mein Problem liegt eher bei den STM32 Controllern. 
Ich wollte in das Thema einsteigen und möchte die Teile über USB 
programmieren und keinen ST Link verwenden. Ich habe gesehen, dass 
manche Controller bereits über USB verfügen. Nun habe ich auch gesehen, 
dass der BOOT0 Pin der Controller auf HIGH gelegt werden muss.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Eiscreme schrieb:
> Das mit dem Arduino habe ich nur erwähnt, weil ich sehen wollte, ob ich
> es verstanden habe. Mein Problem liegt eher bei den STM32 Controllern.
> Ich wollte in das Thema einsteigen und möchte die Teile über USB
> programmieren und keinen ST Link verwenden.

Das geht, aber Du musst wie gesagt zumindest einmal einen USB-Bootloader 
über die anfänglich vorhandenen Schnittstellen (USART, DFU, I2C, CAN, 
SPI wo vorhanden, siehe ST-AppNote AN4488 ab Seite 25) aufspielen.

> Ich habe gesehen, dass
> manche Controller bereits über USB verfügen. Nun habe ich auch gesehen,
> dass der BOOT0 Pin der Controller auf HIGH gelegt werden muss.

Ja, das zeigt dem STM32, dass er dann nicht mehr den "internen 
ST-Bootloader" sondern Deinen verwenden soll.

Wir machen das hier bei den kleinen BluePills so: USB-Bootloader per 
ST-Link aufspielen, Jumper umstecken, fertig.

von W.S. (Gast)


Lesenswert?

Eiscreme schrieb:
> ich habe da eine Frage zum Thema Bootloader. Ich habe da natürlich schon
> was dazu gelesen, aber es ist noch ein wenig unklar, was das genau sein
> soll.

Mal ganz generell:
Unter Bootlader versteht man heutzutage und in µC-Kreisen ein Stück 
Programm, das dazu gedacht ist, über eine vorhandene (und von außen 
möglichst einfach zu benutzende) Schnittstelle eine Firmware in den 
controllerinternen Flashrom zu bringen. Solche Bootlader sind in den 
LPC.. von NXP und den STM32.. von ST fest eingebaut. Eigentlich alle 
können über den UART benutzt werden, aber es gibt je nach konkretem Chip 
auch welche, die man über USB direkt oder über SPI oder CAN oder I2C 
erreichen kann. Bei all diesen Chips benötigt man eben kein spezielles 
Programmiergeschirre wie z.B. JTAG/SWD-Adapter und deren zugehörige 
Brennsoftware.

Aber allgemein versteht man unter einem Bootlader etwas anderes, nämlich 
ein Ladeprogramm, das von der Hardware (bzw. BIOS) eines Rechners 
zunächst geladen wird und das dann seinerseits das eigentliche 
Betriebssystem lädt. Daher der Name _BOOT_lader. Siehe den Ladevorgang 
beim Raspberry.

W.S.

von Einer K. (Gast)


Lesenswert?

Frank M. schrieb:
> Meines Wissens nach kann der Arduino-Bootloader, von dem Du oben
> schreibst, nur UARTs bedienen, kein USB direkt. Von daher ist Deine
> Annahme falsch.

Vielleicht muss man da etwas differenzieren....

"Oben" wurde von einigen µC gesprochen.
Die Arduinos mit 32U4 haben einen USB Bootloader(spricht das STK50X 
Protokoll über eine virtuelle Serielle).

Und auch der HW Bootloader der 32U4 kann USB.
Dieser HW Bootloader ist auf Arduinos dauerhaft deaktiviert (spricht das 
flip Protokoll).

Der Arduino mit 32U4 hat also keinen UART Bootloader.

Die anderen, AVR Arduinos, ohne native USB Schnittstelle, haben 
allerdings alle einen UART Bootloader drauf.

Der DUE kann wiederum beides. Seriell und USB. Aber der spielt als ARM 
sowieso in einer anderen Liga.

von Axel S. (a-za-z0-9)


Lesenswert?

Eiscreme schrieb:
>
> Das mit dem Arduino habe ich nur erwähnt, weil ich sehen wollte, ob ich
> es verstanden habe. Mein Problem liegt eher bei den STM32 Controllern.

Schön, daß du das jetzt auch mal sagst.

> Ich wollte in das Thema einsteigen und möchte die Teile über USB
> programmieren und keinen ST Link verwenden. Ich habe gesehen, dass
> manche Controller bereits über USB verfügen.

Ja. Und manche verfügen nicht nur über USB, sondern haben auch einen 
Bootloader im ROM, der USB-Uploads (konkret: DFU) unterstützt.

Achtung: diese Teilmengen sind nicht identisch. Es gibt also STM32, die 
zwar USB haben, aber keinen dafür tauglichen Bootloader ab Werk 
mitbringen. Für diese gilt dann:

Chris D. schrieb:
> Du musst wie gesagt zumindest einmal einen USB-Bootloader
> über die anfänglich vorhandenen Schnittstellen ... aufspielen.

Der beliebte STM32F103 (z.B. auf den "Bluepill" Boards) fällt in diese 
Kategorie. Der STM32F105 z.B. könnte ab Werk USB.

Da es dir anscheinend darum geht, den ST-Link einzusparen, solltest du 
dich auf die anderen STM32 beschränken. Eine Auswahl an Typen findest du 
in diesem Dokument von ST:

https://www.st.com/content/ccc/resource/technical/document/application_note/6a/17/92/02/58/98/45/0c/CD00264379.pdf/files/CD00264379.pdf/jcr:content/translations/en.CD00264379.pdf

Der kategorische Verzicht auf einen ST-Link ist IMHO ein Fehler, weil 
der auch zum Debuggen gebraucht wird und da erst so richtig zur Hochform 
aufläuft. Dazu noch ist ein ST-Link sehr preiswert. Am billigsten kommt 
er als USB-Stick vom Chinesen. Aber auch die meisten Nucleo-Boards 
kommen mit einem ST-Link, den man per Jumper auch an einen "fremden" 
STM32 anknüppern kann.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Bootloader ermöglichen, das Programm im Flash Speicher über eine 
alternative Schnittstelle zu ändern. Die "normale" Schnittstelle 
funktioniert ohne Bootloader. Das wäre bei den meisten AVR die ISP 
Schnittstelle und bei ARM die SWD Schnittstelle.

Alle STM32 Mikrocontroller enthalten einen unveränderlichen Bootloader 
in einem speziellen Speicherbereich. Dieser unterstützt immer mindestens 
eine UART Schnittstelle. Je nach Chip unterstützt er weitere 
Schnittstellen, z.B. USB, CAN und I²C.

Nicht alle STM32 mit USB haben einen Bootloader, der auch USB 
unterstützt. Betroffen ist zum Beispiel der STM32F103C8, dessen 
Bootloader unterstützt nur die serielle UART1.

Gerade für diesen STM32F103C8 gibt es jedoch für Arduino einen 
zusäzlichen USB tauglichen Bootloader, den man in den normalen Flash 
Bereich installieren kann (nicht muss): 
http://stefanfrings.de/stm32/stm32f1.html#stm32duinoboot

Da gibt es zwei wesentliche Unterschiede:

1)

Der fest installierte Bootloader von ST unterstüttz (wenn er denn USB 
kann), das sogenannte DFU Protokoll. Das dazugehörige Windows Programm 
wäre DFUSe (http://www.st.com/en/development-tools/stsw-stm32080.html) 
und neuerdings auch der STM32 Cube Programmer 
(http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/stm32cubeprog.html).

Der USB Bootloader für Arduino aus dem STM32Duino Projekt spricht ein 
andere USB Protokoll, das teilweise auch DFU genannt wird, aber zur 
Software von ST inkompatibel ist.

Die Arduino IDE unterstützt zum Flashen folgende Schnittstellen:
- Seriell UART
- SWD über ST-Link Adapter
- STM32Duino Bootloader
- Aber nicht den integrierten ST Bootloader über USB

2)

Der fest installierte Bootloader belegt keinen Platz im 
Programmspeicher. Das eigene Programm beginnt daher ganz am Anfang vom 
Flash. Egal, ob man es mit oder ohne Bootloader installiert.

Der STM32Duino Bootloader belegt einige Kilobytes vom Programmspeicher. 
Das eigene Programm beginnt daher hinter dem Bootloader an einer anderen 
Adresse, als wenn man es per ST-Link oder UART Bootloader installiert 
hätte. Daher muss das Hauptprogramm speziell für den STM32Duino 
Bootloader angepasst werden. Die Arduino IDE kümmert sich automatisch 
darum.

In dem Zusammenhang möchte ich noch erwähnen, dass einige 
Mikrocontroller (z.B. AVR) den selbst installierbaren Bootloader ans 
Ende des Flash Speichers legen können, damit das eigentliche 
Hauptprogramm nicht speziell für den Bootloader angepasst werden muss. 
Mit einer Fuse stellt man dort ein, an welcher Adresse der µC nach einem 
Reset starten soll (Bootloader oder normales Programm).

von Eiscreme (Gast)


Lesenswert?

Vielen Dank für die ganzen Erklärungen. Langsam blicke ich nun durch. 
Der Controller den ich benutzen will, ist der STM32F302RBT6. Laut der 
AN3156 ist der DFu fähig. Also müsste ich nun den BOOT0 Pin auf GND 
legen und ich könnte meinen Quellcode nach der Compilierung über die USb 
Buchse programmieren.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Eiscreme schrieb:
> Der Controller den ich benutzen will, ist der STM32F302RBT6.

Das hättest Du auch im ersten Beitrag mitteilen können.

von Stefan F. (Gast)


Lesenswert?

Eiscreme schrieb:
> Also müsste ich nun den BOOT0 Pin auf GND
> legen und ich könnte meinen Quellcode nach der Compilierung über die USb
> Buchse programmieren.

Korrekt. Bis auf das Wort "Quellcode". Du wirst natürlich den 
Maschinencode (*.hex oder *.elf Datei) übertragen, nicht den Quelltext.

Und: Boot0=High aktiviert den Bootloader. Boot0=Low ist für den normalen 
Start.

Du hast dich da wohl nur vertippt, schätze ich.

von Eiscreme (Gast)


Lesenswert?

Stefanus F. schrieb:
> Korrekt. Bis auf das Wort "Quellcode". Du wirst natürlich den
> Maschinencode (*.hex oder *.elf Datei) übertragen, nicht den Quelltext.

Ja genau. Die Fachbegriffe im richtigen Kontext muss ich noch üben.

Stefanus F. schrieb:
> Und: Boot0=High aktiviert den Bootloader. Boot0=Low ist für den normalen
> Start.

Ja da habe ich mich geirrt. Ich habe nochmal in die AN4488 nachgeschaut. 
Für die USB Programmierung muss ich den Pin auf HIGH legen und einen 
Reset durchführen.

Beitrag #5908059 wurde von einem Moderator gelöscht.
Beitrag #5908220 wurde von einem Moderator gelöscht.
von Crazy Harry (crazy_h)


Lesenswert?

Da hätte ich auch ne Frage dazu: ist der Bootloader (beim Arduino) 
zwingend notwendig oder würde ein Programm in einen leeren uC geflasht 
(via ISP und natürlich die Fuses richtig gesetzt) auch laufen?

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Crazy H. schrieb:
> Da hätte ich auch ne Frage dazu: ist der Bootloader (beim Arduino)
> zwingend notwendig oder würde ein ein Programm in einen leeren uC
> geflasht (via ISP) auch laufen?

Natürlich!
Beachte dabei die Fuses.

Mit der passenden Board Definition ist mit Arduino einiges möglich.
Auch das.

von Eiscreme (Gast)


Lesenswert?

Apollo M. schrieb im Beitrag #5908220:
> mitlerweide wird ohne selbst nachzudenken oder zu recherchieren jede
> beliebige frage hier gepostet, warum verblödet die nachrückende
> generation so schnell?

Warum verblödet? Ich war doch nicht ganz unwissend. Mir ging es darum 
schrittweise, dass ganze zu verstehen. Ich habe hier nur gefragt, weil 
ich eine Bestätigung für meinen Wissensstand benötigt habe. Wie ich 
gesehen habe, habe ich manches falsch verstanden bezüglich des 
Bootloaders.

Aber einige von euch haben ja das Wissen über das Thema Bootloader mit 
der Muttermilch aufgenommen.

von Axel S. (a-za-z0-9)


Lesenswert?

Eiscreme schrieb:
> Apollo M. schrieb im Beitrag #5908220:
>> mitlerweide wird ohne selbst nachzudenken oder zu recherchieren jede
>> beliebige frage hier gepostet, warum verblödet die nachrückende
>> generation so schnell?
>
> Warum verblödet? Ich war doch nicht ganz unwissend. Mir ging es darum
> schrittweise, dass ganze zu verstehen. Ich habe hier nur gefragt, weil
> ich eine Bestätigung für meinen Wissensstand benötigt habe.

Beim besten Willen, aber das konnte man dem Eröffnungspost nicht 
entnehmen. Es hat 10 Posts gebraucht, bis du endlich mal eine konkrete 
Frage gestellt hast. Vorher war nur Geblubber.

von Cyblord -. (cyblord)


Lesenswert?

Eiscreme schrieb:
> Moin zusammen,
>
> ich habe da eine Frage zum Thema Bootloader. Ich habe da natürlich schon
> was dazu gelesen, aber es ist noch ein wenig unklar, was das genau sein
> soll.
>
> Wenn ich z.B. den Arduino Bootloader anschaue. Ist das der Grund warum
> man einen AVR Arduinomäßig programmieren kann, nachdem man es auf den
> Controller geflasht hat?
>
> MfG

Warum beschäftigst du dich mit Sachen die dir doch nur Kopfaua machen?

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.