Viel früher als erwartet war die erste Auflage dieses erst Ende Februar 2021 erschienenen Buches ausverkauft. Die normale Vorgehensweise wäre nun, das Buch einfach nachzudrucken und in unveränderter Form fortzuführen, da sich in derart kurzer Zeit nicht viel geändert hat/geändert haben kann. Ein vorrangiges Ziel beim Schreiben dieses Buches war aber – neben der Vermittlung der Kenntnisse zur Programmierung der STM32F4-Mikrocontroller – die Entwicklung einer Funktionssammlung in Form einer Bibliothek, die einerseits unabhängig von einem bestimmten Hersteller ist und die Sie andererseits in die Lage versetzen soll, die »Bare Metal«-Programmierung der STM32F4-Mikrocontrollerfamilie – also die Programmierung auf Registerebene – zu verstehen, sie in eigenen Projekten einzusetzen und, falls erforderlich, auf Mikrocontroller anderer Hersteller portieren zu können.
In den letzten Monaten ist diese Funktionssammlung – ursprünglich hatte ich sie einfach nur MCAL genannt, inzwischen nenne ich sie alternativ auch MCAL-STM – erheblich umfangreicher geworden. Umfasste sie in ihrer ursprünglichen Version nur 82 Funktionen, so stehen Ihnen inzwischen mehr als 240 Funktionen zur Verfügung, und ein Ende der Weiterentwicklung ist nicht absehbar! Die durchgeführten Erweiterungen führten dazu, dass viele Funktionen geändert, harmonisiert und optimiert wurden, damit sie leichter und intuitiver anwendbar sind. Dies hat dann naturgemäß zur Folge, dass ich die ursprünglichen MCAL-STM-Beispiele an die neuen Gegebenheiten anpassen musste: Mit der aktuellen Version der MCAL-STM werden die für die erste Auflage entwickelten Beispiel-Projekte überwiegend nicht mehr funktionieren.
Vergleichbare Anpassungen für die anderen Peripheriekomponenten führten zu der Entscheidung, dass das Buch vollständig überarbeitet werden musste. Es gibt aber auch weitere Änderungen im Vergleich zur ersten Auflage: Eine betrifft z.B. die Einstellung der Taktfrequenzen, für die ich mit Kapitel 5 ein neues Kapitel geschrieben habe. Dies hat zur Folge, dass alle folgenden Kapitel eine neue Kapitelnummer erhalten und zudem Anhang B in seiner ursprünglichen Form entfällt.
Worum es geht
In diesem Buch wird die Programmierung von Mikrocontrollern der STM32F4xx-Familie von STMicroelectronics behandelt. Sie gehören zur Gruppe der Cortex-M4-Controller, die von Arm Limited entwickelt wurden. Die Namen der beiden genannten Unternehmen werden im weiteren Verlauf verkürzt als STM bzw. als Arm bezeichnet.
Arm ist demnach der Entwickler des Mikrocontrollerkerns, der Hersteller des käuflich zu erwerbenden Mikrocontrollers aber ist die Firma STM. STM lizenziert die Entwicklungsarbeit von Arm und nutzt somit deren sogenannte Intellectual Property (geistiges Eigentum). Und hierin liegt auch der wesentliche Geschäftsbereich von Arm: Gegen die Zahlung von Lizenzgebühren überlässt Arm den Herstellern der Mikrocontroller das Recht an der Nutzung seines geistigen Eigentums, die den Prozessorkern dann um eigene Komponenten erweitern. Dass ich an dieser Stelle nur ganz allgemein von Cortex-Mikrocontrollern spreche, geschieht ganz bewusst: Denn Arm hat nicht nur Cortex-M-, sondern auch Cortex-A- und Cortex-R-Mikrocontroller und weitere entwickelt. Alle genannten Typen sind wiederum in Gruppen unterschiedlicher Leistungsfähigkeit unterteilt, sodass STM insgesamt mehr als 600 verschiedene Cortex-Mikrocontroller anbietet.
Dieses Buch befasst sich – wie bereits oben erwähnt – ausschließlich mit den Cortex-M4-Mikrocontrollern von STM. Aufgrund der sehr guten Skalierbarkeit der Cortex-M-Mikrocontroller von STM lassen sich die in diesem Buch beschriebenen Techniken aber auch mit den neuen STM32F7xx-Mikrocontrollern einsetzen! Auch Nutzer der Cortex-M0-, Cortex-M3- oder von Cortex-M23-Mikrocontrollern können von diesem Buch profitieren.
STM ist nicht der einzige Hersteller von Cortex-Mikrocontrollern: Basierend auf dem Arm-Kern sind auch NXP, Microchip, Texas Instruments, Toshiba, Infineon und viele weitere Unternehmen Hersteller von Cortex-Mikrocontrollern und somit Kunden von Arm.
Aufbau des Buches
Dieses Buch ist in mehrere Teile gegliedert. Zur besseren Orientierung folgt hier ein Überblick über den Aufbau des Buches.
Teil I
Der erste Teil umfasst wichtige Grundlageninformationen, die für alle Nutzer der STM32F4xx-Mikrocontroller nützlich sind.
Kapitel 1 bietet zunächst einen einführenden Überblick über die Mitglieder der Cortex-M4-Mikrocontroller der Firma STM. Am Beispiel des STM32F446RE werden die Features dieser Mikrocontrollerfamilie beschrieben.
Wenn Sie einen anderen Mikrocontroller dieser Familie verwenden, finden Sie die entsprechenden Informationen im jeweiligen Datenblatt (Datasheet). Besonders wichtig ist, dass Sie hier zusätzlich die entsprechenden Referenzhandbücher von https://st.com herunterladen!
Im weiteren Verlauf des Kapitels wird die Aufteilung des Adressbereichs, das sogenannte Memory Mapping, beschrieben. Anschließend folgt eine Beschreibung der Funktionseinheiten des Cortex-M4-Kerns, der unabhängig vom Hersteller eines Mikrocontrollers immer gleich ist. Hier werden vor allem die Bussysteme, die zum Austausch von Daten zwischen den integrierten Funktionseinheiten verwendet werden, beschrieben.
In diesem Buch werden keine herstellerspezifischen Bibliotheken, wie z.B. HAL
von STM oder LPCopen
von NXP, beschrieben: Ihre Verwendung würde die Portierbarkeit von Software auf Mikrocontroller anderer Hersteller erheblich schwieriger gestalten.
Kapitel 2 befasst sich mit der Erstellung der CMSIS-Bibliothek (CMSIS = Cortex Microcontroller Software Interface Standard). Hierbei handelt es sich um eine Sammlung von Funktionen und Konstanten, die in diesem Buch verwendet wird und die die Basis für die im Buch gemeinsam entwickelte MCAL-Bibliothek darstellt. CMSIS ist dabei die einzige Fremdbibliothek, die hier verwendet wird. Darüber hinaus beschreibt Kapitel 2 den Bootvorgang sowie die Grundinitialisierung des Mikrocontrollers und gibt einführende Hinweise zur Einstellung des Taktsignals. Auch eine Beschreibung, die das Verständnis von Linkerscripts erleichtern soll, finden Sie in Kapitel 2.
Kapitel 3 ist ein sehr kurz gehaltenes Kapitel. Es beschreibt Vorschriften zur Programmierung, die in sicherheitsrelevanten Branchen wie z.B. der Automobilindustrie, der Luft- und Raumfahrt sowie der Kraftwerktechnologie zwingend eingehalten werden müssen.
In Kapitel 4 werden die Register vorgestellt, die für das Reset-Verhalten und die Steuerung von Taktsignalen (Reset and Clock Control, RCC) zuständig sind. Das hier Beschriebene ist in allen Projekten zu beachten, die Sie entwickeln! Besonders die Abschnitte zum RCC sind nur als Einstieg zu verstehen, da diese Komponente auch für die Einstellung der Systemtaktfrequenzen verwendet wird (siehe Kapitel 5).
Kapitel 5 wurde vollständig neu erstellt, was zur Folge hat, dass sich – im Vergleich zur ersten Auflage – alle Folgekapitel entsprechend verschieben. Hier wird die Einstellung der Taktfrequenzen des Prozessorkerns, der verschiedenen Busse sowie der Peripheriekomponenten beschrieben. In der ersten Auflage hatte ich zu diesem Thema noch auf ein besonderes Feature der STM32CubeIDE-Entwicklungsumgebung verwiesen: Die dort beschriebene Vorgehensweise verwende ich inzwischen selbst nicht mehr. Werksseitig sind die NUCLEO-Boards so konfiguriert, dass das System mit einer Frequenz in Höhe von 16 MHz getaktet wird. In diesem neuen Kapitel lernen Sie nun, wie Sie vorgehen müssen, um die Mikrocontroller mit ihrer maximalen Frequenz betreiben zu können. Dieses Kapitel ersetzt den alten Anhang B.
Die meisten Beispiele in diesem Buch habe ich sehr schlicht gehalten, damit Sie sich auf das Wesentliche konzentrieren können. Während der Entstehungsphase dieses Buches habe ich viele Hilfsfunktionen und Bezeichner entwickelt, die ich später immer wieder verwendet habe und die schließlich in die selbst erstellte Bibliothek MCAL-STM aufgenommen wurden. Beispiele für MCAL-STM-Funktionen sind gpioTogglePin(GPIO_TypeDef
*port,
PIN_NUM
pin)
, setSystickTicktime(uint32_t
*timer,
uint32_t
delay)
oder bool
isTimerExpired(uint32_t
timer)
. Durch die Anwendung dieser Funktionen und Bezeichner werden die Beispiele übersichtlicher und erleichtern die Konzentration auf die neuen Themen. Sie können die MCAL-STM jederzeit von der Webseite https://gitlab.com/rjesse/mcal-stm.git kostenlos herunterladen und erforschen, wie die enthaltenen Funktionen intern auf Bare-Metal-Basis realisiert wurden. Der Download enthält neben dem vollständigen Sourcecode der MCAL-STM zusätzlich das Verzeichnis »doc«, in dem Sie die Dokumentation der MCAL-STM im HTML-Format finden.
Da die MCAL (bzw. MCAL-STM) gegenüber der ersten Auflage erheblich umfangreicher geworden ist, wurde es erforderlich, die Beispielprojekte komplett zu überarbeiten. Die weitaus meisten Beispiele bieten nun die Möglichkeit, durch Aktivieren bzw. Deaktivieren des »Softwareschalters« #define
MCAL
zwischen der Bare-Metal-Version auf der einen und der MCAL-Version auf der anderen Seite umzuschalten. Bei den einführenden sehr einfachen Beispielen der Kapitel 3 und 4 habe ich auf diese Möglichkeit noch verzichtet: Sie sind ausschließlich als Bare-Metal-Version vorhanden. Das Beispiel zur Konfiguration der Taktfrequenzen in Kapitel 5 ist hingegen in der Bare-Metal-Variante erheblich komplexer, sodass hier nur die MCAL-Version gezeigt wird.
Teil II
In Teil II wird die Programmierung der Kernkomponenten von Mikrocontrollern behandelt. Mit Ausnahme der seriellen Schnittstellen, die in Teil III behandelt werden, lernen Sie hier unter anderem GPIOs, Timer sowie A/D- und D/A-Wandler kennen. Teil II ist der umfangreichste Teil dieses Buches.
Kapitel 6 befasst sich mit der Nutzung der General Purpose Inputs/Outputs (GPIO). Der Fokus liegt hier zunächst auf ihrer Nutzung als digitale Ausgänge zur Ansteuerung externer Komponenten. Sie bieten sehr vielfältige Konfigurationsmöglichkeiten, sodass ein großer Teil den Registern der GPIOs gewidmet ist. In zwei praktischen Beispielen werden wir die in Kapitel 2 erstellte CMSIS-Bibliothek einsetzen.
In Kapitel 7 stelle ich Ihnen verschiedene Techniken zur Abfrage externer Komponenten vor. Hierbei handelt es sich um die Techniken Polling, Interrupts und Exceptions. Sie lernen Gründe dafür kennen, warum Polling keine gute Lösung darstellt und weshalb Interrupts zu bevorzugen sind. In diesem Kapitel werden Sie darüber hinaus lernen, wie Sie die GPIOs durch den Einsatz sogenannter externer Interrupts als Inputs für digitale Signale nutzen können.
In Kapitel 8 lernen Sie abschließend die sogenannten alternativen Funktionen der GPIO-Pins kennen. Standardmäßig werden die GPIOs für die Ein- bzw. Ausgabe digitaler Größen verwendet. Es gibt aber auch Komponenten, die zur Verarbeitung analoger Größen dienen oder mittels serieller Schnittstellen für den Datenaustausch zwischen verschiedenen Geräten genutzt werden. Um die Anzahl der Anschlüsse des Mikrocontrollers – und damit die Produktionskosten – so gering wie möglich zu halten, können die GPIOs so konfiguriert werden, dass auch die Verarbeitung anderer digitaler und nichtdigitaler Signale möglich ist: Zu diesem Zweck verwenden alle Cortex-M-Hersteller die alternativen Funktionen (die ich im Verlauf des Buches auch als AF bezeichne).
Beginnend mit Kapitel 9 werden Sie nach und nach die verschiedenen Timer und ihre Einsatzmöglichkeiten kennenlernen. Mit Timern sind besonders die STM-Mikrocontroller reichhaltig ausgestattet. Kapitel 9 befasst sich in verschiedenen Beispielen mit dem SysTick-Timer. Ich beginne hier ganz bewusst mit schlechten Beispielen, da Sie diese in vielen Onlinetutorials ebenfalls finden. In mehreren Schritten werden die schlechten Beispiele stetig verbessert, wobei ich Sie immer auf die besonderen Vorteile der neuen Techniken hinweise.
Neben dem SysTick- und verschiedenen Watchdog-Timern bieten die STM32F4xx-Mikrocontroller drei Klassen von Timern: Basic Timer, General-Purpose Timer und Advanced-Control Timer, die sich zwar in ihrer Mächtigkeit, aber nicht im Prinzip ihrer Programmierung unterscheiden.
Kapitel 10 befasst sich im Anschluss mit den Funktionen und der Programmierung der Basic Timer. Neben dem SysTick-Timer sind sie die einfachsten Varianten der verfügbaren Timer.
In Kapitel 11 werden Sie dann an die General-Purpose Timer (GP-Timer) herangeführt. Sie werden bereits hier feststellen, dass Sie Konzepte, die Sie in Kapitel 10 kennengelernt haben, sehr einfach wiederverwenden können. Kapitel 11 bietet zudem eine Einführung in die sogenannte Pulsweitenmodulation (PWM), da sie eine der wesentlichen Erweiterungen der GP-Timer im Vergleich zu den Basic Timern darstellt. Hier lernen Sie dann auch die sehr mächtigen und hilfreichen Input-Capture- bzw. Output-Compare-Funktionen kennen.
Kapitel 12 schließt mit der Vorstellung der Advanced-Control-Timer den Überblick über Timer ab. Alles, was Sie in den bisherigen Kapiteln über Timer gelernt haben, können Sie hier auf die gleiche Weise nutzen. Zusätzlich lernen Sie aber auch neue Dinge kennen, die besonders bei der Ansteuerung von elektrischen Antrieben unter Einsatz der sogenannten H-Brücken von elementarer Bedeutung sind.
Kapitel 13 und 14 befassen sich zum Abschluss von Teil II mit Komponenten, die es uns ermöglichen, die reale analoge Welt mit digitalen Geräten zu erfassen bzw. zu beeinflussen. Die Themen dieser beiden Kapitel sind daher Digital-Analog-Wandler (Kapitel 13) und Analog-Digital-Wandler (Kapitel 14).
Teil III
Ein wesentlicher Bestandteil des Einsatzes technischer Geräte besteht in der Übermittlung von Daten zwischen verschiedenen Geräten und/oder Komponenten. Während beispielsweise Drucker (und teilweise auch Scanner) früher oftmals mit parallelen Schnittstellen ausgestattet wurden, haben diese heutzutage praktisch keine Relevanz mehr: Sie wurden nahezu vollständig durch serielle Schnittstellen ersetzt. Sie glauben mir nicht? Dann möchte ich Sie auf zwei der wichtigsten seriellen Schnittstellen aufmerksam machen: USB und Ethernet! Waren serielle Schnittstellen früher relativ langsam – Übertragungsraten von wenig mehr als 115 kBit waren eher die Ausnahme als die Regel –, so übertragen moderne serielle Schnittstellen Daten mit einer Übertragungsrate von mehreren Hundert MBit (USB) bis hin zu GBit in den neuesten Ethernet-Entwicklungen.
Die Anwendung der beiden zuletzt genannten Schnittstellen ist nicht trivial. Auf ihre Beschreibung wird in diesem Buch daher verzichtet. Es existieren aber noch weitere serielle Schnittstellen, die, abhängig von ihrem Einsatz, immer noch genügend schnell und vor allem zuverlässig arbeiten.
Kapitel 15 bietet zunächst eine grundlegende Einführung in das Thema serielle Kommunikation. Hier werden einige Grundlagen vermittelt, die zum Verständnis der technischen Umsetzung elementar sind. Der große Vorteil serieller Schnittstellen besteht darin, dass der Datenaustausch häufig über nur eine oder maximal zwei Datenleitungen erfolgt.
Mit der Besprechung und der Anwendung von UARTs/USARTs in Kapitel 16 werden Schnittstellen behandelt, die überwiegend für die Kommunikation zwischen verschiedenen Geräten eingesetzt werden. Mit ihnen können Daten auch über größere Entfernungen, z.B. mehrere Hundert Meter, übertragen werden.
Über derart große Distanzen müssen aber längst nicht alle Daten transportiert werden: Sehr häufig ist es völlig ausreichend, wenn Komponenten Daten nur über Distanzen von wenigen Zentimetern austauschen. Auch zu diesem Zweck wurden serielle Schnittstellen entwickelt, von denen in Kapitel 17 die Schnittstelle Inter-Integrated Circuit (I²C) vorgestellt wird.
Eine weitere serielle Schnittstelle mit vergleichbaren Anwendungsgebieten ist das sogenannte Serial Peripheral Interface (SPI). Es wird in Kapitel 18 behandelt.
Obwohl es noch viel mehr serielle Schnittstellen gibt – allein die STM32F4-Familie unterstützt beispielsweise den CAN-Bus, I²S, SAI, SDIO usw. –, werden sie in diesem Buch nicht beschrieben. Dies liegt unter anderem daran, dass zusätzlich benötigte Hardware teilweise derart speziell ist, dass sie im heimischen Labor üblicherweise aufgrund hoher Beschaffungskosten nicht verfügbar ist.
Teil IV
Im abschließenden Teil IV dieses Buches werden noch einige wenige weitere Komponenten vorgestellt, die nicht in den anderen Teilen untergebracht werden konnten, weil sie
teilweise übergreifend in mehreren Bereichen eingesetzt werden bzw.
derart wichtige Aufgaben haben, dass sie durch die Auslagerung in einen separaten Buchteil besonders hervorgehoben werden können.
In Kapitel 19 werde ich Sie daher mit dem sogenannten Direct Memory Access (DMA) vertraut machen. Diese Technik wird besonders häufig beim Austausch größerer Datenmengen verwendet (z.B. beim Abspielen von Musikdateien), weil sie den Mikrocontrollerkern vom Laden, Bearbeiten und Transferieren der Daten entlastet: Der Mikrocontroller kann in der gleichen Zeit für andere wichtige Aufnahmen parallel weiter genutzt werden.
Im letzten Kapitel (Kapitel 20) gehe ich mit den sogenannten Watchdog-Timern (WD) noch auf eine besondere Timer-Klasse ein, die für spezielle Aufgaben beim sicheren Betrieb von Anwendungen verwendet werden. Sie werden dann eingesetzt, wenn ein Gerät – dies kann auch eine interne Komponente des Mikrocontrollers sein – nicht ausreichend schnell arbeitet (z.B. weil Daten nicht rechtzeitig zur Verfügung stehen oder weil ein solches Gerät defekt ist). Im ordnungsgemäßen Betrieb werden WDs ständig neu geladen und dürfen niemals ablaufen. Läuft ein WD dennoch ab, weil eine Komponente »den Betrieb aufhält«, kann sein Auslösen dazu genutzt werden, die Maschine in einen sicheren Zustand zu überführen.
Anhänge
Ich habe mehrere Anhänge vorbereitet, die Sie bei der Entwicklung von Mikrocontrollersoftware unterstützen.
Da ich selbst weiterführende Literatur (auch online) genutzt habe, werde ich Ihnen in Anhang A eine umfassende Liste mit Internetadressen bzw. der verwendeten Literatur liefern.
Anhang B ist vor allem für diejenigen Leser wichtig, die sich noch am »Anfang der Lernkurve« befinden. Sie finden hier einfache Tipps zur Nutzung eines Debuggers, der Ihnen bei der Fehlersuche sehr gute Hilfe leistet.
Anhang C ersetzt die ursprüngliche durch Anhang D verfügbare Auflistung der MCAL-Funktionen. Hatte ich in der ersten Auflage noch sämtliche MCAL-Funktionen nach Anwendungsgebieten sortiert aufgelistet, so zeige ich Ihnen an dieser Stelle anhand ausgesuchter Beispiele nur noch, wie Sie sich in der neu erstellten HTML-Dokumentation zurechtfinden. Sie sollte bei eigenen Projekten die erste Anlaufstelle sein, wenn Sie MCAL-Funktionen verwenden wollen. Der ursprüngliche Anhang D entfällt somit vollständig!
Anmerkungen des Autors
Seit der Veröffentlichung der ersten Auflage dieses Buches habe ich die MCAL-Bibliothek erheblich erweitert. Dies wirkt sich unmittelbar auf die enthaltenen Beispielprojekte aus: So habe ich seinerzeit für die meisten Beispiele noch Hilfsfunktionen entwickelt, die erst in einem weiteren Schritt in die MCAL-Bibliothek aufgenommen wurden. Außer zur Erläuterung von Konzepten werden viele dieser Hilfsfunktionen gar nicht mehr benötigt! Stattdessen habe ich die meisten Beispiele so umgestaltet, dass Sie beide Versionen, also die MCAL- und die »reine« Bare-Metal-Version enthalten. Durch das Hinzufügen bzw. Löschen der Kommentarzeichen //
vor #define
MCAL
können Sie nun zwischen beiden Versionen hin- und herschalten.
Diese Vorgehensweise ließ sich leider nicht in allen Beispielen konsequent umsetzen! Immer dann, wenn es um die Einführung neuer Konzepte geht – dies werden Sie besonders deutlich z.B. in Kapitel 9 erfahren (hier wird der SysTick-Timer beschrieben) –, ist die Verwendung von Funktionen der MCAL-Bibliothek nicht sinnvoll, da sie den letzten von teilweise mehreren Entwicklungsschritten darstellen. Die Hilfsfunktionen dienen der Erläuterung der Konzepte, und die Verwendung der endgültigen Version einer MCAL-Funktion würde das Verständnis der Verbesserungen bzw. Zwischenschritte erschweren.
An dieser Stelle bleibt mir nur noch, Ihnen viel Spaß und Erfolg beim Durcharbeiten dieses Buches zu wünschen.
Zum Zeitpunkt der Veröffentlichung dieses Buches werden Sie auf meiner Webseite https://www.ralf-jesse.de auch die Beispielprojekte zu diesem Buch herunterladen können. Hier werde ich aber nach und nach auch weitere Projekte veröffentlichen. Geplant sind z.B. die Ansteuerung von Grafikdisplays und später auch die Implementierung einer Ethernet-Anbindung (dann allerdings mit einem anderen STM32F4- bzw. STM32F7-Controller, da der STM32F446 eine solche Schnittstelle nicht enthält). Auch die MCAL-Bibliothek wird weitergepflegt und immer wieder erweitert. Ich weise aber ausdrücklich darauf hin, dass die aktuelle Version der MCAL-STM nicht mehr auf meiner Webseite zu finden ist: Alternativ habe ich unter https://gitlab.com/rjesse/mcal-stm.git ein Gitlab-Repository angelegt. Nutzen Sie dieses Repository, wenn Sie die jeweils neueste Version der MCAL-STM benötigen. Es lässt sich nicht immer vermeiden, dass ich durch neue Erkenntnisse Namen von Funktionen ändern werde. Dann entfallen die veralteten Funktionen aber nicht: Vielmehr werden sie in der HTML-Dokumentation dann als »deprecated« (veraltet) bezeichnet. Sie finden dann immer einen Hinweis auf die Funktion, die Sie anstelle der alten Version nutzen sollten.
Will man Software für einen Mikrocontroller entwickeln, ist es hilfreich, wenn grundlegende Kenntnisse zur Hardware vorhanden sind. Die erforderlichen Kenntnisse müssen nicht so tief gehend sein, wie dies für Hardwareentwickler erforderlich ist, man sollte aber in der Lage sein, sich mit ihnen auf einer gemeinsamen Basis verständigen zu können.
Daher beginne ich dieses Buch mit einem kurzen Überblick über die Mitglieder der STM32F4xx-Familie.