STM32 für Einsteiger: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
(Weblink hinzugefügt)
K (Einige Formulierungen (umso desto) , Satzzeichen. Satzbau.)
 
(33 dazwischenliegende Versionen von 13 Benutzern werden nicht angezeigt)
Zeile 51: Zeile 51:
| align="center" | X
| align="center" | X
|-
|-
| Strom sparende Anwendungen  
| Stromsparende Anwendungen  
| align="center" | - <br> 300 nA Sleep<ref name="STM_Power">[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs</ref><br>230 μA/MHz
| align="center" | - <br> 300 nA Sleep<ref name="STM_Power">[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs</ref><br>230 μA/MHz
| align="center" | - <br>100 nA Sleep<ref name="AVR_Power1">[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology</ref> <ref name="AVR_Power2">[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers</ref><br>340 μA/MHz
| align="center" | - <br>100 nA Sleep<ref name="AVR_Power1">[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology</ref> <ref name="AVR_Power2">[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers</ref><br>340 μA/MHz
Zeile 67: Zeile 67:
|-
|-
| Besonders große, speicherintensive Programme<br>z.B. Grafiken, Fonts  
| Besonders große, speicherintensive Programme<br>z.B. Grafiken, Fonts  
| align="center" | bis 2MB Flash<br>bis 256kB SRAM <ref name="STM32Ueb">[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST</ref>
| align="center" | bis 2MB Flash<br>bis 1024kB SRAM <ref name="STM32Ueb">[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST</ref>
| colspan="2" align="center" | bis 256kB Flash<br>bis 16kB SRAM  
| colspan="2" align="center" | bis 256kB Flash<br>bis 16kB SRAM  
| align="center" | bis 128kB Flash<br>bis 4kB SRAM || bis 2MB Flash<br>bis 98kB SRAM || bis 2MB Flash<br>bis 512kB SRAM  
| align="center" | bis 128kB Flash<br>bis 4kB SRAM || bis 2MB Flash<br>bis 98kB SRAM || bis 2MB Flash<br>bis 512kB SRAM + 32MB DRAM (PIC32MZ DA)
| align="center" | bis 512KB Flash<br>bis 66kB SRAM  
| align="center" | bis 512KB Flash<br>bis 66kB SRAM  
|-
|-
Zeile 94: Zeile 94:
* X = ja
* X = ja
* O = Teilweise, Einschränkungen
* O = Teilweise, Einschränkungen
* - = nicht empfohlen
* - = nicht empfohle
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.
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).
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).
Zeile 100: Zeile 100:
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<ref name="STM32Ueb">[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST</ref>.
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<ref name="STM32Ueb">[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST</ref>.


Der STM32 ist in der Tat nicht der beste in der Kategorie "Stromsparend", jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:
Der STM32Fxxx ist in der Tat nicht der beste in der Kategorie "Stromsparend", die neueren STM32L0xx und STM32L4xx sind deutlich sparsamer, besonders bei hohen Temperaturen. Eine interessante Alternative mit Cortex-Mx Kern:
<br>"EFM32" von Silabs<ref name="EFM32">[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern</ref> benötigt nur 0,9 µA im Sleep Mode.
<br>"EFM32" von Silabs<ref name="EFM32">[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern</ref> benötigt nur 0,9 µA im Sleep Mode.


Zeile 107: Zeile 107:
<br>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.
<br>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.
Der "[[Arduino]]" ist kein eigenständiger Prozessor, sondern ein fertiges Board (mit z.B. einem AVR oder STM32 Prozessor) und einer "[[Arduino]]" Programmierumgebung, 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.


<references />
<references />
Zeile 124: Zeile 124:
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)
* Programmieradapter - solange er auch debuggen kann
* 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?
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.


= Kosten =
= Kosten =
Zeile 132: Zeile 132:
{| {{Tabelle}}
{| {{Tabelle}}
|- bgcolor="#d0d0ff"
|- bgcolor="#d0d0ff"
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]
|-
|-
| Demo-Board  
| Demo-Board  
| align="center" | <ref name="STM32F4DISCOVERY">[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard</ref> 9..20€ (incl. Programmieradapter und Debugger)  
| align="center" | Nucleo64 Boards<ref name="NUCLEO64">[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64</ref> und STM32 Discovery Boards<ref name="STM32F4DISCOVERY"> [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848] STM32 Discovery</ref> ab 15€<br>(incl. Debugger)  
| align="center" | 5..500€, z.B. [[Arduino]] || align="center"| <ref name="PICDEMOBOARD">[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&Category=Starter%20Kits&mid=1&lmid=610], Microchip Demoboard</ref> durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)   
| align="center" | [[Arduino]] Uno clone ab 9€ || align="center"| Microchip Demoboard<ref name="PICDEMOBOARD">[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&Category=Starter%20Kits&mid=1&lmid=610] Microchip Demoboard</ref> ab 18€<br>(Für 16 und 32bit auch mit integriertem Debugger)   
| align="center" | <ref name="MSP430DEMOBOARD">[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard</ref> ~35€  
| align="center" | MSP430 Demoboard <ref name="MSP430DEMOBOARD">[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard</ref> ~35€  
| align="center" | 20€
|-
|-
| Steckbrettaugliches Board  
| Steckbrettaugliches Board  
| align="center" | s.o. oder <ref name="STM32F405Board">[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405</ref>S64DIL-405 30€, STM32F103C8 4€ (China)
| align="center" | Blue-Pill Board <ref name="BLUEPILL">[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board</ref> ab 1,50€, S64DIL-405 <ref name="STM32F405Board">[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405</ref> mit STM32F405 30€
| align="center" | DIP IC
| align="center" | [[Arduino]] Nano clone ab 2€
| align="center" | DIP IC oder Microstick
| align="center" | PIC Microstick
| align="center" | DIP IC
| align="center" |  
| align="center" | ab ca. 1.50€ (Pro Mini, China)
|-
|-
| Einzelchip (Einzelstückpreise)
| Einzelchip (Einzelstückpreise)
| align="center"| 2..15€ nur SMD (TSSOP..LQFP..BGA)  
| align="center"| 1..15€<br>nur SMD (TSSOP..LQFP..BGA)  
| align="center"|0,6–5€ SMD + DIP  
| align="center"| 0,6..15€<br>SMD + DIP  
| align="center"|0,5-15€ SMD + DIP  
| align="center"| 0,5..15€<br>SMD + DIP  
| align="center"|??
| align="center"|  
| align="center"|siehe AVR
|-
|-
| Programmieradapter  
| Programmieradapter mit Debugger
| align="center" | 0€ da Bootloader (ROM) UART / USB usw. unterstützt
| align="center" | ST-Link clone 2,50€<br>ST-Link original 48€<br>Segger J-LINK EDU <ref name="JLINKEDU"> [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU</ref> 50€
| align="center" | ab 4€
| align="center" | Atmel AVR Dragon 40€<br>Atmel ICE ohne Gehäuse ab 99€
| align="center" |  
| align="center" | PICkit 3 clone 8€<br>Microchip PICkit 3 original 90€
| align="center" |  
| align="center" |  
| align="center" |
|-
| Programmieradapter mit Debugger
| align="center" | s.o. oder z.B <ref name="JLINKEDU">[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU</ref> Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren)
| align="center" | <ref name="AVRDragon">[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon</ref> AVR Dragon 40€<br><ref name="JTAGICE3">[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3</ref> AT JTAG ICE3  99€
| align="center" | <ref name="PICKIT3">[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3</ref> PICkit 3 30€
| align="center" | z.B. Dragon 50€
| align="center" | 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.
Das Demo-Board sollte preisgünstig sein, um eventuelle Verluste bei falscher Benutzung gering zu halten. Wenn einem der Prozessor gefällt, so kann man später immer noch auf ein umfangreicheres Board (z.B. mit Display) umsteigen.
 
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.  
Zum Debuggen von STM32 Mikrocontrollern benötigt man einen Programmieradapter mit SWD oder JTAG Protokoll. Die meisten Demo Boards von ST enthalten bereits einen SWD fähigen ST-Link Adapter. Aktuell (2022) z.B. [https://www.st.com/en/development-tools/stlink-v3set.html STLINK-V3SET] und [https://www.st.com/en/development-tools/stlink-v3mini.html STLINK-V3MINI]


Der für den [[STM32]] empfohlene Segger J-LINK EDU ist zwar nicht der günstigste (z.B. auf einem STM32F4DISCOVERY Board 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.
Der Segger J-LINK EDU ist zwar nicht der günstigste Programmieradapter/Debugger, hat jedoch einen guten Ruf und ist nutzbar für praktisch alle Prozessoren mit ARM-Kern. Der Hersteller bewirbt ihn als besonders schnell.


<references />
<references />
Zeile 181: Zeile 168:
= Programmierumgebungen=
= Programmierumgebungen=


Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und leistungsfähige Software.
 
Aktuell (2022) ist für den Einstieg die [https://www.st.com/en/development-tools/stm32cubeide.html STM32CubeIDE] und [https://www.st.com/en/development-tools/stm32cubemx.html STM32CubeMX] zu empfehlen. STM32CubeIDE ist die IDE für die SW Entwicklung in C und C++ inkl. Debugging. STM32CubeMX ist ein grafisches Tool zur Konfiguration des Controllers (IO's, Timer, Interrupts, Clocktree, ...) mit automatischer Codegenerierung, Energieverbrauchsberechung und Visualisierung und enthält auch die Downloadmöglichkeit für viele Beispielprogramme in Abhängigkeit von der verwendeten MCU.
 
STM32CubeIDE basiert auf Eclipse, OpenOCD und GCC und läuft unter Linux und Windows. Unter Linux beträgt die Installationsgröße für STM32CubeIDE ca. 2,5 GB auf der Systempartition (/opt/stm32cubeide), für STM32CubeMX knappe 700 MB (/opt/stm32cubemx). Zusätzlicher Plattenplatz wird für Examples, Demos, Treiber (Hardware Abstraction Layer (HAL), Low-Level (LL), Board Supported Packages (BSP)) usw. benötigt und wird projektspezifisch von der verwendeten MCU im Ordner des Benutzers abgelegt. Hier sollte man ein paar hundert MB für reservieren.


{| {{Tabelle}}
Der vollständigkeithalber sei noch erwähnt, dass die beiden IDE's [https://atollic.com/ TrueStudio] der Fa. Attolic und CooCox tot sind. True Studio ist in der STM32CubeIDE aufgegangen, CooCox ist bereits vor Jahren komplett eingestellt worden, auch ist die Homepage zu dem Projekt nicht mehr existent.
|- bgcolor="#d0d0ff"
! Betriebssystem || [[STM32]] || [[AVR]] || [[PIC]] || [[MSP430]] || [[Arduino]]
|-
| Windows
| align="center"|[http://www.coocox.org/CooCox_CoIDE.htm CooCox, EmBitz, Eclipse]
| align="center"|Atmel-Studio
| align="center"|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler)
| align="center"|TI Code Composer Studio
| align="center"|[[Arduino]] IDE
|-
| Linux
| align="center"|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers]
| align="center"|z.B. [http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers]
| align="center"|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler)
| align="center"|TI Code Composer Studio
| align="center"|[[Arduino]] IDE
|-
| MacOS
| align="center"|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers]
| align="center"|??
| align="center"|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler)
| align="center"|TI Code Composer Studio
| align="center"|[[Arduino]] IDE
|}


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.
Alte Projekte von True Studio lassen sich so einfach leider nicht in STM32CubeIDE importieren, hier muss manuell nachgearbeitet werden..


* [http://www.coocox.org/CooCox_CoIDE.htm 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.
Im professionellen Umfeld sind die folgenden Entwicklungsumgebungen verbreitet: [http://www.keil.com/product/ Keil], [https://www.iar.com/ IAR]. Das [https://www.segger.com/products/development-tools/embedded-studio/ Segger Enbedded Studio] ist mit Einschränkungen kostenlos verwendbar.
* Mit [http://www.coocox.org/CooCox_CoIDE.htm 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 [http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] können alle Prozessoren von Microchip (z.B. PIC18, PIC24, PIC32, dsPIC) programmiert werden.


= Dokumentation=
= Dokumentation=
Zeile 222: Zeile 187:
<br>Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].
<br>Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].


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


Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.
Zeile 230: Zeile 195:
= Die Arbeit mit dem [[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.
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.
Der Hauptunterschied 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:
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.
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.
*2. Werte ermitteln, die in die Register eingetragen 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.
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]], ... ist.
 
Noch einfacher und wesentlich schneller geht die Konfiguration mit dem STM32CubeMX Tool mit anschließender Codegenerierung, sofern die Konfiguration von STM32CubeMX geprüft und für OK befunden wurde.


Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...
Es 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.
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.
Das Interruptsystem (NVIC, Nested Vectored Interrupt Controller) ist bei einem [[STM32]] zusätzlich priorisiert. Damit kann man festlegen, welcher Interrupt vorrangig bearbeitet wird. Die Prioritätenvergabe ist auch kein Hexenwerk. Hier kann STM32CubeMX ein große Hilfe sein.


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.
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 oder 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.)
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 verschiedenen Cortex-M Kernen 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.
Mit der [[STM32]] Serie kann man nahezu alle Anwendungen realisieren. Die STM32-Serie hat genügend RAM, FLASH Speicher und eine entsprechende Anzahl an verschiedenste IO's, von einfachen GPIO's über SPI/I2C über I2S, SD-Card und USB, und auch ausreichend Geschwindigkeit und viele Gehäuse-Varianten. Viele Schnittstellen sind im Artikel [[STM32]] beschrieben.


Für den Einstig gibt es diverse, auch deutschsprachige, Tutorials im Netz. Eine Übersicht ist [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials hier auf der STM32 Seite]. (Beispiel: [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies])
Für den Einstig gibt es diverse, auch deutschsprachige, Tutorials im Netz. Eine Übersicht ist [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials hier auf der STM32 Seite]. (Beispiel: [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies])
<br>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 [http://www.st.com/stonline/stappl/productcatalog/app?page=partNumberSearchPage&levelid=SS1577&parentid=1743&resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib's basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.
<br>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 einmal kennenlernen. Vereinfacht wird das da ALLE [http://www.st.com/stonline/stappl/productcatalog/app?page=partNumberSearchPage&levelid=SS1577&parentid=1743&resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib's basieren und somit wird der Wechsel innerhalb der [[STM32]] Familie deutlich vereinfacht.
<br>STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# "STSW-STM32065 STM32F4 DSP and standard peripherals library"] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.
<br>STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# "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.
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 sich nicht für einen [[STM32]] entscheiden sollte.
 
Wichtige Dokumente sind:
* User Manual zum verwendeten Board (Discovery Boards (grün), Nucleo Boards (weiß), ...)
* Getting started with .... (Application Note, AN....)
* Programming Manual STM32... (PM...)
* Reference Manual (RMxxxx)
* Datasheet zum Prozessor
* diverse User Guides für Examples, Treiber (BSP, HAL, LL), RTOS, FAT-FS, ...
 
Die Seitenzahl der Dokumente zusammen beträgt einige tausend. Es sind aber keine "Lesebücher", die von vorn bis hintengelesen werden möchten, sondern Nachschlagewerke. Man ließt im Grunde nur den Teil, der gerade interessant ist.


= Programmiersprachen =
= 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.
* Wie bei vielen anderen Controllern wird beim [[STM32]] auch hauptsächlich C und C++ verwendet. aber auch Pascal oder Basic ist problemlos möglich (z.B. von mikroe). Kennen sollte man die Programmiersprache C schon, wenn man davon noch keine Ahnung hat 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.
* 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 zyklengenaues 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.<br/>
Der 32 Bit-Adressraum, der RAM, Flash und I/O-Register vereinheitlicht ansprechen kann im Gegensatz z. B. zum [[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.<br/>
<br/>
<br/>
'''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).
'''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).
Zeile 269: Zeile 246:
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]].
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)?
Andere Prozessoren sind schon sehr alt bzw. nicht mehr modern, da deren Peripherie zum Teil doch recht eingeschränkte Funktionalität bietet wie z.B. viele 8051 Typen oder PIC16 (oder auch dsPIC30). Die mögen für Mini-Anwendungen gut sein, aber wer will denn schon gerne sich extra für eine Kleinanwendung mit einem kleinen µC auseinandersetzen, wenn man schon einen [[STM32]] kennt, mit dem man vieles machen kann und sich vllt. 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 [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419?s_searchtype=keyword 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.
Daher mein Resümee: Wer nicht gerade auf den Kopf gefallen ist, der kann getrost mit einem [[STM32]] starten. Ein [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419?s_searchtype=keyword 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 eine gute Investition.
<br>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.
<br>Wer berufliche Absichten verfolgt, 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:
Ein paar Forenbeiträge:
Zeile 280: Zeile 257:
= Übersicht CPU Funktionalitäten=
= Übersicht CPU Funktionalitäten=


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


=== STM32F407 - vom STM32F4DISCOVERY Board ===
=== STM32F407 - vom STM32F4DISCOVERY Board ===
Zeile 294: Zeile 271:
|}
|}


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.
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 keiner Weise den Prozessor. Somit lässt sich der Stromverbrauch senken.


Eine ganze Auflistung der Einzelmodule steht im Artikel: [[STM32]] und [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 auf der Homepage von ST]
Eine ganze Auflistung der Einzelmodule steht im Artikel: [[STM32]] und [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 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.
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.
<br>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.
<br>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]].)
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 16 MHz 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 168 MHz 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===
 
{| class="wikitable"
|-
| [[Datei:MSP430FR5739.gif|mini|450px]]
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]
|-
| Blockdiagramm MSP430FR5739
| MSP-EXP430FR5739 Demoboard
|}
 
Details können im Artikel [[MSP430]] gelesen werden.


=== LPC1x d.h. Cortex -M0 & -M3 Familie von NXP ===
=== LPC1x d.h. Cortex -M0 & -M3 Familie von NXP ===
Zeile 340: Zeile 296:
</syntaxhighlight>
</syntaxhighlight>


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.
Somit kann "pre-emption priority" den Wert 0..3 und "subpriority" auch 0..3 erhalten. Je kleiner die Zahl ist, desto höherwertiger ist der Interrupt.


Beispiel:
Beispiel:
Zeile 347: Zeile 303:
<br>ISR3 Pre 1 / Sub 2
<br>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 jetzt ISR1 kommt, dann wird der aufgerufen. Kommt währenddessen 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 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".
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:
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:
Zeile 369: Zeile 325:


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
#include <stdint.h> // Für die Standard-Typen uint32_t etc.
#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.
#include <stm32f4xx.h> // hier die Header-Datei der CMSIS für die jeweilige Familie verwenden


// DWT-Einheit aktivieren
// DWT-Einheit aktivieren
Zeile 376: Zeile 332:
   CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
   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 () {
   DWT->CTRL = 0x40000001;
   DWT->CTRL = 0x40000001;
}
}
inline void DWT_CycCounterDis () {
inline void DWT_CycCounterDis () {
   DWT->CTRL = 0x40000000;
   DWT->CTRL = 0x40000000;
}
}
inline uint32_t DWT_CycCounterRead () {
inline uint32_t DWT_CycCounterRead () {
   return DWT->CYCCNT;
   return DWT->CYCCNT;
}
}
inline void DWT_CycCounterClear () {
inline void DWT_CycCounterClear () {
   DWT->CYCCNT = 0;
   DWT->CYCCNT = 0;
Zeile 410: Zeile 370:
= FAQ - Anfängerfragen=
= 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.
* Was brauche ich zum Programmieren/Debuggen? - Alle STM32 Mikrocontroller können über die SWD Schnittstelle programmiert und debuggt werden. Auch die JTAG Schnittstelle eignet sich dazu, benötigt aber etwas mehr Leitungen. Geeignete Adapter findet man zum Beispiel unter dem Namen ST-Link oder J-Link. Alle Discovery Boards und Nucleo Boards von ST enthalten bereits einen ST-Link Adapter. Bei den Nucleo-64 Boards ist er sogar abtrennbar und einzeln nutzbar. Alle neueren STM32 besitzen einen internen Bootloader, so dass sich dieser per SPI, UART oder USB bespielen lässt. Wenn Debuggen per Printausgabe reicht und sowieso eine eine USB Schnittstelle vorhanden sein soll, kann auf extra Programmierhardware komplett verzichten und braucht nur einen Jumper am Boot Pin bestücken.
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.
* Ich möchte eine eigene Platine entwickeln, jedoch der 20polige [[JTAG]]-Anschluss ist mir zu groß, gibt es eine Alternative? - Ja, [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual "Der 10-polige JTAG Stecker von mmvisual"]
* Ich möchte eine eigene Platine entwickelt, jedoch der 20polige [[JTAG]]-Anschluss ist mir zu groß, gibt es eine Alternative? - Ja, [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual "Der 10-polige JTAG Stecker von mmvisual"]


= Weblinks, Foren, Communities, Tutorials =
= Links =
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]
* Anleitung: [[STM32 Eclipse Installation]]
* [[STM32 CooCox Installation]]
* Anleitung: [http://stefanfrings.de/stm32/index.html STM32 Anleitungen und ein kleines Buch für den Einstieg]  
* [[STM32 Eclipse Installation]]
* Diskussion: [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]
* [[LPC1xxx für Umsteiger]]
* [[http://stefanfrings.de/stm32/index.html Notizen zu ARM Cortex M3 Mikrocontrollern der STM32F1 Serie]]


<references/>
<references/>

Aktuelle Version vom 31. März 2023, 15:27 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 Arduino PIC MSP430
Bitbreite, jedoch unwichtig für Einsteiger 32-bit 8-bit 8-bit (PIC18) 16-bit (PIC24) 32-bit (PIC32) 16-bit
Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert O O [1][2] X O O
Wunsch ist SD-Card oder Grafik-Display X O O [3] X[3][4] X[3][4] X
Wunsch ist TCP/IP Netzwerk X O X [5] O
Wunsch ist Kamera und Video-/Bildbearbeitung X - - - X -
Möchte die Erkenntnisse beruflich nutzen X X - X X
Stromsparende 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 1024kB 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 + 32MB DRAM (PIC32MZ DA)
bis 512KB Flash
bis 66kB SRAM
Sehr viel PWM mit komplexem Timing X AT90Spwm - - X X O
Deutschsprachige Community O X X X [20] [21] - - -
Anzahl möglicher HW-Breakpoints 4 bis 6 2 1 bis 5 [22] 1 bis 10 [22] 6[22] 2
  • X = ja
  • O = Teilweise, Einschränkungen
  • - = nicht empfohle

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 STM32Fxxx ist in der Tat nicht der beste in der Kategorie "Stromsparend", die neueren STM32L0xx und STM32L4xx sind deutlich sparsamer, besonders bei hohen Temperaturen. Eine interessante Alternative mit Cortex-Mx Kern:
"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 z.B. einem AVR oder STM32 Prozessor) und einer "Arduino" Programmierumgebung, 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), andererseits sind STM32 Modelle nicht wesentlich teurer.

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
Demo-Board Nucleo64 Boards[1] und STM32 Discovery Boards[2] ab 15€
(incl. Debugger)
Arduino Uno clone ab 9€ Microchip Demoboard[3] ab 18€
(Für 16 und 32bit auch mit integriertem Debugger)
MSP430 Demoboard [4] ~35€
Steckbrettaugliches Board Blue-Pill Board [5] ab 1,50€, S64DIL-405 [6] mit STM32F405 30€ Arduino Nano clone ab 2€ PIC Microstick
Einzelchip (Einzelstückpreise) 1..15€
nur SMD (TSSOP..LQFP..BGA)
0,6..15€
SMD + DIP
0,5..15€
SMD + DIP
Programmieradapter mit Debugger ST-Link clone 2,50€
ST-Link original 48€
Segger J-LINK EDU [7] 50€
Atmel AVR Dragon 40€
Atmel ICE ohne Gehäuse ab 99€
PICkit 3 clone 8€
Microchip PICkit 3 original 90€

Das Demo-Board sollte preisgünstig sein, um eventuelle Verluste bei falscher Benutzung gering zu halten. Wenn einem der Prozessor gefällt, so kann man später immer noch auf ein umfangreicheres Board (z.B. mit Display) umsteigen.

Zum Debuggen von STM32 Mikrocontrollern benötigt man einen Programmieradapter mit SWD oder JTAG Protokoll. Die meisten Demo Boards von ST enthalten bereits einen SWD fähigen ST-Link Adapter. Aktuell (2022) z.B. STLINK-V3SET und STLINK-V3MINI

Der Segger J-LINK EDU ist zwar nicht der günstigste Programmieradapter/Debugger, hat jedoch einen guten Ruf und ist nutzbar für praktisch alle Prozessoren mit ARM-Kern. Der Hersteller bewirbt ihn als besonders schnell.

  1. [27] Nucleo64
  2. [28] STM32 Discovery
  3. [29] Microchip Demoboard
  4. [30] MSP430 Demoboard
  5. [31] Blue-Pill Board
  6. [32] S64DIL-405
  7. [33] Segger J-LINK EDU

Programmierumgebungen

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

Aktuell (2022) ist für den Einstieg die STM32CubeIDE und STM32CubeMX zu empfehlen. STM32CubeIDE ist die IDE für die SW Entwicklung in C und C++ inkl. Debugging. STM32CubeMX ist ein grafisches Tool zur Konfiguration des Controllers (IO's, Timer, Interrupts, Clocktree, ...) mit automatischer Codegenerierung, Energieverbrauchsberechung und Visualisierung und enthält auch die Downloadmöglichkeit für viele Beispielprogramme in Abhängigkeit von der verwendeten MCU.

STM32CubeIDE basiert auf Eclipse, OpenOCD und GCC und läuft unter Linux und Windows. Unter Linux beträgt die Installationsgröße für STM32CubeIDE ca. 2,5 GB auf der Systempartition (/opt/stm32cubeide), für STM32CubeMX knappe 700 MB (/opt/stm32cubemx). Zusätzlicher Plattenplatz wird für Examples, Demos, Treiber (Hardware Abstraction Layer (HAL), Low-Level (LL), Board Supported Packages (BSP)) usw. benötigt und wird projektspezifisch von der verwendeten MCU im Ordner des Benutzers abgelegt. Hier sollte man ein paar hundert MB für reservieren.

Der vollständigkeithalber sei noch erwähnt, dass die beiden IDE's TrueStudio der Fa. Attolic und CooCox tot sind. True Studio ist in der STM32CubeIDE aufgegangen, CooCox ist bereits vor Jahren komplett eingestellt worden, auch ist die Homepage zu dem Projekt nicht mehr existent.

Alte Projekte von True Studio lassen sich so einfach leider nicht in STM32CubeIDE importieren, hier muss manuell nachgearbeitet werden..

Im professionellen Umfeld sind die folgenden Entwicklungsumgebungen verbreitet: Keil, IAR. Das Segger Enbedded Studio ist mit Einschränkungen kostenlos verwendbar.

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 Einsteiger Hilfestellungen 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 Hauptunterschied 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.

Noch einfacher und wesentlich schneller geht die Konfiguration mit dem STM32CubeMX Tool mit anschließender Codegenerierung, sofern die Konfiguration von STM32CubeMX geprüft und für OK befunden wurde.

Es 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 (NVIC, Nested Vectored Interrupt Controller) ist bei einem STM32 zusätzlich priorisiert. Damit kann man festlegen, welcher Interrupt vorrangig bearbeitet wird. Die Prioritätenvergabe ist auch kein Hexenwerk. Hier kann STM32CubeMX ein große Hilfe sein.

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 oder 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 verschiedenen Cortex-M Kernen 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 der STM32 Serie kann man nahezu alle Anwendungen realisieren. Die STM32-Serie hat genügend RAM, FLASH Speicher und eine entsprechende Anzahl an verschiedenste IO's, von einfachen GPIO's über SPI/I2C über I2S, SD-Card und USB, und auch ausreichend Geschwindigkeit und viele Gehäuse-Varianten. 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 einmal kennenlernen. Vereinfacht wird das da ALLE ST-Demo-Codebeispiele ebenfalls auf diesen Lib's basieren und somit wird der Wechsel innerhalb der STM32 Familie 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 sich nicht für einen STM32 entscheiden sollte.

Wichtige Dokumente sind:

  • User Manual zum verwendeten Board (Discovery Boards (grün), Nucleo Boards (weiß), ...)
  • Getting started with .... (Application Note, AN....)
  • Programming Manual STM32... (PM...)
  • Reference Manual (RMxxxx)
  • Datasheet zum Prozessor
  • diverse User Guides für Examples, Treiber (BSP, HAL, LL), RTOS, FAT-FS, ...

Die Seitenzahl der Dokumente zusammen beträgt einige tausend. Es sind aber keine "Lesebücher", die von vorn bis hintengelesen werden möchten, sondern Nachschlagewerke. Man ließt im Grunde nur den Teil, der gerade interessant ist.

Programmiersprachen

  • Wie bei vielen anderen Controllern wird beim STM32 auch hauptsächlich C und C++ verwendet. aber auch Pascal oder Basic ist problemlos möglich (z.B. von mikroe). Kennen sollte man die Programmiersprache C schon, wenn man davon noch keine Ahnung hat 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 zyklengenaues Timing benötigt, sollten Timer verwendet werden - davon hat der STM32 genug.

Der 32 Bit-Adressraum, der RAM, Flash und I/O-Register vereinheitlicht ansprechen kann im Gegensatz z. B. zum 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 wie z.B. viele 8051 Typen oder PIC16 (oder auch dsPIC30). Die mögen für Mini-Anwendungen gut sein, aber wer will denn schon gerne sich extra für eine Kleinanwendung mit einem kleinen µC auseinandersetzen, wenn man schon einen STM32 kennt, mit dem man vieles machen kann und sich vllt. 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 eine gute Investition.
Wer berufliche Absichten verfolgt, 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 Demoboard

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 keiner Weise den 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 16 MHz 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 168 MHz hochsetzen. (Siehe Demo-Projekt von STM32 CooCox Installation.)

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. Je kleiner die Zahl ist, desto höherwertiger 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ährenddessen 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

  • Was brauche ich zum Programmieren/Debuggen? - Alle STM32 Mikrocontroller können über die SWD Schnittstelle programmiert und debuggt werden. Auch die JTAG Schnittstelle eignet sich dazu, benötigt aber etwas mehr Leitungen. Geeignete Adapter findet man zum Beispiel unter dem Namen ST-Link oder J-Link. Alle Discovery Boards und Nucleo Boards von ST enthalten bereits einen ST-Link Adapter. Bei den Nucleo-64 Boards ist er sogar abtrennbar und einzeln nutzbar. Alle neueren STM32 besitzen einen internen Bootloader, so dass sich dieser per SPI, UART oder USB bespielen lässt. Wenn Debuggen per Printausgabe reicht und sowieso eine eine USB Schnittstelle vorhanden sein soll, kann auf extra Programmierhardware komplett verzichten und braucht nur einen Jumper am Boot Pin bestücken.
  • Ich möchte eine eigene Platine entwickeln, jedoch der 20polige JTAG-Anschluss ist mir zu groß, gibt es eine Alternative? - Ja, "Der 10-polige JTAG Stecker von mmvisual"

Links