|
Cover |
1 |
|
|
Titel |
5 |
|
|
Impressum |
6 |
|
|
Inhaltsverzeichnis |
7 |
|
|
Einleitung |
13 |
|
|
Worum es geht |
14 |
|
|
Warum STM32F4? |
15 |
|
|
Zielgruppe dieses Buches |
16 |
|
|
Voraussetzungen |
17 |
|
|
Aufbau des Buches |
18 |
|
|
Einsatz von Bibliotheken? |
23 |
|
|
Entwicklungsumgebungen |
26 |
|
|
Hinweis zu den Prozessorregistern |
26 |
|
|
Support |
27 |
|
|
Anmerkungen des Autors |
27 |
|
|
Teil I: Grundlagen |
29 |
|
|
Kapitel 1: STM32F4xx-Mikrocontroller |
31 |
|
|
1.1 Überblick über die STM32F4xx-Familie |
31 |
|
|
1.2 Der STM32F446 |
33 |
|
|
1.2.1 Varianten des STM32F446 |
33 |
|
|
1.2.2 Speicherbelegung/Memory-Mapping |
35 |
|
|
1.2.3 Interner Aufbau des STM32F446 |
39 |
|
|
1.2.4 Bussysteme des STM32F446 |
43 |
|
|
Kapitel 2: CMSIS und MCAL erstellen, der Bootprozess, Anwendung der CMSIS |
45 |
|
|
2.1 Warum sollte eine CMSIS-Bibliothek erstellt werden? |
45 |
|
|
2.2 Die CMSIS-Bibliothek |
47 |
|
|
2.2.1 Beschaffung der CMSIS-Dateien |
47 |
|
|
2.2.2 Aufräumarbeiten |
48 |
|
|
2.2.3 Erstellen der Bibliothek |
50 |
|
|
2.2.4 Fertigstellen der CMSIS-Bibliothek |
53 |
|
|
2.2.5 Einstellen von Suchpfaden |
53 |
|
|
2.2.6 Abschlussarbeiten an der CMSIS-Bibliothek |
55 |
|
|
2.2.7 Verwenden von CMSIS in eigenen Projekten |
56 |
|
|
2.3 Der Bootvorgang |
62 |
|
|
2.3.1 Der Reset-Handler |
63 |
|
|
2.3.2 SystemInit |
66 |
|
|
2.3.3 Grundlagen der Takterzeugung |
66 |
|
|
2.3.4 Linkerscripts |
67 |
|
|
2.4 MCAL / MCAL-STM |
75 |
|
|
Kapitel 3: Embedded C vs. Standard C |
79 |
|
|
3.1 Kommentare |
80 |
|
|
3.2 Benennung von Funktionen, Variablen und Konstanten |
80 |
|
|
3.3 Verwendung geschweifter Klammern |
81 |
|
|
3.4 if()-Vergleiche mit Konstanten |
82 |
|
|
3.5 Verwendung von Konstanten |
83 |
|
|
3.6 Verwendung globaler Variablen |
83 |
|
|
3.7 Datentypen |
84 |
|
|
3.8 Datentypen in der STM-Dokumentation |
86 |
|
|
Kapitel 4: RCC, SYSCFG und SCB |
87 |
|
|
4.1 Reset and Clock Control (RCC) |
87 |
|
|
4.1.1 Reset: Verschiedene Reset-Arten |
88 |
|
|
4.2 System Configuration Controller (SYSCFG) |
92 |
|
|
4.3 System Control Block (SCB) |
93 |
|
|
Kapitel 5: Einstellung von Taktfrequenzen |
97 |
|
|
5.1 Einflüsse der Taktfrequenz |
97 |
|
|
5.2 Taktsystem |
104 |
|
|
5.2.1 Orientierung im »Clock tree« |
104 |
|
|
Teil II: Kernkomponenten der STM32F4xx-Mikrocontroller |
119 |
|
|
Kapitel 6: GPIO: General Purpose Input/Output |
121 |
|
|
6.1 Features und Grenzdaten |
122 |
|
|
6.2 GPIO-Register |
123 |
|
|
6.3 Zwei einfache Beispiele |
132 |
|
|
6.3.1 Rechtecksignal mit dem ODR-Register |
133 |
|
|
6.3.2 MCAL: Neue Funktion(en) |
135 |
|
|
6.3.3 Rechtecksignal mit BSRR |
135 |
|
|
Kapitel 7: Polling, Interrupts und Exceptions |
139 |
|
|
7.1 Allgemeines zu Polling und Interrupts |
140 |
|
|
7.1.1 Polling |
140 |
|
|
7.1.2 Interrupts |
141 |
|
|
7.1.3 Interrupts beherrschen |
142 |
|
|
7.1.4 Maskierbare und nicht-maskierbare Interrupts |
143 |
|
|
7.1.5 Globale Interrupts |
144 |
|
|
7.1.6 Der Nested Vector Interrupt Controller NVIC |
145 |
|
|
7.2 Externe Interrupts |
150 |
|
|
7.2.1 External Interrupt/Event Controller (EXTI) |
151 |
|
|
7.2.2 Beispiel zu externen Interrupts |
156 |
|
|
7.2.3 Erkennung mehrerer externer Interrupts |
162 |
|
|
7.3 Exceptions |
169 |
|
|
Kapitel 8: Alternative GPIO-Funktionen |
171 |
|
|
8.1 Wiederholung |
171 |
|
|
8.2 Aktivieren alternativer Funktionen |
173 |
|
|
8.3 Auswahl alternativer Funktionen |
173 |
|
|
Kapitel 9: System Tick Timer (SysTick) |
177 |
|
|
9.1 Verwendung des SysTick-Timers |
179 |
|
|
9.2 Steuerung mehrerer Funktionen |
184 |
|
|
9.3 Steuerung mehrerer Funktionen: Ein verbesserter Ansatz |
190 |
|
|
9.4 Register des SysTick-Timers |
202 |
|
|
Kapitel 10: Timer-Grundlagen und Basic Timer |
205 |
|
|
10.1 Allgemeines zu Timern und Countern |
208 |
|
|
10.2 Basic Timer TIM6 und TIM7 |
210 |
|
|
10.2.1 Beispiel mit Basic Timer TIM6 |
214 |
|
|
10.3 Prescaler (Vorteiler) der Busse |
219 |
|
|
Kapitel 11: General-Purpose Timer (GP-Timer) |
223 |
|
|
11.1 GP-Timer, Teil 1: TIM9 bis TIM14 |
224 |
|
|
11.1.1 Register der GP-Timer TIM9 bis TIM14 |
225 |
|
|
11.1.2 Beispiel 1 zum Einsatz von TIM12 |
230 |
|
|
11.1.3 Beispiel 2 zum Einsatz von TIM12 |
234 |
|
|
11.2 GP-Timer, Teil 2: TIM2 bis TIM5 |
239 |
|
|
11.2.1 Einschub: Pulsweitenmodulation (PWM) |
241 |
|
|
11.2.2 Beispiel: Dimmen einer LED mittels PWM |
246 |
|
|
Kapitel 12: Advanced-Control Timer |
253 |
|
|
12.1 Neue Register der Advanced-Control Timer |
254 |
|
|
12.2 Einschub: Schalten induktiver Lasten |
258 |
|
|
12.3 Beispiel zur Totzeitgenerierung mit dem STM32F446 |
260 |
|
|
12.3.1 Das Projekt Kap11-ACTIM-01-Center-and-Edge-Align |
260 |
|
|
Kapitel 13: Digital-Analog-Konverter |
267 |
|
|
13.1 Technische Verfahren der D/A-Wandlung |
267 |
|
|
13.1.1 Die Parallelwandlung |
268 |
|
|
13.1.2 Das Zählverfahren |
269 |
|
|
13.1.3 Das R-2R-Verfahren |
269 |
|
|
13.2 DACs in der STM32F4xx-Familie |
270 |
|
|
13.2.1 Datenhalteregister |
271 |
|
|
13.2.2 Datenformate |
272 |
|
|
13.3 Die Register des DAC |
273 |
|
|
13.4 Ein einfaches Anwendungsbeispiel |
275 |
|
|
13.5 Tipps für eigene Anwendungen |
280 |
|
|
Kapitel 14: Analog-Digital-Wandlung |
281 |
|
|
14.1 ADCs in der STM-Familie |
282 |
|
|
14.2 Register in den STM-ADCs |
286 |
|
|
14.3 Anwendungsbeispiel |
291 |
|
|
Teil III: Serielle Schnittstellen |
297 |
|
|
Kapitel 15: Serielle Kommunikation |
299 |
|
|
15.1 Grundlegende Begriffe |
300 |
|
|
15.1.1 Kommunikationsrichtungen |
300 |
|
|
15.1.2 Aufbau der Daten |
301 |
|
|
15.1.3 Datenpegel |
303 |
|
|
15.1.4 Übertragungsgeschwindigkeit |
304 |
|
|
15.1.5 Übertragungsprotokolle |
304 |
|
|
15.1.6 Asynchrone vs. synchrone Datenübertragung |
305 |
|
|
15.2 Ausführungsformen einfacher RS-232-Schnittstellen |
306 |
|
|
Kapitel 16: UARTs und USARTs |
307 |
|
|
16.1 Was sind UARTs und USARTs? |
308 |
|
|
16.1.1 Die UART/USART-Register |
309 |
|
|
16.1.2 Empfangen und Senden von Daten |
314 |
|
|
Kapitel 17: Inter-Integrated Circuit I²C |
323 |
|
|
17.1 Die ursprüngliche Idee hinter I²C |
323 |
|
|
17.2 Prinzipieller Aufbau einer I²C-Schaltung |
324 |
|
|
17.3 Betriebsarten/Protokoll von I²C |
327 |
|
|
17.3.1 Vier Betriebsarten |
327 |
|
|
17.3.2 Das I²C-Protokoll |
329 |
|
|
17.4 I²C in der STM32F4xx-Familie |
331 |
|
|
17.5 Ein Beispiel mit dem PCF8574 |
338 |
|
|
17.5.1 Der PCF8574 |
340 |
|
|
17.5.2 Das Programmlisting |
341 |
|
|
17.6 Daten lesen von I²C-Komponenten |
350 |
|
|
17.7 Anmerkungen zu den Beispielprojekten |
354 |
|
|
Kapitel 18: Serial Peripheral Interface SPI |
359 |
|
|
18.1 Datentransfer in SPI-Interfaces |
362 |
|
|
18.1.1 CPHA = 1 |
362 |
|
|
18.1.2 CPHA = 0 |
363 |
|
|
18.1.3 Anwendung von SPI |
364 |
|
|
18.2 SPI-Register der STM32F4xx-Familie |
364 |
|
|
18.3 Ein einfaches Beispiel mit dem MAX7219 |
370 |
|
|
18.3.1 Kurzbeschreibung des MAX7219 |
380 |
|
|
18.4 Eine kleine Übung |
381 |
|
|
Teil IV: Weitere Komponenten |
383 |
|
|
Kapitel 19: Direct Memory Access (DMA) |
385 |
|
|
19.1 Funktionsweise |
386 |
|
|
19.2 DMAC(s) in der STM32F4xx-Familie |
387 |
|
|
19.3 Beispiel: Memory ? USART2 ? PC mit DMA |
394 |
|
|
19.3.1 Erläuterung der Funktionsweise |
399 |
|
|
19.3.2 »Probleme« von DMA |
401 |
|
|
Kapitel 20: Watchdog |
403 |
|
|
20.1 Independent Watchdog (IWDG) |
403 |
|
|
20.2 Window Watchdog (WWDG) |
405 |
|
|
20.2.1 Funktionsweise |
406 |
|
|
20.3 Debuggen und Watchdogs |
408 |
|
|
Anhang A: Internetadressen und Literaturnachweise |
409 |
|
|
A.1 Literaturnachweise |
409 |
|
|
A.2 Infos zur STM32F4xx-Familie |
410 |
|
|
A.3 Programmierung in C |
410 |
|
|
A.4 Tastaturkürzel von STM32CubeIDE |
410 |
|
|
A.5 Internettutorials |
410 |
|
|
A.6 Support |
411 |
|
|
Anhang B: Dokumentation der MCAL |
413 |
|
|
B.1 Grundlegender Aufbau der Dokumentation |
413 |
|
|
B.2 Erläuterung einzelner Funktionen |
414 |
|
|
Anhang C: Einführung in das Debuggen |
417 |
|
|
C.1 Debugger einrichten |
418 |
|
|
C.2 Variablen »beobachten« |
422 |
|
|
C.3 Anzeige von Prozessorregistern |
424 |
|
|
C.4 Anzeige von SRAM-Inhalten |
425 |
|
|
C.5 Vorsicht bei Watchdogs! |
425 |
|
|
C.6 Ein weiteres tolles Feature |
427 |
|
|
Stichwortverzeichnis |
429 |
|