STM32 für Einsteiger: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
Keine Bearbeitungszusammenfassung
(→‎Taktzeitberechnung und Überwachung: Code zur Aktivierung der DWT-Einheit)
Zeile 370: Zeile 370:
=== Taktzeitberechnung und Überwachung===
=== Taktzeitberechnung und Überwachung===


Bei Zeitkritischen Applikationen stellt sich immer wieder die Frage wie viele Prozessortakte nun die Funktion verbraucht. Ist der Interrupt auch wirklich nicht zu lange und wie viel Reserve gibt es noch?
Bei zeitkritischen Applikationen stellt sich immer wieder die Frage wie viele Prozessortakte nun die Funktion verbraucht. Ist der Interrupt auch wirklich nicht zu lange und wie viel Reserve gibt es noch?
<br>Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:
<br>Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:


Zeile 377: Zeile 377:
#include <stm32f4xx.h> // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.
#include <stm32f4xx.h> // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.


// DWT-Einheit aktivieren
inline void DWT_Enable() {
  CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
}
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:
inline void DWT_CycCounterEn () {
inline void DWT_CycCounterEn () {
Zeile 395: Zeile 399:


   // Systick-Zähler benutzen
   // Systick-Zähler benutzen
  DWT_Enable(); // DWT-Einheit aktivieren
   DWT_CycCounterEn (); // Zähler aktivieren
   DWT_CycCounterEn (); // Zähler aktivieren
   DWT_CycCounterClear (); // Zähler löschen
   DWT_CycCounterClear (); // Zähler löschen

Version vom 17. Oktober 2014, 13:22 Uhr

Immer wiederkehrend hier im Forum "Mit welchem Mikrocontroller anfangen?". Es gibt eine große Auswahl und eben so viele Empfehlungen. In diesem Artikel soll zu erst geholfen werden ob ein Cortex-M3/M4 Kern überhaupt der Richtige für den Start ist. Nicht für jeden ist der Cortex zu empfehlen, denn die Anforderungen und Wünsche die man realisieren möchte, sowie die eigenen Fähigkeiten sind verschieden.

Es werden meist die Prozessoren AVR, PIC, Arduino, MSP430, LPC1xxx und STM32 empfohlen. Seltener auch 8051 und M16C. Alle haben Vorzüge und ebenso auch Nachteile.

STM32F417 auf einem Selbstbau-Board

Eigene Fähigkeiten und Wünsche

Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel "Absolute Beginner" durcharbeiten, sowie die anderen Artikel aus der Kategorie "Grundlagen".
Weitere Artikel die andere Prozessoren näher darstellen da sich dieser Artikel hauptsächlich auf STM32 konzentriert: Entscheidung Mikrocontroller und Mikrocontroller Vergleich. Die Seiten AVR, MSP430, LPC1xxx und PIC zeigen mehr Details über diese µC. Hier werden nur grob ein paar Tabelle zum Vergleichen gezeigt.

Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:

Fähigkeit Cortex AVR PIC MSP430 Arduino
Bitbreite, jedoch unwichtig für Einsteiger 32-bit 8-bit 8-bit (PIC18) 16-bit (PIC24) 32-bit (PIC32) 16-bit 8-bit
Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert O O [1][2] O O X
Wunsch ist SD-Card oder Grafik-Display X O O [3] X[3][4] X[3][4] X O
Wunsch ist TCP/IP Netzwerk X O X [5] O O
Wunsch ist Kamera und Video-/Bildbearbeitung X - - - X - -
Möchte die Erkenntnisse beruflich nutzen X X X X -
Strom sparende Anwendungen -
300 nA Sleep[6]
230 μA/MHz
-
100 nA Sleep[7] [8]
340 μA/MHz
X
9 nA Sleep[9][10]
35 μA/MHz
- X
100 nA Sleep[11][12]
100 μA/MHz
-
Multithreading, RTOS, Schedulern X - [13][14] - [15] [16] X[17] X[17] X [18] -
Besonders große, speicherintensive Programme
z.B. Grafiken, Fonts
bis 2MB Flash
bis 256kB SRAM [19]
bis 256kB Flash
bis 16kB SRAM
bis 128kB Flash
bis 4kB SRAM
bis 2MB Flash
bis 98kB SRAM
bis 2MB Flash
bis 512kB SRAM
bis 512KB Flash
bis 66kB SRAM
bis 256kB Flash
bis 16kB SRAM
Sehr viel PWM mit komplexem Timing X AT90Spwm - X X O -
Deutschsprachige Community O X X [20] [21] - - - X
Anzahl möglicher HW-Breakpoints 4 bis 6 2 1 bis 5 [22] 1 bis 10 [22] 6[22] 2 2
  • X = ja
  • O = Teilweise, Einschränkungen
  • - = nicht empfohlen

Nur um nicht zu verwirren, auch wenn Teile "nicht empfohlen" sind, heißt das nicht dass es mit dem Prozessor nicht geht, vielmehr dass es mehr Aufwand ist das zu realisieren oder mehr Einschränkungen hat. Viele Eigenschaften weisen nur bestimmte Modelle einer Mikrocontrollerfamilie auf. Der Wechsel innerhalb einer Familie gestaltet sich jedoch oft einfach (z.B. innerhalb STM32 oder innerhalb PIC24).

Die Spalte Cortex zeigt die Prozessorfamilie von STM32F0xx bis STM32F4xx mit einem Cortex-M0 oder M3/M4 Kern. Die technischen Daten sind ähnlich anderer Hersteller die auch einen Cortex-Mx Kern verbauen wie z.B. NXP (LPC1xxx), Freescale, Atmel, TI, Toshiba, usw. Jedoch bietet ST mit dem STM32 eine hohe Flexibilität an Gehäuse-Variationen (vergleichbar mit NXP LPC1xxx) und ist privat recht leicht beschaffbar. Übersicht aller verfügbaren STM32 µC von ST[19].

Der STM32 ist in der Tat nicht der beste in der Kategorie "Stromsparend", jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:
"EFM32" von Silabs[23] benötigt nur 0,9 µA im Sleep Mode.

Die Spalte PIC zeigt die Eigenschaften der 8-Bit PIC18 (vergleichbar mit AVR), 16-Bit PIC24/dsPIC (vergleichbar mit MSP430) und 32-Bit PIC32 (vergleichbar mit STM32). Ein Wechsel des Mikrocontrollers innerhalb der Familien ist Codetechnisch problemlos möglich. [24] Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel [25] sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann. Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. [26] Aufgrund gleichbleibender IDE (Mplab) sowie gleichbleibenden Libraries bei Verwendung einer Hochsprache (C) jedoch vor allem zwischen 16-Bit und 32-Bit ohne weitere Probleme möglich [27].
Ein PIC10/12/16 ist für den Einstieg nicht empfohlen, da diese Architekturbedingt viele Einschränkungen haben, die eher hinderlich für das Lernen sind.

Der "Arduino" ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer "Arduino" Programmierumgebung (und einem AVR Prozessor), extra geschaffen für Einsteiger. Allerdings ist da der Lerneffekt viel geringer da man den Prozessor mit der Arduino-Software programmiert und nicht direkt die Register. Anderseits ist der Arduino besser für jemanden geeignet, der eigentlich nicht lernen möchte, sondern nur mal schnell etwas steuern/basteln will und so ohne großartige µC Kenntnisse zum Ziel kommt. Für diese Zielgruppe ist der Arduino perfekt.

  1. [1], RoboterNetz: AVR-Einstieg leicht gemacht
  2. [2], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren
  3. 3,0 3,1 3,2 [3], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32
  4. 4,0 4,1 [4], Microchip Graphics Library
  5. [5], Microchip TCP/IP stack
  6. [6], STM32 L1 series of ultra-low-power MCUs
  7. [7], Atmel picoPower Technology
  8. [http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers
  9. [8], The Truth about Power Consumption in PIC® MCUs with XLP Technology vs. TI’s MSP430
  10. [9], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers
  11. [10], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP
  12. [11], Texas Instruments: Meet MSP430
  13. [12], Atmel AVR freeRTOS port
  14. [13], Femto OS: RTOS for small MCU's like AVR
  15. [14], Microchip PICmicro (PIC18) freeRTOS Port
  16. [15], Salvo RTOS
  17. 17,0 17,1 [16], 3rd Party RTOS selection guide
  18. [17], TI Wiki: MSP430 Real Time Operating Systems Overview
  19. 19,0 19,1 [18], Übersicht aller verfügbaren STM32 µC von ST
  20. [19], pic-projekte.de
  21. [20], sprut.de
  22. 22,0 22,1 22,2 [21], PIC Hardware Breakpoints (Seite 6)
  23. [22], EFM32, der Stromsparende mit Cortex-Mx Kern
  24. [23], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family
  25. [24], Microchip: 2007 Product Selector Guide (Seite 114 ff.)
  26. [25], Microchip: PIC18F to PIC24F Migration: An Overview
  27. [26], Artikel: Practical migration from 8-/16- to 32-bit PIC

Unwichtige Randbedingungen

Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis zum Einstieg (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.

  • Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)
  • 8 (z.B. AVR), 16 (z.B. MSP430) oder 32 (z.B. STM32) Bit
  • Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...
  • Interrupt System mit mehr oder weniger Features
  • Programmiersprache (Assembler, Basic, C, C++, Pascal)
  • Programmierumgebung - ist ohnehin Geschmackssache
  • Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)
  • DIL Gehäuse - steckbretttauglich (STM32-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)
  • Programmieradapter - solange er auch debuggen kann
  • zu 90% reicht doch ein kleiner Prozessor (AVR/PIC) - und für die restlichen kann man immer noch einen großen nehmen. Warum also nicht gleich einen großen nehmen?

Kosten

Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).

Board STM32 AVR PIC18/24/32 MSP430 Arduino
Demo-Board [1] 9..20€ (incl. Programmieradapter und Debugger) 5..500€, z.B. Arduino [2] durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer) [3] ~35€ 20€
Steckbrettaugliches Board s.o. oder [4]S64DIL-405 30€ DIP IC DIP IC oder Microstick DIP IC ab ca. 4€ (Pro Mini)
Einzelchip (Einzelstückpreise) 2..15€ nur SMD (TSSOP..LQFP..BGA) 0,6–5€ SMD + DIP 0,5-15€ SMD + DIP ?? siehe AVR
Programmieradapter 0€ da Bootloader (ROM) UART / USB usw. unterstützt ab 4€
Programmieradapter mit Debugger s.o. oder z.B [5] Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) [6] AVR Dragon 40€
[7] AT JTAG ICE3 99€
[8] PICkit 3 30€ z.B. Dragon 50€ 20€ (Man muss DebugWire aktivieren)

Das Demo-Board sollte ein Board sein, nicht zu teuer, um die ersten Erfahrungen zu sammeln. Wenn einem der Prozessor gefällt, so kann man später immer noch mit einem zweiten Demo-Board, z.B. mit Display aufrüsten.

Wenn man gerne mit einem Steckbrett sich die Schaltung zusammen stecken möchte, so kann man entweder die benötigten Drähte am Demo-Board anlöten oder bei z.B. AVR/PIC Prozessoren gibt es Ausführungen im DIL Gehäuse, die direkt steckbar sind.

Ein Programmieradapter sollte unbedingt auch einen Debugger beinhalten. Denn für den Start ist es ungemein hilfreich zu sehen was im Prozessor gerade geschieht. Die JTAG-Adapter für einen STM32 Prozessor sind alle Debugger-Tauglich. Für die AVR Controller gibt es auch oft reine Programmer (AVR ISP oder Selbstbau-Lösungen über die serielle oder parallele Schnittstelle) welche den Mikrocontroller nur beschreiben können. Für die PIC Controller werden solche reinen Programmer vereinzelt auch noch angeboten. Sinvoller sind hingegen Debugger, die die Ausführung eines Mikrocontrollers anhalten können um die aktuelle Position im Programmcode, Variableninhalt, Register, ... auszulesen bzw. zur Laufzeit zu ändern.

Der für den STM32 empfohlene Segger J-LINK EDU ist zwar nicht der günstigste (z.B. auf einem STM32F4DISCOVERY Borad ist ein ST-LINK/V2 mit drauf, den man für andere STM32 nutzen kann) aber eines der besten, mit sehr guten Software-Tools und nutzbar für alle Prozessoren mit ARM-Kern (ARM7/9/11/... Cortex-Mx der Hersteller Atmel, Energy Micro, Freescale, Holtek, TI, NXP, Nuvoton, ST, Toshiba, ... unter Windows, Linux und MAC). Niemals am Werkzeug sparen und man hat viel mehr Freude bei der Arbeit.

  1. [27], ST STM32F4DISCOVERY Demoboard
  2. [28], Microchip Demoborad
  3. [29], MSP430 Demoborad
  4. [30], S64DIL-405 mit STM32F405
  5. [31], Segger J-LINK EDU
  6. [32], Atmel AVR Dragon
  7. [33], AT JTAG ICE3
  8. [34], Microchip PICkit 3

Programmierumgebungen

Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software

Betriebssystem STM32 AVR PIC MSP430 Arduino
Windows CooCox Atmel-Studio MPLAB X (IDE inklusive compiler) ?? Arduino 1.0.5
Linux Eclipse IDE for C/C++ Developers z.B. Eclipse IDE for C/C++ Developers MPLAB X (IDE inklusive compiler) ?? Arduino 1.0.5
MacOS Eclipse IDE for C/C++ Developers ?? MPLAB X (IDE inklusive compiler) ?? Arduino 1.0.5

natürlich gibt es noch viele weitere (für STM32 siehe STM32#Programmierung), es sollte jedoch nur die jeweils einfachste kostenlose (und ohne Codebegrenzung) für den ersten Einstieg gezeigt werden.

  • CooCox Anleitung wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt, Artikel: STM32 CooCox Installation. Diese Anleitung ist eine Schritt-Für-Schritt Anleitung um den aller ersten Start zu vereinfachen.
  • Mit CooCox können sehr viele Prozessoren mit Cortex-M0, M3 und M4 Kern programmiert werden. Unter anderem der Firmen Atmel, Energy Micro, Freescale, Holtek, TI, NXP, Nuvoton, ST und Toshiba. Somit hat man eine Entwicklungsumgebung und ist damit nicht an einen Hersteller der µC gebunden.
  • Mit MPLAB X können alle Prozessoren von Microchip (z.B. PIC18, PIC24, PIC32, dsPIC) programmiert werden.

Dokumentation

Bevor man sich für einen Prozessor entscheidet, sollte man unbedingt deren Dokumentation mal zumindest überfliegen und auch deren Errata lesen. Nicht dass man eine Anwendung erstellen möchte und stellt hinterher fest, dass genau dieser Teil so buggy ist, dass er nicht genutzt werden kann.

Beim STM32 hat die Dokumentation doch recht viele Seiten, viel mehr als bei einem AVR oder PIC, dabei ist vieles eher knapp beschrieben. Der Aufbau der STM32 Dokumentation ist hier beschrieben.
Bei den PICs ist die Dokumentation wiederum anders strukturiert, siehe im PIC Artikel.

Für die STM32, AVR und PIC Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.

Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.

Eine Übersicht über die Funktionen gibt es im Artikel: STM32

Die Arbeit mit dem STM32

Zu erst einmal SOOO groß sind die Unterschiede zwischen den einzelnen Prozessoren nicht. Alle haben Ein-/Ausgänge und um mittels einem Port-Pin eine LED ansteuern zu können, muss bei jedem Prozessor der Pin erst einmal parametriert werden, egal ob das jetzt ein STM32 oder ein AVR oder ein MSP430 ist. Nur hat man bei einem STM32 doch einige Funktionen mehr, z.B. zuschaltbarer Pull-Up oder Pull-Down Widerstand und spezielle Setz-Rücksetzregister, die andere Prozessoren nicht haben, jedoch das Programmieren vereinfachen. Der Haupt-Unterschied zu den anderen Prozessoren ist, dass der STM32 so viele Peripherie-Module beherbergt, dass man die einzeln immer mit einem Clock aktivieren muss, denn damit lässt sich viel Strom sparen.

Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:

  • 1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.
  • 2. Werte ermitteln, die in die Register eingetragen werden.
  • 3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein AVR, 8051/2, ARM,...... ist.

Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,... Aber es steht doch alles im Datenblatt. Und ob ich jetzt einen AVR oder einen ARM das erste Mal vor mir liegen hab. Ich brauch in allen Fällen die oben beschriebenen Schritte.

Das Interruptsystem ist bei einem STM32 zusätzlich priorisiert. Damit kann man festlegen, welcher Interrupt vorrangig bearbeitet wird. Die Prioritätenvergabe ist auch kein Hexenwerk.

Zu allen Prozessoren liefern die jeweiligen Hersteller umfangreiche Demo-Codes und Libraries mit. Meist sind alle in C geschrieben, daher sollte auch die Programmiersprache C verwendet werden. Vor allem auch wenn man berufliche Absichten verfolgt.

Und wenn man einen STM32 kann, dann ist ein Umstieg auf einen LPC1xxx (NXP) oder andere Hersteller überhaupt kein Problem (*), denn die bieten ebenfalls Prozessoren mit Cortex-M3 Kern und man kann diese mit der gleichen Programmierumgebung programmieren. Somit ist man nicht zwingend herstellerabhängig. (* jeder Hersteller verbaut seine eigene Peripherie, die andere Funktionalitäten haben.)

Mit einem STM32 kann man als Hobby-Baster und professionell nahezu alle Anwendungen realisieren. Der hat genügend RAM und FLASH Speicher und auch genügend Geschwindigkeit. Viele Gehäuse-Varianten, um kleine bis hin zu größere Geräte zu erstellen. Viele Schnittstellen sind im Artikel STM32 beschrieben.

Für den Einstig gibt es diverse, auch deutschsprachige, Tutorials im Netz. Eine Übersicht ist hier auf der STM32 Seite. (Beispiel: STM32 Tutorial in Deutsch von Diller Technologies)
Wobei dazugesagt werden muss, dass diese meist auf die Standard ST-Libs aufbauen. Diese Libs vereinfachen zum einen das Ansteuern/die Benutzung der Peripheriefunktion zum anderen muss man diese erst mal kennenlernen. Vereinfacht wird das da ALLE ST-Demo-Codebeispiele ebenfalls auf diesen Lib's basieren und somit wird der Wechsel innerhalb des STM32 deutlich vereinfacht.
STM32F4xx Library von ST: "STSW-STM32065 STM32F4 DSP and standard peripherals library" incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.

Der einzige Nachteil beim STM32: Man muss etwas mehr lesen, da eine Peripherie doch viel mehr Funktionalität hat (sofern man das Modul überhaupt benötigt). Ansonsten kenne ich nicht wirklich einen Grund, warum man als Neueinsteiger keinen STM32 nehmen sollte.

Programmiersprachen

  • Wie bei vielen anderen Controllern wird beim STM32 auch hauptsächlich C und C++ verwendet. Kennen sollte man die Programmiersprache C schon, wenn man davon noch keine Ahnung hat dann sollte man erst mal mittels einem Tutorial auf einem PC ein Konsoleprogramm schreiben, sodass man es einigermaßen kennen lernt. Hier im Forum gibt es ebenfalls Artikel dazu. Zielt man auf die (spätere) Anwendung in der Industrie, sollte aufgrund der Verbreitung auf jeden Fall C (oder C++) gewählt werden; außerdem sind die meisten verfügbaren Libraries in C geschrieben.
  • Assembler sollte man nur grob verstehen, Details wie ein Befehl arbeitet ist unwichtig. Selbst wenn man die Zyklen für einen Funktionsaufruf wissen will, so bietet der STM32 (Cortex-M3) einen Cycle-Counter den man auslesen kann; durch die komplexere Pipeline und Cache-Effekte sind die Laufzeiten allerdings nicht genau vorhersehbar. Wird zyklengenause Timing benötigt, sollten Timer verwendet werden - davon hat der STM32 genug.

Der 32bit-Adressraum, der RAM, Flash, I/O-Register vereinheitlicht ansprechen kann (im Gegensatz zu z.B. AVR) ist ideal für eine Verwendung durch Hochsprachen; bei Pointern muss keine zusätzliche Information verwaltet werden, in welche Art Speicher sie zeigen. Die Adresse gibt dies eindeutig an (es gibt nur eine Adresse 42, und nicht 2 wie z.B. beim AVR (Flash, RAM & I/O)) und die Hardware spricht automatisch den richtigen Speicher an. Die Möglichkeiten zur Offset-Adressierung, der Barrel-Shifter, Divsions-Einheit, die FPU (bei STM32F4), Interrupt-Modell etc. begünstigen ebenfalls die Erzeugung effizienteren Codes. Außerdem haben die STM32 einfach mehr "rohe Leistung", d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.

Folgerung: Die Programmierung in Hochsprachen ist bequemer als bei 8-Bittern, denn man muss sich einfach weniger Gedanken machen, ob der Compiler ein Programm nun effizent umsetzen kann (kann man natürlich trotzdem machen, um noch mehr Leistung "herauszuquetschen", wenn man will).

Weitere Randbedingungen für die Entscheidung

Der wichtige Punkt, der oftmals auch vergessen wird: die Beschaffbarkeit. Wenn jemand einen Renesas M16C oder Fujitsu empfiehlt, dann sucht man erst mal und findet nur wenige vereinzelte die man privat kaufen kann.

Oder auch die Unterstützung im Internet - ist bei einigen Exoten spärlich. Dieses Forum bietet die beste Hilfe für AVR, PIC, MSP430, LPC1xxx und STM32.

Andere Prozessoren sind schon sehr alt, bzw. nicht mehr modern da deren Peripherie zum Teil doch recht eingeschränkte Funktionalität bietet. z.B. viele 8051 Typen oder PIC16 (oder auch dsPIC30). Die mögen für Mini-Anwenungen gut sein, aber wer will den schon gerne sich extra für eine Kleinanwendung mit einem kleinen µC auseinandersetzen, wenn er schon einen STM32 kennt, mit dem er alles machen kann (und sich bereits gute Funktionen geschrieben hat)?

Daher mein Resümee: wer nicht gerade auf den Kopf gefallen ist, der kann getrost mit einem STM32 starten. Ein STM32F4DISCOVERY Board kostet nur ca. 20 EUR - und mehr muss für den ersten Start nicht investiert werden - wenn es doch zu komplex sein sollte gibt es hier im Forum auch viel Hilfe. Jedenfalls sind diese 20 EUR wirklich keine große Investition.
Wer berufliche Absichten verflogt, sollte zu einem späteren Zeitpunk sich unbedingt auch mit einem zweiten, anderen Prozessor beschäftigen um so die nötigen Erfahrungen zu gewinnen.

Ein paar Forenbeiträge:

Übersicht CPU Funktionalitäten

In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben

STM32F407 - vom STM32F4DISCOVERY Board

STM32F407.png
Stm32f4 discovery2.png
Blockdiagramm STM32F407 STM32F4DISCOVERY Demoborad

Es sind sehr viele Peripheriemodule im µC implementiert. Jedes einzelne Peripherie-Modul (z.B. Ethernet, USB, CAN, Timer, AD-Wandler, usw.) kann aktiviert werden, indem der Clock freigeschaltet wird. So lange der Clock nicht aktiviert wurde verhält sich das Modul so als ob es nicht vorhanden wäre und beeinträchtigt in keinster Weise die Bearbeitung vom Prozessor. Somit lässt sich der Stromverbrauch senken.

Eine ganze Auflistung der Einzelmodule steht im Artikel: STM32 und auf der Homepage von ST

Zu Anfang mag vielleicht die interne Busstruktur verwirren, jedoch braucht man diese nicht beachten. Wenn nun die CPU auf UART4 zugreifen möchte, so gehen die Daten durch die Busse "AHB1" > "ABH/APB1-Bridge" > "APB1". Dies erledigt der µC ganz von alleine. Diese Unterteilung ist technisch nötig, da die Peripheriebusse nicht mit dem gleichen Prozessortakt betrieben werden (wie z.B. bei [[MSP430], siehe Schaubild unten), die "Bridge" managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.
Die "AHB-Bus-Matrix" ist ebenfalls für den Anwender meist uninteressant. ST hat damit ein System geschaffen, damit die CPU, DMAs und Displaycontroller gleichzeitig auf die verschiedenen RAM-Bereiche zugreifen können um mehr Daten parallel zu verarbeiten. Somit braucht man diese Matrix erst mal nicht beachten.

Ebenso braucht man zu Anfang sich auch keine Gedanken um den Prozessortakt machen, wenn man nichts initialisiert so läuft der STM32F4xx mit dem internen RC-Oszillator von 16MHz und die Peripheriebusse laufen ebenfalls mit der gleichen Geschwindigkeit. Erst wenn man später umfangreichere Applikationen schreibt, bei der die 16MHz nicht mehr reichen, so kann man die PLL aktivieren und die Taktrate flexibel bis auf 168MHz hochsetzen. (Siehe Demo-Projekt von STM32 CooCox Installation.)

AVR (Arduino)

Details können im Artikel AVR gelesen werden.

PIC18, PIC24, PIC32

Details können im Artikel PIC gelesen werden.

MSP430 - vom MSP-EXP430FR5739 Experimentier-Board

MSP430FR5739.gif
MSP-EXP430FR5739.jpg
Blockdiagramm MSP430FR5739 MSP-EXP430FR5739 Demoboard

Details können im Artikel MSP430 gelesen werden.

LPC1x d.h. Cortex -M0 & -M3 Familie von NXP

Details können aus dem Leitartikel LPC1xxx und den darin verlinkten Artikeln entnommen werden.

Tipps und Tricks bei der Programmierung

Interruptcontroller vom Cortex-M3/M4

Der "Nested Vectored Interrupt Controller" (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.

Beim STM32 hat jeder Interrupt eine Priorität von 4 Bit (bei ARMv7M je nach Implementation bis 8bit möglich). Diese 4 Bit können in eine "pre-emption priority" und "subpriority" unterteilt werden.

Beispiel 2 Bit zu 2 Bit Unterteilung:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority

Somit kann "pre-emption priority" den Wert 0..3 und "subpriority" auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.

Beispiel:
ISR1 Pre 2 / Sub 1
ISR2 Pre 1 / Sub 1
ISR3 Pre 1 / Sub 2

Wenn jetzt ISR1 kommt, dann wird der aufgerufen. Kommt während dem ein ISR2 dann darf der den ISR1 unterbrechen, da er eine höhere "pre-emption priority" Wertigkeit hat.

Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.

Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche "pre-emption priority" haben fällt die Entscheidung anhand der "subpriority".

Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:

NVIC_InitTypeDef NVIC_InitSt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // << Tiefe Prio
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitSt);

Taktzeitberechnung und Überwachung

Bei zeitkritischen Applikationen stellt sich immer wieder die Frage wie viele Prozessortakte nun die Funktion verbraucht. Ist der Interrupt auch wirklich nicht zu lange und wie viel Reserve gibt es noch?
Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:

#include <stdint.h> // Für die Standard-Typen uint32_t etc.
#include <stm32f4xx.h> // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.

// DWT-Einheit aktivieren
inline void DWT_Enable() {
  CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
}
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:
inline void DWT_CycCounterEn () {
  DWT->CTRL = 0x40000001;
}
inline void DWT_CycCounterDis () {
  DWT->CTRL = 0x40000000;
}
inline uint32_t DWT_CycCounterRead () {
  return DWT->CYCCNT;
}
inline void DWT_CycCounterClear () {
  DWT->CYCCNT = 0;
}

int main () {
  // ... Programmcode ...

  // Systick-Zähler benutzen
  DWT_Enable(); // DWT-Einheit aktivieren
  DWT_CycCounterEn (); // Zähler aktivieren
  DWT_CycCounterClear (); // Zähler löschen
  // ... Programmbearbeitung ...
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen
  
  // ... weiterer Programmcode ...
}

In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:

Zeit in µSec = iZ / CPU-Takt in MHz

FAQ - Anfängerfragen

  • Muss ich, wenn ich die Debugging-Funktionen nutzen möchte einen JTAG Adapter anschließen? - Ja. Auf dem STM32F4DISCOVERY ist jedoch bereits einer mit drauf.
  • Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.
  • Ich möchte eine eigene Platine entwickelt, jedoch der 20polige JTAG-Anschluss ist mir zu groß, gibt es eine Alternative? - Ja, "Der 10-polige JTAG Stecker von mmvisual"

Weblinks, Foren, Communities, Tutorials