Forum: Mikrocontroller und Digitale Elektronik STM32 C Programmierung Tutorial (Buch)


von Ich (Gast)


Lesenswert?

Hallo,

Ich suche ein Einsteigertaugliches Tutorial/Buch zur STM32 
Programmierung in C. Wisst ihr da was taugliches?

Wenn möglich Deutschsparchig?

Meine bisherigen Kenntnisse beschränken sich Hauptsächlich auf 
8051er/AVR Assemblerprogrammierung.

von Bülent C. (mirki)


Lesenswert?


von W.S. (Gast)


Lesenswert?

O je, Diller... da schreibt mal wieder einer zu allererst sowas:
" 1. IDE, Programmer & Eval-Boards"

Wenn ich so eine Herangehensweise sehe (zuerst ne IDE, dann ein 
Evalboard mit ST-Link drauf, dann der Rest der Welt), dann dreht sich 
mir der Magen herum.

Nein, solche Herangehensweise ist so ziemlich das Verkehrteste, wenn man 
etwas lernen will. Aber danach hast du "ich" ja garnicht gefragt, 
sondern:

Ich schrieb:
> ... Tutorial/Buch zur STM32 Programmierung in C

OK, wenn du also nur lernen willst, wie man die STM32 mit einer in C 
geschriebenenen Firmware versieht, dann kannst du dir die o.g. Seite 
durchlesen und am besten ausdrucken. Dann exakt 1:1 nachmachen und 
fertig.

Aber wenn du etwas lernen willst und eigene Fähigkeiten entwickeln, dann 
gehe lieber ganz anders heran:

- Zu allererst solltest du dich damit abfinden, englische Texte zu 
lesen. Es gibt fast nichts anderes. Ist eben so, also klag nicht drüber

- Dann sollest du mal querbeet diverse C-Quellen und was einfaches an 
C-Tutorials dir anschauen und dir dabei C beibringen. Da wirst du als 
erstes genug Frust kriegen. Zum einen wegen der Sprache als solcher, zum 
anderen wegen der ganz häufig miserabel geschriebenen Quellen, wo sich 
viele darin üben, möglichst "genial", also unverständlich oder maßlos 
über-verkompliziert und newdenglish zu schreiben.

- Selber solltest du beim Schreiben deiner Quellen von allem 
Schnickschnack absehen, den du nicht UNBEDINGT benötigst. Also schreib 
du lieber bieder und auch ne Zeile mehr, das ist auf lange Sicht besser 
weil klarer.

Negativbeispiel der klassischen Art gefällig:
 while(*d++=*s++);
Man kann sowas auch ausführlich hinschreiben und den Compiler die 
Optimierung machen lassen.

- Dann solltest du dir die Manuals und die Referenzmanuals zu 
verschiedenen Chips aus der Arm/Cortex-Klasse anschauen. Und zwar von 
Chips verschiedener Hersteller, nicht bloß von ST. Lies dir auch mal die 
Referenzmanuals zu den verschiedenen CPU-Varianten (Cortex M0, M0+, M3, 
M4F) durch. Bei alledem brauchst du nicht jede einzelne Zeile auswendig 
zu lernen, hier geht es erstmal nur um den Überblick und den Eindruck, 
den du von CPU und dem anderen Zeugs auf dem Chip gewinnst. Es geht aber 
auch darum, einen Eindruck von den Manuals als solchen zu gewinnen. 
Nicht jeder mag jeden Stil. Ich z.B. habe sehr etwas gegen die Manuals 
von Freescale, die gehen mir auf den Keks. Aber das muß jeder selbst für 
sich entscheiden.

- Dann besorgst du dir ein Minimalboard für den Chip, den du dir 
inzwischen ausgesucht hast. Sowas wie die billigen Bluepill- Brettln aus 
China sind da erstmal am besten. Es ist fast nix drauf, was dich 
ansonsten bei all den Evaluation-Boards stören würde, du kommst an fast 
alle Pins heran und es ist auch noch billig. Aber guck lieber mal über'n 
Tellerrand, so z.B. bei NXP (LPCxxxx), Nuvoton und wenn du willst auch 
Texas und Atmel und Freescale (via NXP). Merke dir dabei, daß STM32 
nicht das Maß aller Dinge sind, insbesondere stört mich bei denen, daß 
die Peripherie immer noch ziemlich weitgehend nur 16 bittig ist. Da sind 
andere viel besser.

- Dann installierst du dir erstmal eine Toolchain deiner Wahl. Wer mit 
Linux lebt, der nimmt den Gcc, wer Windows hat, hat die Wahl zwischen 
Keil, IAR und Gcc. Vom Keil und vom IAR gibt es frei benutzbare 
Bastlerversionen, die bis zu 32K Code können. Laß dich davon nicht 
abschrecken, es gibt ne Menge Chips, wo garnicht mehr Flash drauf ist 
und mit der Codequalität vom Keil kommt der Gcc nicht mit.

- So, und dann lerne erstmal, deinen 
Compiler+Assembler+Linker+Fromelf+Programmiertool zu Fuß aufzurufen, 
also von der Kommandozeile. Nicht verständnislos gucken, das ist wichtig 
um es können zu können und eben nicht vom Gewurschtel einer IDE 
sklavisch abhängig zu sein. Wer das kann und sich gegebenenfalls ne 
kleine .bat oder ein Script selber schreiben kann, der kann dann auch ne 
IDE benutzen und selbige wieder wegschmeißen, wenn sie ihm in die quere 
kommt, ohne dann aufgeschmissen zu sein.

Und nochwas: Am lautesten schreien viele Leute nach dem Debugger. 
Insbesondere diejenigen, die nicht gründlich denken und ihren Code 
sauber strukturieren können oder wollen. Ich halte den Debugger für 
zweitrangig, das Verstehen der Hardware und das "biedere" Formulieren 
der Programmquellen ist viel wichtiger. Dann kommt man übrigens bei 
vielen Chips auch mit dem dort eingebauten residenten Bootlader aus und 
benötigt dafür eben kein besonderes Debug-Geschirre wie diversen -Link's 
(JLink, STLink, LpcLink oder weiß der Geier-Link). Und wenn schon, dann 
ist der JLink noch immer das Maß der Dinge.

W.S.

von Stefan F. (Gast)


Lesenswert?

Da du schon Vorkenntnisse hast brauchst du meiner meinung nach nicht 
mehr als eine kleine Einstiegshilfe und die Datenblätter des 
Herstellers.

Schau mal: http://stefanfrings.de/stm32/index.html

> Ich halte den Debugger für zweitrangig, das Verstehen der Hardware
> und das "biedere" Formulieren der Programmquellen ist viel wichtiger.

Dito. Wobei der Debugger bei STM32 (im Gegensatz zu AVR) fast verschenkt 
wird.

Es wäre vielleicht auch ganz hilfreich, die Programmiersprache C erstmal 
auf einem PC ganz ohne Mikrocontroller zu lernen. Dazu könntest du QT 
Creator herunterladen und einfach loslegen. Tutorials dazu gibt's ja 
genug.

Die Anleitungen von Diller beziehen sich auf die veraltete und schon 
lange nicht mehr gepflegte Standard Peripheral Library. Aktuell ist aber 
die Cube HAL. Ich würde zum Lernen aber erstmal auf solche 
Abtraktions-Libraries verzichten, und wirklich mit Datenblatt und 
Registern auf Bit-Ebene arbeiten. Das ist am Ende meiner Meinung nach 
kaum schwerer, als durch die HAL durchzusteigen.

von singel (Gast)


Lesenswert?


von Stefan F. (Gast)


Lesenswert?

Eins der Bücher gibt's kostenlos hier: 
https://www.eecs.umich.edu/courses/eecs373/labs/refs/M3%20Guide.pdf

Der Mann beschreibt allerdings nur den ARM Kern. Mit dem Buch alleine 
kann man noch nichts anfangen. Ich kann es allerdings als Begleitlektüre 
zur Doku von STM sehr empfehlen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan U. schrieb:
> die Cube HAL. Ich würde zum Lernen aber erstmal auf solche
> Abtraktions-Libraries verzichten, und wirklich mit Datenblatt und
> Registern auf Bit-Ebene arbeiten. Das ist am Ende meiner Meinung nach
> kaum schwerer, als durch die HAL durchzusteigen.

 Arbeiten auf Bitebene ist erstens für normale Programmierer unnötig
 und zweitens ist das bestimmt schwerer und die Möglichkeit einen Fehler
 zu machen oder etwas wichtiges zu vergessen (Clock einschalten z.B.)
 ist ungefähr 1:100.
 HAL macht das alles per Mausclick und zwar ohne Fehler.

 Ob man:
 I2C_Init(I2C1, &I2C_InitStructure);
 selbst schreibt,

 oder:
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
 von Cube geschrieben wird,

 ist letztendlich egal.
 Aber um zu sehen was da wirklich passiert, müsste man tief in die
 Library einsteigen - wozu ?

 ARM wird immer schneller, da kommt es auf ein paar Takte wirklich nicht
 mehr an. Wenn es aber auf den Takt genau sein soll, nimmt man einen AVR
 oder PIC als Slave, programmiert diesen in Assembler und ARM steuert
 den ganzen Zirkus.

 Und 400MHz mit 32bit, 2MB Flash, 1MB RAM und 168 I/O Pins ist nicht
 gerade wenig, oder ?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> da kommt es auf ein paar Takte wirklich nicht mehr an

Richtig. Aber es kommt darauf an, die Dokumentation der HAL zu lesen und 
zu verstehen.

Ich persönlich beschäftige mich lieber zuerst mit dem Datenblatt des µC 
und dem Reference Manual der Serie.

Aber das ist Geschmackssache.

von M. Н. (Gast)


Lesenswert?

W.S. schrieb:
> - So, und dann lerne erstmal, deinen
> Compiler+Assembler+Linker+Fromelf+Programmiertool zu Fuß aufzurufen,
> also von der Kommandozeile. Nicht verständnislos gucken, das ist wichtig
> um es können zu können und eben nicht vom Gewurschtel einer IDE
> sklavisch abhängig zu sein. Wer das kann und sich gegebenenfalls ne
> kleine .bat oder ein Script selber schreiben kann, der kann dann auch ne
> IDE benutzen und selbige wieder wegschmeißen, wenn sie ihm in die quere
> kommt, ohne dann aufgeschmissen zu sein.

Prinzipiell stimme ich Dir zu, dass das nützliche Kenntnisse sind, auf 
die leider zu wenig wert gelegt wird. Allerdings halte ich es für gewagt 
das alles gleich am Anfang zu lernen. Da kann schnell die Lust vergehen.

Marc V. schrieb:
> HAL macht das alles per Mausclick und zwar ohne Fehler.

Aktuelles Cube für STM32F407VG => USB Audio Device in Cube 
zusammenklicken.
Fehler. Der Code Generator vergisst ein oder (|) bei der Initialisierung 
der Clocks. Soviel zu "ohne Fehler"...

Marc V. schrieb:
> Arbeiten auf Bitebene ist erstens für normale Programmierer unnötig
>  und zweitens ist das bestimmt schwerer und die Möglichkeit einen Fehler
>  zu machen oder etwas wichtiges zu vergessen (Clock einschalten z.B.)
>  ist ungefähr 1:100.

Das würde ich nicht sagen. Gerade am Anfang kann es sinnvoll sein, recht 
tief anzusetzen. Man muss sein Linkerskript ja nicht gleich am Anfang 
selbst schreiben. Aber die Peripherie der STMs ist in der Regel recht 
ausführlich im Reference Manual beschrieben. Da er bereits AVRs 
programmiert hat, sollte er also mit Datenblättern zurechtkommen.

Ich würde am Anfang, wenn STM, auf ein STM32F4 discovery setzen. Da ist 
einige Hardware drauf, um einfache Anfänge zu starten und es sind noch 
genug Pins herausgeführt, um eigene Hardware anschließen zu können. 
Programmer/Debugger ist  on-board.
Für den STM32F407 gibt es ebenfalls noch das Clock Config Tool, das 
leider in Excel mit Macros geschrieben ist.

http://www.st.com/en/development-tools/stsw-stm32091.html

Das generiert registerbasierten Code, der leicht eingebunden werden 
kann.

von Stefan F. (Gast)


Lesenswert?

> HAL macht das alles per Mausclick und zwar ohne Fehler.

Als ich Cube HAL vor ein paar Monaten zum ersten mal benutzte, hat er 
glatt die Clock Initialisierung so falsch gemacht, dass sich der µC 
dabei aufhängte. Da brauchte ich schon ganz zu Beginn Hilfe von den 
Profis. Und genau das war bei mir der Auslöser, es mal ohne HAL zu 
versuchen. Dabei bin ich bisher geblieben, außer wenn ich USB benutze. 
Das ist mir dann ohne fertige Libs doch eine Nummer zu hoch (noch).

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Marc V. schrieb:
>
>  ARM wird immer schneller, da kommt es auf ein paar Takte wirklich nicht
>  mehr an.

Nein, die Aussage ist im Allgemeinen falsch. Wir hatten z.B. hier im 
Forum mehrmals sehr konkrete Fallbei(l)spiele, wo Interrupthandler für 
serielle Schnittstellen Zeichen auf der Rx Seite verloren haben, weil 
der Overhead für die HAL Aufrufe zu viele Zyklen verbraten hat. Und den 
Prozessor überdimensionieren, nur um sich Programmierkomfort zu erkaufen 
ist auch nicht immer die richtige Lösung. Wo zum Beispiel Stromverbrauch 
und Wärmeentwicklung im kritischen Pfad liegen, wird man 
notwendigerweise den am langsamsten getakteten Prozessor nehmen, den man 
kriegen kann, und dann muss man in den kritischen Pfaden anfangen auf 
Zyklenebene zu optimieren. Mal abgesehen davon, dass abhängig von der 
Stückzahl schon Centunterschiede zwischen verschiedenen PODs einen 
grossen Unterschied machen können, also in der Regel der kleinste 
Prozessor, der das gegebene Problem lösen kann, der attraktivste ist.

Zurück zum topic - @"Ich": Wenn Du magst, kannst Du ja mal hier 
reinschnuppern (Vorsicht Eigenwerbung, setzt C Kenntnisse voraus):

https://books.google.de/books?id=8ra8DQAAQBAJ&pg=PT344#v=onepage&q&f=false

: Bearbeitet durch User
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.