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
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.
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?
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.
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).
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)?
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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?
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.
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.
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.
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?