Forum: Mikrocontroller und Digitale Elektronik Wie lernt man ein STM32 zu programmieren?


von Hugo345 (Gast)


Lesenswert?

Das mag wie eine dumme Frage klingen, aber wie lernt man ein STM32 zu 
programmieren?
Wo fängt man an?
Man schaut sich ein zwei Beispiele an und dann? Man will ja mehr als nur 
das was die paar Beispiele zeigen.

Wie soll man aus einem Datenblatt wissen welche Befehle wie zu benutzen 
sind?

Man kann doch nicht anhand von ein paar Beispielen, die es im Internet 
in 100 verschiedenen Varianten gibt, irgendwas wirklich lernen.

Langsam habe ich das Gefühl, alle die solche Mikrocontroller benutzen 
bekommen von ihren Arbeitgebern bezahlte Schulungen.

Wieso gibt es kein einziges Buch über die Programmierung mit CMSIS?

von ... (Gast)


Lesenswert?

The Definitive Guide to ARM® Cortex®-M3 and Cortex®-M4 Processors 
https://www.amazon.de/gp/aw/d/B00G9856GU/ref=aw_ss_kndl_dp/

von Christian (Gast)


Lesenswert?

Du hast doch schon eine Bibliothek,  die man benutzen kann, erwähnt. 
Dort stehen eigentlich alle grundlegende Sachen wie man es benutzt bzw. 
ansteuert. Programmiert wird in C,  eventuell optimieren manche noch in 
Assambler.

von Andreas R. (daybyter)


Lesenswert?

Schau mal bei

http://stm32duino.com

Da ist die Idee einfach, dass man seine Arduino Kenntnisse weiternutzen 
kann. Bleibst in der Arduino IDE usw.

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


Lesenswert?

Hugo345 schrieb:
> Das mag wie eine dumme Frage klingen, aber wie lernt man ein STM32 zu
> programmieren?

Die Frage ist wirklich dumm. Denn was soll "programmieren" denn genau 
bedeuten? In welcher Programmiersprache denn z.B.? Und dann gibt es da 
ja auch noch jede Menge Einzelschritte: das Programm schreiben, es 
übersetzen, es auf den µC laden, es evtl. debuggen. Da mußt du schon ein 
bißchen spezifischer sein, was davon du denn lernen willst.

> Wo fängt man an?

Auch das hängt wesentlich davon ab, in welcher Programmiersprache man 
programmieren will. Wenn es Assembler sein soll, dann wird man nicht 
darum herum kommen, sich mal das programmer model - also die 
vorhandenen Register und den Befehlssatz - anzusehen. Wenn man C 
programmieren will, dann ist das optional. Soll heißen, daß es zumindest 
am Anfang nicht hilft.

Was man in jedem Fall braucht, sind Angaben über vorhandene Peripherie 
und wie man die anspricht. Wobei sich natürlich auch hier die Details 
wieder wesentlich unterscheiden, je nachdem welche Programmiersprache es 
denn sein soll.

> Man schaut sich ein zwei Beispiele an und dann? Man will ja mehr als nur
> das was die paar Beispiele zeigen.

Was denn nun wieder für Beispiele?

Man kann natürlich ein Tutorial abarbeiten und versuchen die Beispiele 
daraus nachzuvollziehen. Aber diese Beispiele sind nur ein winziger Teil 
des Puzzles, mehr so eine Art Hands-on Training. Zuerst mal muß man sich 
einen groben Überblick über die Architektur und die Toolchain 
verschaffen. Und dann muß man sich die Details anschauen. Am besten an 
realen Aufgabenstellungen. Eine LED blinken lassen. Ein echo-Device per 
UART bauen. Ein Display ansteuern. Was auch immer dir einfällt.

> Wie soll man aus einem Datenblatt wissen welche Befehle wie zu benutzen
> sind?

Diese Frage ist nun wirklich unsinnig. Du hast ein Ziel das du erreichen 
willst. Und eine Menge an möglichen Befehlen. Da gibt es immer mehrere 
Wege, wie du zum Ziel kommst. Ähnlich wie wenn du Autofahren lernst. Da 
lernst du im Prinzip auch nur beschleunigen, bremsen und 
geradeaus/links/rechts fahren. Damit kannst du dann prinzipiell zu jedem 
Ziel kommen. Trotzdem wird kein Mensch der Welt die Vorstellung haben, 
er würde in der Fahrschule lernen, wie er mit dem Auto von Berlin nach 
München kommt.

> Langsam habe ich das Gefühl, alle die solche Mikrocontroller benutzen
> bekommen von ihren Arbeitgebern bezahlte Schulungen.

Blödsinn. Ich lese bspw. gerade "The Definitive Guide To ARM Cortex M3 
And M4 Processors". Außerdem habe ich ein STM32 Evalboard hier liegen 
(neben einem geschenkt gekriegten XMC2Go). Das Buch habe ich mir 
gekauft, nachdem die ganzen Einführungen, Tutorials etc. daran 
gescheitert sind mir einen allgemeinen Überblick zu vermitteln. Statt 
dessen wollte mir der eine seine Cortexe verkaufen, der andere seine 
IDE promoten.

Ich will aber keinen Codegenerator a'la DAVE und keine IDE die nur unter 
Windows (würg) läuft. Weil keines dieser Tools mir zeigt (zeigen will) 
was da unter der Oberfläche passiert. Die verbergen die Details und 
behaupten gar noch, mir damit etwas Gutes tun zu wollen. Danke, aber 
NEIN danke. Ich bin schon groß. Ich kann Makefiles schreiben oder den 
Linker von der Kommandozeile aufrufen. Und ich weiß auch daß der 
Debugger nicht beißt, auch dann wenn er kein GUI hat.

> Wieso gibt es kein einziges Buch über die Programmierung mit CMSIS?

Das o.g. Buch streift auch CMSIS. Ansonsten gibts dafür Manuals (fette) 
sowohl bei www.arm.com als auch von den jeweiligen µC-Herstellern. Denn 
die müssen ja schließlich eine CMSIS-Implementierung für ihre µC 
anbieten. Und zumindest ST dokumentiert die auch.

Aber natürlich muß CMSIS sowohl zum µC als auch zur Toolchain passen. 
Die spannende Frage ist also vielmehr: "wo kriege ich CMSIS für meinen 
µC her und wie binde ich es in meine Toolchain ein". Und nicht "welche 
Headerfiles gibt es und welche Objekte definieren die?".

von S. R. (svenska)


Lesenswert?

Hugo345 schrieb:
> Das mag wie eine dumme Frage klingen, aber wie lernt man ein STM32
> zu programmieren?

Ganz einfach: Indem man sich einen STM32 besorgt (bevorzugt auf einer 
funktionierenden Hardwareplattform) und einfach mal anfängt.

> Wo fängt man an?

Da, wo alle anderen auch anfangen:
- eine LED blinken lassen
- zwei LEDs gleichzeitig und abwechselnd blinken lassen
- drei LEDs blinken lassen, als Lauflicht
- den Timer benutzen, um eine LED blinken zu lassen
- den Timer benutzen, um zwei LEDs mit verschiedenen Geschwindigkeiten 
blinken zu lassen
- den Timer benutzen, um eine LED langsam faden zu lassen (PWM)
- einen Knopfdruck auswerten und die Richtung des Lauflichts umkehren
- einen Knopfdruck per Interrupt auswerten
- einen Lautsprecher zum Piepen bringen
- einen Lautsprecher eine Melodie spielen lassen
- einen Lautsprecher eine Melodie spielen lassen und gleichzeitig das 
Lauflicht spielen lassen
- mit der UART eine Verbindung zu einem Computer aufbauen und Zeichen 
hin- und herschicken
- die UART gepuffert und interruptgesteuert benutzen

Wenn du das geschafft hast, hast du erstmal genug Grundlagen, dass du du 
solche Fragen nicht mehr zu stellen brauchst. :-)

> Wie soll man aus einem Datenblatt wissen welche Befehle wie zu benutzen
> sind?

Der aus meiner Sicht beste Trick wäre, einfach einen C-Compiler zu 
benutzen. Den fütterst du mit C-Code (ist immer sinnvoll, wenn man C 
einigermaßen kann), und der kümmert sich dann darum, welche Befehle man 
wie möglichst elegant verknotet.

> Man kann doch nicht anhand von ein paar Beispielen, die es im Internet
> in 100 verschiedenen Varianten gibt, irgendwas wirklich lernen.

Soll man auch nicht. Man soll aus diesen Beispielen lernen, wie man die 
Grundlagen, die man sowieso schon können sollte, von einem Gebiet auf 
ein anderes Gebiet transportiert.

Normalerweise programmiert man einen Controller nicht, um ihn zu 
programmieren. Man programmiert ihn, um Probleme zu lösen.

> Wieso gibt es kein einziges Buch über die Programmierung mit CMSIS?

Keine Ahnung. Mich interessieren vom CMSIS nur die 
Registerbeschreibungs-Header; der Startup-Code ist eh für jedes Board 
unterschiedlich, und die riesigen Bibliotheken (egal ob STs Peripheral 
Library oder Atmels ASF) mag ich nicht besonders. Wobei es nervig ist, 
die notwendigen Header aus den Bibliotheken rauszupulen, ohne sich den 
restlichen Mist einzutreten... :-(

von Markus M. (adrock)


Lesenswert?

Full ACK zu meinem Vorschreiber.

Ich kam vom AVR (mit ASM und C-Erfahrung) und habe zuerst mal die 
Referenz der CPU (also Cortex-Mx) angeschaut (und entschieden diese 
NICHT in Assembler programmieren zu wollen).

Danach die Reference-Manuals des Herstellers zu den Controllern bzw. den 
Peripherie-Blöcken.

Dann einfach mit einem STM32Discovery angefangen kleinere Sachen 
auszuprobieren mit dem CooCox IDE. Ein bisschen trial und error, diverse 
"Aha!" Effekte gehabt.

Danach auf die emBlocks IDE umgestiegen und ein kleines Projekt gemacht.

Mit CMSIS konnte ich mich auch noch nicht anfreunden, leider sind die 
Definitionen in den Header-Files bei ST nicht ganz so schön wie bei 
Atmel.

von Patrick B. (p51d)


Lesenswert?

Hugo345 schrieb:
> Langsam habe ich das Gefühl, alle die solche Mikrocontroller benutzen
> bekommen von ihren Arbeitgebern bezahlte Schulungen.

Wie bitte? In welcher Welt lebst du eigentlich? HEUTE ist es so, dass du 
alles (also fast alles) schon können musst. Die Wirtschaft hat keine 
Zeit und kein Interesse ihre Angestellten bei solch "banalen" Dingen 
noch eine Ausbildung zu bezahlen.

Wie lehrnt man einen STM32 zu programmieren?
Einfach ein Projekt nehmen und dann Schritt für Schritt vorgehen:
- LED/Taster setzen und einlesen
- Peripherie ansteuern (einfach)
- Peripherie mit Zusätzen ansteuern (ADC über Timer triggern, DMA)
- Displays, Speicherkarte
- USB, LAN
...

Such dir ein eigenes Heimprojekt und mach das ganze einfach ganz 
langsam.

Noch eine gute Quelle:
http://diller-technologies.de/stm32.html

von Steffen R. (steffen_rose)


Lesenswert?

Hugo345 schrieb:
> Das mag wie eine dumme Frage klingen, aber wie lernt man ein STM32 zu
> programmieren?
> Wo fängt man an?

Was sind deine Vorkenntnisse?
Aus meiner Sicht sollte man zuerst C gelernt haben, damit man die 
Beispiele zumindest ansatzweise versteht.

von Bastler (Gast)


Lesenswert?

Ich muss da gerade an unseren (älteren) Ausbilder denken: "Programmieren 
tut man nicht mit dem Rechner sondern mit einem Stift und Block"

Ja, er hatte Recht!

von Dennis (Gast)


Lesenswert?

Bastler schrieb:
> "Programmieren
> tut man nicht mit dem Rechner sondern mit einem Stift und Block"
>
> Ja, er hatte Recht!

Dem stimme ich auch uneingeschränkt zu :-)

(mit ca. 20 Jahren Programmiererfahrung in C und ASM)

von W.S. (Gast)


Lesenswert?

O je.
Natürlich kann man hier seine eigene Herangehensweise posten oder mit 
einem Bonmot kontern:
"start at the beginning and go until you come to the end. then stop!"

Hugo345 schrieb:
> Das mag wie eine dumme Frage klingen, aber wie lernt man ein STM32 zu
> programmieren?
Du solltest nicht fragen, wie man ihn programmiert, sondern wie man ihn 
benutzt. Das ist die eigentliche Frage. Programmieren tut man ihn per 
Programmiersprache eigener Wahl - wobei selbige eher mager ausfällt: die 
Alternativen kann man an einer Hand abzählen.

> Wo fängt man an?
Das ist eine wesentlich wichtigere Frage. Fange du mit dem Lesen des 
Manuals zum konkreten µC an. STM32xxx gibt es viele - und du solltest 
dich nicht bloß auf die Chips von ST beschränken. Lies auch mal was 
von vergleichbaren µC von NXP, denn deren Doku ist an vielen Stellen 
besser les- und anwendbar.

Fange bei den Kapiteln über die grundlegenden Chipteile an, also Takt(e) 
aufsetzen (ja, zumeist gibt es mehrere), Portpins konfigurieren, 
Memory-Map verstehen, vorgesehene Programmiermethoden verstehen (SWD 
oder Bootlader oder USB usw.) und so. Laß vorerst die komplizierteren 
Peripheriecores aus, das liest du später.

> Man schaut sich ein zwei Beispiele an und dann? Man will ja mehr als nur
> das was die paar Beispiele zeigen.
Einfach bloß ein paar Beispiele am Anfang ist mit Abstand das 
Verkehrteste von allem. Laß das lieber bleiben, denn dort wird man 
zumeist auf irgend eine blöde Schiene gesetzt, von der man sich später 
erst wieder lösen muß um nicht drin zu ersaufen.


> Wie soll man aus einem Datenblatt wissen welche Befehle wie zu benutzen
> sind?
Redest du jetzt vom Maschinencode? Bei den Cortexen steht das eigentlich 
NIE im Manual zum Chip, sondern man muß es bei ARM passend zur 
jeweiligen Architektur herunteraden. Ja, solltest du auch tun, schon 
deswegen, daß du einen Begriff bekommst, was für eine CPU du dort auf 
dem Chip hast und wie sie aus Programmierer's Sicht funktioniert.


> Man kann doch nicht anhand von ein paar Beispielen, die es im Internet
> in 100 verschiedenen Varianten gibt, irgendwas wirklich lernen.
Wirklich lernen kann man aus den jeweiligen Referenzmanuals zum 
konkreten Chip. Beispiele in 100 Varianten hingegen sind zumeist dubios.

> Langsam habe ich das Gefühl, alle die solche Mikrocontroller benutzen
> bekommen von ihren Arbeitgebern bezahlte Schulungen.
HÄ???
Den Gedanken kannst du gleich wieder beenden. Die allermeisten hier (und 
anderswo) haben sich das, was sie können, aus eigener Kraft selbst 
beigebracht - zumeist in ihrer Freizeit. Das ist zumindest für mich auch 
ein gewisses Kriterium, ob jemand für den Beruf taugt oder nicht. 
Entweder ist der Beruf eine innere Berufung - oder derjenige sollte 
lieber Beamter werden. Punkt.

> Wieso gibt es kein einziges Buch über die Programmierung mit CMSIS?
Weil man diesen Schmonzes im Grunde überhaupt nicht braucht.
Was man braucht, ist eine Info über die in der Hardware angeordneten 
Register, so daß man sie aus seinem Programm heraus erreichen kann. Was 
man mit diesen Registern tut, liest man im Manual.

W.S.

von S. R. (svenska)


Lesenswert?

Hallo,

>> Wo fängt man an?
> Das ist eine wesentlich wichtigere Frage. Fange du mit dem Lesen des
> Manuals zum konkreten µC an. STM32xxx gibt es viele - und du solltest
> dich nicht bloß auf die Chips von ST beschränken. Lies auch mal was
> von vergleichbaren µC von NXP, denn deren Doku ist an vielen Stellen
> besser les- und anwendbar.

"Lies erstmal 4000 Seiten Dokumentation." :-)

Ich wuerde ja ein zum Einstieg Buch empfehlen - da habe ich hier aber 
nur eins hier liegen ("Embedded Systems with ARM Cortex-M3 
Microcontrollers in Assembly Language and C"). Das ist zwar an sich nur 
mäßig, geht aber einmal von vorne bis hinten durch das STM32L-Discovery 
durch. (Wurde hier in der Lehre benutzt.)

Es hängt natürlich von den Vorkenntnissen ab, wieviel man neu lernen 
muss.

> Fange bei den Kapiteln über die grundlegenden Chipteile an, also Takt(e)
> aufsetzen (ja, zumeist gibt es mehrere), Portpins konfigurieren,
> Memory-Map verstehen, vorgesehene Programmiermethoden verstehen (SWD
> oder Bootlader oder USB usw.) und so. Laß vorerst die komplizierteren
> Peripheriecores aus, das liest du später.

Gerade den Clock-Tree würde ich erstmal beiseite lassen. Wichtig ist, 
dass man die Peripheriebausteine mit (irgendeinem) Takt versorgt, sonst 
funktionieren die Buttons nicht richtig.

Wenn man den Controller irgendwie zum LED-Blinken gebracht hat, kann man 
sich den immernoch vornehmen, um alles schneller zu machen.

Gruß,
Svenska

von Bernd K. (prof7bit)


Lesenswert?

W.S. schrieb:
> und du solltest
> dich nicht bloß auf die Chips von ST beschränken.

Das kann man nicht oft genug sagen.

Ich werf jetzt zum Beispiel auch nochmal Freescale in die Runde, gerade 
die kleinen Kinetis z.B. MKL0 sind eigentlich noch sehr übersichtlich 
und gut zu durchschauen, nach kurzer Zeit genauso spielerisch einfach zu 
beherrschen wie die beliebten 8-bitter deren Namen ich jetzt nicht 
nennen mag. Trotz Einfachheit dieser simplen kleinen ARMs bekommst Du 
einen grundsätzlichen Einstieg in die ARM-Welt und viele Gegebenheiten 
dort.

Eine große Hilfe gerade für die Erlangung eines erstmaligen Einblicks 
für mich war beispielsweise diese kleine aber äußerst feine Sammlung: 
https://github.com/0xc0170/kinetis_klxx_gcc

Dort findest Du Beispielprojekte für verschiedene Kinetis-Typen und 
deren (preisgünstige!) Demo-Boards auf das allerwesentlichste 
eingedampft:

* Makefile
* Linkerscript
* ein Headerfile für die ganzen Register
* Startup.s
* Systeminit.c
* main.c für Blinky

Das ist so stark aufs wirklich Essentielle eingedampft, kein 
Library-Overhead der vom Wesentlichen ablenkt, kein IDE-Zwang, nur der 
Compiler, der Linker das nackte Silizium und Du (und das Handbuch 
natürlich), diese handvoll wirklich überschaubaren Dateien kann man 
wirklich noch an ein zwei Wochenenden erschöpfend verstehen. Und DANN 
hat man den Einstieg.

Und nach dieser low-level Erfahrung hat man dann auch gleich eine ganz 
andere Einstellung zu der ganzen Sache, dann macht einem auch kein 
STM32F4 mehr Angst und auch keine monströse CMSIS-HAL, dann kann man 
denen auf Augenhöhe gegenübertreten.

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.