<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stefanus</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stefanus"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Stefanus"/>
	<updated>2026-04-10T23:21:11Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Pegelwandler&amp;diff=104876</id>
		<title>Pegelwandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Pegelwandler&amp;diff=104876"/>
		<updated>2021-12-10T10:27:25Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* I2C-Bus: gemeinsam 3.3V und 5V */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Pegelwandeln (engl. level shifting) wird oft notwendig, wenn Systeme mit unterschiedlicher Ausgangs- und Eingangsspannungen (z.&amp;amp;nbsp;B. Versorgungs- oder Logikspannungen) miteinander verbunden werden sollen. Das vielleicht bekannteste Beispiel ist die Umsetzung von 0V/5V [[TTL]] Logikpegeln auf die -13V/13V Pegel einer seriellen [[RS232]] Schnittstelle. Die Probleme beim Pegelwandeln können sein:&lt;br /&gt;
&lt;br /&gt;
# Überlastung einer oder beider Seiten, bis hin zur Zerstörung&lt;br /&gt;
# Inkompatible Logikpegel und daraus resultierendes Nichtfunktionieren der Schaltung, oder noch schlimmer, sporadische Fehlfunktionen&lt;br /&gt;
# Verzögerungen der Signale durch die Pegelwandlung und daraus resultierende maximale Signalfrequenzen&lt;br /&gt;
&lt;br /&gt;
=== Überlastung ===&lt;br /&gt;
&lt;br /&gt;
Das Erzeugen von verschiedenen Versorgungsspannungen ist ziemlich einfach, aber man muss sicher gehen, dass man die Signalpegel der Bauteile auf Toleranz überprüft. Wenn z.B. ein 5V Bauteil ein Signal an ein 3V Bauteil schickt, können beide Bauteile beschädigt werden. Vor allem für neue ICs ist es ein Problem mit &amp;quot;hohen&amp;quot; Spannungen wie 5V zu arbeiten. Auf Grund der immer kleineren Schaltkreisstrukturen (aktuelle Prozessoren werden mit 14nm Technologie hergestellt!) werden auch die Abstände und Schichtdicken immer geringer. Das reduziert natürlich auch die Spannungs- und Stromfestigkeit der Transistoren auf dem IC. Neue ICs vertragen deshalb meist nur noch 3.3V, teilweise sogar weniger! Die Überlastung erfolgt durch zu hohe Spannung und dadurch mehr oder weniger langsame Zerstörung des ICs.&lt;br /&gt;
&lt;br /&gt;
=== Schutzdioden ===&lt;br /&gt;
&lt;br /&gt;
Hauptursache Nummer zwei für Überlastung von ICs mit verschiedenen Betriebsspannungen sind die in nahezu allen ICs integrierten Schutzdioden. Deren Aufgabe ist es in Normalfall, elektrostatische Entladungen auf eine sichere, niedrige Spannung zu begrenzen. Die Entladungen geschehen durch unsachgemässe Handhabung und Transport von ICs, z.&amp;amp;nbsp;B. wenn jemand über einen Kunstfaserteppich läuft, sich dabei elektrostatisch auflädt und einen IC anfasst, oder wenn Bauteile in einem Gerät eingebaut sind und der Anwender berührt offen liegende Kontakte (RS232 Eingang, USB-Stick, PCI-Steckkarten beim Einbau etc.). Auch elektrostatische Entladungen / EMV können Ursache zu hoher Pegel auf den Leitungen sein.&lt;br /&gt;
&lt;br /&gt;
Die Schutzdioden beginnen, Strom zu leiten, wenn die Eingangsspannung ca. 300 mV - 600 mV über U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; ansteigt oder entsprechend unter GND absinkt. Im Normalbetrieb sollten die Schutzdioden keinen Strom leiten. Manchmal kann man sie aber zur Spannungsbegrenzung missbrauchen, siehe [[#STEP-DOWN:_5V_-.3E_3.3V | Spannungsherabsetzung mit Vorwiderstand]].&lt;br /&gt;
&lt;br /&gt;
Besonderes Augenmerk ist hierbei auf die optimale Dimensionierung des R zu legen, um sicherzustellen, dass kein zu hoher Strom über die Schutzdioden abgeführt werden muss. Je nach Chip-Type und Ausgang halten diese zwischen 100 µA und 10 mA aus.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_schutzdioden.png]]&lt;br /&gt;
&lt;br /&gt;
=== 5-V-tolerante Eingänge ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;5-Volt-tolerant&amp;lt;/i&amp;gt; bedeutet, dass 3-Volt-Bausteine ohne Probleme von einem 5-Volt-Baustein angesteuert werden dürfen.&lt;br /&gt;
&lt;br /&gt;
Viele Bauteile mit einer Betriebsspannung von 3 V verfügen über 5-V-tolerante Eingänge. Man sollte aber grundsätzlich im Datenblatt dies nachschauen, bevor die Schaltung aufgebaut wird. Sind sie es nicht, so ist ein &amp;lt;b&amp;gt;Pegelwandler&amp;lt;/b&amp;gt; auf den Verbindungsleitungen zwischen den Bauteilen notwendig. Ein Pegelwandler kann eine einfache Zener-Diode mit einem Widerstand sein, es kann aber auch ein eigens dafür vorgesehener IC sein. Sind die Signalwege bidirektional, so wird man meist die Lösung mit einem eigenen IC bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Bei geringen Geschwindigkeitsanforderungen und erlaubten flachflankigen Signalen (bei Zähl- und Takteingängen ist dazu Schmitt-Trigger-Verhalten erforderlich) genügt ein Serienwiderstand (Richtwert 10 kΩ) in Verbindung mit der Eingangsschutzbeschaltung. Bei allen derartigen „passiven Pegelkonvertern“ muss die Logikschaltschwelle durchfahren werden. Bei heutzutage üblichen treibenden CMOS-Ausgangsstufen ist das kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ob ein Bauteil 5-V-tolerant ist und unter welchen Betriebsbedingungen das gilt, steht im Datenblatt des betreffenden Bauteils vom betreffenden Hersteller. Wenn es auf diese Eigenschaft ankommt, lieber genau bei Lieferanten nachsehen, von welchem Hersteller die Bauteile kommen.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
&lt;br /&gt;
[[AVR]]s sind generell &#039;&#039;&#039;nicht&#039;&#039;&#039; 5-V-tolerant, wenn sie mit 3,3 V betrieben werden! Die absolute obere Grenze für Eingangsspannungen liegt bei U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; + 0,5 V. Zu finden in den elektrischen Spezifikationen im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Die GPIO-Pins des Raspberry Pi sind ebenfalls &#039;&#039;&#039;nicht&#039;&#039;&#039; 5-V-tolerant!&lt;br /&gt;
&lt;br /&gt;
Vorsicht bei:&lt;br /&gt;
&lt;br /&gt;
* 74&#039;&#039;&#039;LVX&#039;&#039;&#039;xxxx und 74&#039;&#039;&#039;LCX&#039;&#039;&#039;xxxx (245, 244, 240 ...) an Vcc = 3,3 V.&amp;lt;br&amp;gt;&amp;lt;font color=FF0000&amp;gt;Achtung&amp;lt;/font&amp;gt;: Nicht alle 74LVX sind für 5 V -&amp;gt; 3,3 V geeignet, da jeder Hersteller die ICs anders baut!&lt;br /&gt;
* SN74LVC07AD&lt;br /&gt;
* SN74LV1T04 (auch geeignet zur umgekehrten Konvertierung (3,3V-&amp;gt;5V))&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität von Logikpegeln ===&lt;br /&gt;
&lt;br /&gt;
Siehe auch http://www.interfacebus.com/Design_Translation.html&lt;br /&gt;
&lt;br /&gt;
Verschiedene Mikroprozessoren haben eigene elektrische Kenndaten für HIGH- und LOW-Pegel, die abhängig von der Versorgungsspannung sind, z.&amp;amp;nbsp;B. der [[R8C]]:&lt;br /&gt;
&lt;br /&gt;
* HIGH größer 0,8 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&lt;br /&gt;
* LOW kleiner 0,2 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man muss die Spannungen der Aus- und Eingänge vergleichen. Wenn es um ein Hobbyprojekt geht, kann man einfach messen. Wenn es um eine kommerzielle Anwendung geht, die man verkaufen will, sollte man besser die Spezifikationen der ICs studieren.&lt;br /&gt;
&lt;br /&gt;
== UNIDIREKTIONAL ==&lt;br /&gt;
&lt;br /&gt;
=== 1,8 V ⇒ 5 V ===&lt;br /&gt;
&lt;br /&gt;
* Die besondere Eigenschaft der alten TTL-Schaltkreise, nämlich dass Strom bei LOW &#039;&#039;&#039;aus&#039;&#039;&#039; dem Eingang in den treibenden Ausgang fließt kann man sich zunutze machen, wie die nachfolgende Schaltung zeigt. In dieser wird der HIGH-Pegel des 1,8-V-Signals durch eine Schottkydiode um ca. 0,3 V auf 2,1 V erhöht. Damit ist man fast offiziell im HIGH-Bereich für TTL (Schaltschwelle 1,4 V, HIGH &amp;gt; 2,0 V). Der LOW-Pegel wird auf ca. 0,3 V erhöht, was voll den TTL-Richtlinien entspricht. Als Schaltkreisfamilie &#039;&#039;&#039;muss&#039;&#039;&#039; ein [[74xx|TTL-Typ]] eingesetzt werden, also LS, F, AS oder ähnlich. CMOS-Typen wie HC, LVC etc. funktionieren &#039;&#039;&#039;nicht&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_LS.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=FF0000&amp;gt;Achtung&amp;lt;/font&amp;gt;: Diese Schaltung entspricht bei HIGH ungefähr einem offenen TTL-Eingang, was zwar meistens funktioniert, aber etwas störempfindlich sein kann. Davon wurde in der TTL-Ära stets abgeraten. Zudem ist der Pegelwechsel LOW nach HIGH durch den niedrigen Strom eher langsam. Man kann das jedoch mit einem Pullup-Widerstand absichern. Dann sind auch Gatter der 74HCT-Reihe einsetzbar.&lt;br /&gt;
&lt;br /&gt;
=== 3,3 V ⇒ 5 V ===&lt;br /&gt;
&lt;br /&gt;
Diese Konversion ist mit Abstand die häufigste. Dabei kann man getrost 3,3 V (früher) und 3 V (moderner) gleich setzen.&lt;br /&gt;
&lt;br /&gt;
* 3,3-V-Pegel werden bei TTL-kompatiblen Eingängen richtig erkannt (Schaltschwelle 1,4 V). Es ist kein Pegelwandler erforderlich. Direkte Verbindung. Einer der großen Vorteile klassischer TTL-Technik!&lt;br /&gt;
&lt;br /&gt;
* 5-V-CMOS Eingänge haben typisch eine minimale Eingangsspannug für HIGH (&amp;lt;math&amp;gt;V_{IH}&amp;lt;/math&amp;gt;) von 0.6 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 0.6 * 5 V = 3 V. Das kann ein 3,3-V-CMOS-Ausgang direkt treiben, allerdings kann sich das Zeitverhalten dadurch etwas ändern, weil der HIGH Pegel später erkannt wird. Vorsicht! Viele 5-V-CMOS-ICs wollen für HIGH offiziell mindestens 0,7 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 3,5 V oder manche auch 0,8 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 4,0V! Das geht dann offiziell nicht mehr mit einem 3,3-V-Ausgang! Für Hobbyzwecke kann man das aber ggf. probieren.&lt;br /&gt;
Zu beachten ist, dass der nicht ganz nach High durchgesteuerte Eingang Querstrom von der Speisespannung ziehen kann. Das kann für batteriebetriebene Geräte oder USB-konformes Standby durchaus ausschlaggebend sein.&lt;br /&gt;
&lt;br /&gt;
Möglich ist auch eine &#039;&#039;&#039;Zentrierung&#039;&#039;&#039; des Ausgangspegels mit 2 Widerständen wie im folgenden linken Bild. Allerdings besteht die Gefahr, dass die 3,3-V-Versorgung hochläuft, da Spannungsregler (hier: für die 3,3 V) nicht dafür ausgelegt sind, bei Überspannung an deren Ausgang zusätzlich Strom nach Masse abzuleiten: Die 3,3-V-Verbraucher müssen bei High eine Mindestlast erbringen, etwa mit einem zusätzlichen Widerstand &#039;&#039;&#039;R3&#039;&#039;&#039; vom Ausgang nach GND.&lt;br /&gt;
&lt;br /&gt;
[[bild:Zentrierung-3P3-5P.png]] [[bild:Zentrierung-3P3-5P-R3.png]]&lt;br /&gt;
&lt;br /&gt;
* 3,3-V-[[Ausgangsstufen_Logik-ICs | Open Collector]] nach 5 V (TTL oder CMOS): Einfach einen Pull-Up Widerstand hinzufügen und gut. Allerdings verbraucht der Pull-Up-Widerstand bei LOW auf jeden Fall Strom und begrenzt bei HIGH den maximalen Gate-Umladestrom. Die Schaltgeschwindigkeit von LOW nach HIGH wird durch die Größe des Pull-Ups bestimmt. Je nach Geschwindigkeitsanforderungen kann der in Mikrocontrollern meistens zuschaltbare innere Widerstand dazu benutzt werden. Zudem kann dieser, bei bekannt LOW bleibendem Eingangspegel, zur Reduktion der Stromaufnahme abgeschaltet werden. Bipolare TTL-Schaltkreise benötigen in der Bastelschaltung keinen Pull-Up (liefern Strom); bei Schaltungen mit erhöhter Zuverlässigkeit ist dennoch ein externer Pull-Up angeraten (Richtwert 4,7 kΩ).&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_3-5.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Das Simulieren von Open Collector in Mikrocontrollern oder mittels Tristate-Treibern oder die Verwendung von Open-Collector-Ausgängen von Schaltkreisen, bei denen keine höhere Ausgangsspannung spezifiziert ist (etwa 74HC03), ist für diesen Zweck unzulässig und wenig hilfreich, weil Gateschutzdioden und andere parasitäre Siliziumstrukturen den Strom aus dem Widerstand nach 3,3 V ableiten und so maximal 4 V generieren. Auch hier besteht die Gefahr des Hochlaufens der 3,3-V-Versorgung.&lt;br /&gt;
&lt;br /&gt;
* 3,3 V auf echte 5 V (CMOS) geht am einfachsten mit einem Baustein der HCT-Familie (NICHT HC!). Diese haben TTL-kompatible Eingänge und echte CMOS-Ausgänge&lt;br /&gt;
&lt;br /&gt;
* Man kann einen Komparator &amp;lt;small&amp;gt;in nichtinvertierender Schaltung&amp;lt;/small&amp;gt; benutzen (LM339/393). Allerdings ist diese Lösung relativ langsam, abhängig vom verwendeten Komparator. Komparatoren bieten eine freie Wahl des Eingangsspannungsbereichs und sind deshalb eine gute Wahl bei &#039;&#039;variabler&#039;&#039; Speisespannung der Treiberseite.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_comp_3-5.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/part/74HCT245 74HCT245], [http://www.mikrocontroller.net/part/74HCT244 74HCT244]oder [http://www.mikrocontroller.net/part/74HCT240 74HCT240] (Das &#039;&#039;&#039;T&#039;&#039;&#039; ist wichtig. HCs können funktionieren, sind aber suboptimal, da bei 5V Versorgung und höheren Temperaturen U&amp;lt;sub&amp;gt;input,high&amp;lt;/sub&amp;gt; = 3,2 V)&lt;br /&gt;
* [http://www.mikrocontroller.net/part/74HCT125 74HCT125]: OE Pins auf Masse und dann das Signal einfach anschließen. &lt;br /&gt;
* SN74LVC07AD &lt;br /&gt;
* SN74LV1T04 (auch geeignet zur umgekehrten Konvertierung (5 V ⇒ 3,3 V))&lt;br /&gt;
* 74V1T126 (single Gatter, U&amp;lt;sub&amp;gt;input,high&amp;lt;/sub&amp;gt; = 2 V)&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇒ 9..15(..30) V ===&lt;br /&gt;
&lt;br /&gt;
* Am einfachsten geht das mit einem (geeigneten!) Open-Collector-Ausgang, einfach einen Pull-Up hinzufügen (an die hohe Spannung) und fertig. Ein 74&#039;&#039;xx&#039;&#039;03 geht hier nicht! Auch kann man nicht einen Push-Pull-Ausgang eines Mikrocontrollers dafür verwenden, indem man den Ausgang bei HIGH zum Eingang macht.&lt;br /&gt;
Hintergrund sind parasitäre Dioden zwischen Ausgang und Speisespannung.&lt;br /&gt;
Alle (geeigneten) Treiberausgänge haben eine maximal erlaubte Kollektorspannung, die zu beachten ist. Mehr Freiheit hat man bei der Verwendung von Einzeltransistoren, wobei eine gewisse Lücke von 30 V bis 200 V von Bipolartransistoren dominiert wird; für kleinere oder größere Spannungen gibt es preiswerte MOSFETs. (Die Lücke entsteht durch den geringen Bedarf des Weltmarktes an diesen Kollektorspannungen.)&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_5-12.png]]&lt;br /&gt;
&lt;br /&gt;
* Man kann einen Komparator benutzen. Allerdings ist diese Lösung relativ langsam, abhängig vom verwendeten Komparator. Wenn nur zwei Signale gewandelt werden müssen bietet sich der LM393 an, ein Doppelkomparator mit Open-Collector-Ausgang, mit dem man auf einen beliebigen Pegel ausgeben kann. Der LM339 (man beachte den unauffälligen Zahlendreher) ist ein Vierfachkomparator mit den gleichen Eigenschaften. Wenn wenig Platz vorhanden ist, dann ist der TL311 im winzigen SOT-23 Gehäuse sehr empfehlenswert. Bei jedem Komparator kann auch einfach eine Invertierung gemacht werden, einfach die Eingänge + und - vertauschen. Diese Komparatoren eignen sich bis ca. 1 MHz.&lt;br /&gt;
&lt;br /&gt;
* [http://www.elektronik-kompendium.de/sites/praxis/bausatz_pegelwandler-mit-transistoren.htm Pegelwandler mit Transistor, invertierend]&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_trans_inv.png]]&lt;br /&gt;
&lt;br /&gt;
* Pegelwandler mit Transistor, nicht invertierend&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_trans_ni.png]]&lt;br /&gt;
&lt;br /&gt;
Die Idee ist einfach. Wenn der Ausgang des 5-V-Gatters auf HIGH ist dann ist der Transistor ausgeschaltet, der Pull-Up-Widerstand R7 zieht den Ausgang auf + 12 V. Ist der Ausgang des 5-V-Gatters auf LOW ist, dann ist er vollkommen durchgesteuert und der Ausgang nahe 0 V (je nach Typ ca. 300 mV). Der Vorteil ist hier erhöhte Störsicherheit im Gegensatz zur einfachen Ansteuerung der Basis über einen Vorwiderstand. Außerdem wird dadurch nicht die Logik invertiert. Nachteilig ist der geringe Strom, der bei HIGH zur Verfügung steht (typisch 100 µA). Diese Schaltung ist die seltene Anwendung einer Basisschaltung für digitale Signale. Der Vorteil der Basisschaltung ist die höhere Grenzfrequenz durch die herabgesetzte Wirksamkeit der (störenden) Miller-Kapazität.&lt;br /&gt;
&lt;br /&gt;
* Wenn mehr Geschwindigkeit, Ausgangsstrom und weniger Stromverbrauch nötig ist, dann muss ein spezieller Baustein her, wie z.&amp;amp;nbsp;B.&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
** [[Mosfet-Übersicht#Mosfet-Treiber|MOSFET-Treiber]] z.B. ICL7667&lt;br /&gt;
** [[H-Brücken Übersicht | Motortreiber]] ICs: (z.&amp;amp;nbsp;B. L293, L298, UCC27325 und deren Verwandte), wenns nicht zu schnell ist (einige Dutzend kHz)&lt;br /&gt;
** CD40109, 4fach Pegelwandler, bei Reichelt verfügbar&lt;br /&gt;
** HEF4104, 4fach Pegelwandler mit normalen und invertierten Ausgängen sowie Tristate. Um ggf. sicherzustellen, dass wie im Datenblatt beschrieben immer U&amp;lt;sub&amp;gt;DDI&amp;lt;/sub&amp;gt; &amp;lt;= U&amp;lt;sub&amp;gt;DDO&amp;lt;/sub&amp;gt; ist, kann man einfach eine Diode von U&amp;lt;sub&amp;gt;DDO&amp;lt;/sub&amp;gt; nach U&amp;lt;sub&amp;gt;DDI&amp;lt;/sub&amp;gt; schalten (z.&amp;amp;nbsp;B. Schottky SB120, aber auch 1N4148 &amp;amp; Co. sollte problemlos funktionieren)&lt;br /&gt;
** CD4504, 6fach Pegelwandler 3-20V, Eingangspegel TTL oder CMOS (umschaltbar) =&amp;gt; CMOS, keine Reihenfolge von U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;/U&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt; erforderlich (Bezugsquelle: CSD)&lt;br /&gt;
** MAX232, der braucht nur 5 V Versorgungsspannung. Allerdings ist der Ausgangswiderstand relativ hoch (ca. 300 Ω) und man kann nur ca. 5 mA Ausgangstrom liefern. Die Ausgangsspannung beträgt maximal 10 V.&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇒ 3,3 V ===&lt;br /&gt;
&lt;br /&gt;
Ob 3,3 V (klassisch) oder 3 V (modern) ist bei dieser Betrachtung nahezu egal.&lt;br /&gt;
&lt;br /&gt;
* Zuerst sollte man prüfen, ob die Eingänge 5V-tolerant sind. Dann kann man die ICs direkt verbinden. Sehr schnell und billig!&lt;br /&gt;
&lt;br /&gt;
* Wenn die Eingänge nicht 5-V-tolerant sind und es trotzdem schnell sein soll, muss ein Gatter aus der LVC- oder AHC-Familie dazwischen geschaltet werden, also eines mit 5V-Toleranz. Bei 3 V Betriebsspannung kann man problemlos 5 V an den Eingang anlegen. Der Baustein 74HC4050 erlaubt per Definition eine Pegelwandlung bis etwa 15 V (siehe Datenblatt). Beide Anordungen haben auch eine sehr niedrige Ruhestromaufnahme.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:* 74LVC245A (&#039;A&#039; ist wichtig, I/Os 5V-tolerant)&lt;br /&gt;
:* 74LVC245DW &lt;br /&gt;
:* 74LVT245 &lt;br /&gt;
:* 74LVXxxx (245, 244, 240 ...) an Vcc=3,3V. Achtung: Nicht alle 74LVX sind für 5V -&amp;gt; 3,3V geeignet, da jeder Hersteller die ICs anders baut!&lt;br /&gt;
:** 74LVX04 &lt;br /&gt;
:** 74LVX244 (Fairchild)&lt;br /&gt;
:** 74LVX245 (nicht von Reichelt, nicht 5V tolerant)&lt;br /&gt;
:** bei TI heissen die 74LVX... nur 74LV...&lt;br /&gt;
&lt;br /&gt;
:* 74HC4050 (bis 15 V Step-Down-Pegelwandlung laut Datenblatt, bei Reichelt in DIP und SO erhältlich)&lt;br /&gt;
:* MAX3373/MAX3375&lt;br /&gt;
:* NC7SZ08 oder andere aus derselben Serie. CMOS-Logik mit 5-V-toleranten Eingängen, recht flott und braucht dank SOT-23 auch wenig Platz auf der Platine&lt;br /&gt;
&lt;br /&gt;
* 5 V Open Collector auf 3,3-V-Eingang. Einfach einen Pull-Up hinzufügen (Pull-Up liegt auf 3,3 V). Nachteilig ist der relativ hohe Stromverbrauch bei LOW, die begrenzte Geschwindigkeit bei hochohmigen Pull-Ups und der relativ geringe Ausgangsstrom bei HIGH (abhängig vom Pull-Up).&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
* Spannungsteiler mit 680 Ω und 1 kΩ. Der Nachteil dieser Lösung ist der relativ hohe Stromverbrauch (~3mA), der relativ geringe Ausgangsstrom (mehr als 200..300 µA sollte man da nicht rausziehen) und die relativ geringe Geschwindigkeit (ca. 10 MHz).&lt;br /&gt;
&lt;br /&gt;
[[Datei:SPI level shifter with resistor divider.png|miniatur|rechts|fehlerhafter SPI-Takt nach Pegelwandler mit Widerstandsteiler (1,8/3,3 kΩ)&amp;lt;br /&amp;gt;unten: 5V-Ausgang am Mikrocontroller&amp;lt;br /&amp;gt;&lt;br /&gt;
oben: 3,3V-Eingang an der SD-Karte nach Pegelwandler]]&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_st_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
* 1 kΩ Vorwiderstand. Dadurch wird der Strom vom 5-V-Ausgang in die 3,3-V-Versorgung durch die internen Schutzdioden auf ca. 1 mA begrenzt. Diese Lösung ist auch relativ langsam (ca. 5MHz). Ggf. kann man den Vorwiderstand auf 100 Ω reduzieren, das erhöht dann wieder die Geschwindigkeit. Aufpassen, einige ICs vertragen nur 1 mA oder weniger durch die Schutzdioden! Ausserdem muss man aufpassen, da jetzt von der 5-V-Seite Strom in die 3,3-V-Versorgung eingespeist wird. Besonders in Schaltungen mit sehr niedriger Stromaufnahme kann das zum Problem werden, wenn die Stromaufnahme geringer ist, als über die Vorwiderstände eingespeist wird. Dann nimmt es meist der Spannungsregler für 3,3 V übel wenn jemand „schiebt“, sprich, Strom einspeist. Denn die allermeisten Spannungsregler können nur Strom liefern (source), aber keinen Strom aufnehmen (sink). Es gibt 4-fach-Diodennetzwerke, die die internen Schutzdioden entlasten können (Schottkydioden mit kleinerer Flusspannung von ≈ 0,3 V als die internen Silizizumdioden mit ≈ 0,7 V), außerdem ist teilweise noch eine [[Diode#Z-Diode|Zenerdiode]] enthalten, die ggf. den überschüssig eingespeisten Strom aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Alle Lösungen mit Vorwiderständen reduzieren die Flankensteilheit der Signale. Dies kann bei Takt- und Zähleingängen zu unerwünschten Schwingungen und damit Fehlzählungen führen. Derartig benutzte Eingänge sollten Schmitt-Trigger-Verhalten aufweisen.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_vw_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
Achtung: Mindestens für 74HC(T) Gatter ist dokumentiert (Philips 74HC/T High-Speed CMOS User Guide), dass auch schon geringer Strom durch die internen Schutzdioden zu einer unerwünschten Kopplung von Eingängen führen kann, d.h. der Strom fliesst zu einem anderen Eingang wieder hinaus. Sind also andere Eingänge ebenso hochohmig angeschlossen, kann dieser Querstrom zu Fehlfunktion führen.&lt;br /&gt;
&lt;br /&gt;
== BIDIREKTIONAL ==&lt;br /&gt;
&lt;br /&gt;
Für bidirektionale Busse gibt es spezielle Pegelwandler mit 2 Versorgungsspannungen. Allerdings brauchen die meist ein Signal zur Richtungsumschaltung. Auch muss man die Reihenfolge der Versorgungsspannungen beim Einschalten beachten. Aktive bidirektionale Pegelwandler OHNE Steuereingang zur Richtungsumschaltung sind mit Vorsicht zu genießen, denn die brauchen teilweise kurzzeitig einen relativ hohen Strom, um die Eingänge zu treiben.&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇔ 3,3 V ===&lt;br /&gt;
&lt;br /&gt;
* Wenn die 5-V-Seite TTL-kompatible Eingänge hat kann wieder der Spannungsteiler oder Vorwiderstand wie bei der unidirektionalen Anpassung verwendet werden (mit all seinen Vor- und Nachteilen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* SN74CB3T3306&lt;br /&gt;
* SN74CBTD3861 (10 Bit,flow through, Betrieb mit 5 Volt)&lt;br /&gt;
* MAX1741 &lt;br /&gt;
* MAX3378E &lt;br /&gt;
* 74AHC126 s.u.&lt;br /&gt;
* ST2378 (bei CSD erhältlich, 3.5 eur, leider TSSOP)&lt;br /&gt;
* TXS0104E (TI: 4-BIT BIDIRECTIONAL VOLTAGE-LEVEL TRANSLATOR FOR OPEN-DRAIN AND PUSH-PULL APPLICATIONS)&lt;br /&gt;
* SN74LVC07A&lt;br /&gt;
* von Analog Devices die ADUM Serie&lt;br /&gt;
&lt;br /&gt;
=== 1,65 V ... 5,5 V ⇔ 1,65 V ... 5,5 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC2T45&lt;br /&gt;
* SN74LVC(H)8T245&lt;br /&gt;
* SN74LVC(H)16T245&lt;br /&gt;
&lt;br /&gt;
=== 1,2 V ... 3,6 V ⇔ 1,65V ... 5,5V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* TXB0101&lt;br /&gt;
* TXB0102&lt;br /&gt;
* TXB0104&lt;br /&gt;
* TXB0106&lt;br /&gt;
* TXB0108&lt;br /&gt;
&lt;br /&gt;
=== 1,2 V ... 3,6V ⇔ 1,2 V ... 3,6 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* SN74AVC(H)1T45&lt;br /&gt;
* SN74AVC(H)2T45&lt;br /&gt;
* SN74AVC(H)4T245&lt;br /&gt;
* SN74AVC(H)8T245&lt;br /&gt;
* SN74AVC(H)16T245&lt;br /&gt;
* SN74AVC(H)20T245&lt;br /&gt;
* SN74AVC(H)24T245&lt;br /&gt;
* SN74AVC(H)32T245&lt;br /&gt;
&lt;br /&gt;
=== 1,5 V ... 3,6 V ⇔ 1,5 V ... 5,5 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* 74LVC4245A&lt;br /&gt;
&lt;br /&gt;
== Mit galvanischer Trennung ==&lt;br /&gt;
&lt;br /&gt;
* [[Optokoppler]] (Langsam! Es gibt verschieden schnelle Koppler, aber über 1 MHz kommen sie kaum hinaus. Grundregel: Solche mit Fototransistoren sind am langsamsten, Richtwert 10 kHz, Fotodioden sind schneller, schnelle Optokoppler haben eine gesondert zu speisende Empfängerschaltung.)&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_opto.png]]&lt;br /&gt;
&lt;br /&gt;
* GMR-Koppler von der Firma NVE &lt;br /&gt;
* iCoupler Technologie von der Firma Analog Devices&lt;br /&gt;
* [[Kapazitiver Koppler]] (schnell, begrenzter Potenzialversatz)&lt;br /&gt;
* Transformatorkopplung (nur für gleichspannungsfreie Wechselsignale geeignet; sehr schnell; Beispiel: Netzwerkkarten)&lt;br /&gt;
&lt;br /&gt;
Lit.: &#039;&#039;Galvanische Trennung: Optokoppler, GMR-Koppler oder iCoupler?&#039;&#039;, Siegfried W. Best, Redaktion elektronik industrie, [http://www.elektronik-industrie.de/ei/11,2003/article/2f0082f824c.html elektronik industrie 11-2003, S. 22ff.]&lt;br /&gt;
&lt;br /&gt;
== Praktische Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Einfaches RS232-Interface ===&lt;br /&gt;
&lt;br /&gt;
[http://web.archive.org/web/20050122013618/http://www.henrik-reimers.de/control/rs232interface.gif Erfolgreicher Einsatz bis 19200 Baud und bis zu 10 m Leitungslänge]&lt;br /&gt;
Beschränkungen:&lt;br /&gt;
&lt;br /&gt;
* ggf. Platzbedarf&lt;br /&gt;
* Geschwindigkeit s.o.&lt;br /&gt;
&lt;br /&gt;
Beispiel: http://www.hagtech.com/pdf/translator.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[I2C]]-Bus: gemeinsam 3.3V und 5V ===&lt;br /&gt;
&lt;br /&gt;
* [[MSP430]] an 3,3V/5V: [https://www.ti.com/lit/pdf/slaa148 slaa148.pdf]&lt;br /&gt;
&lt;br /&gt;
* Philips [http://www.nxp.com/documents/data_sheet/PCA9515.pdf PCA9515]: I2C Puffer mit Pegelwandlung. Der PCA9515 ist ein I2C-Bus Repeater, welcher I2C Busse mit verschiedenen Spannungen isoliert. Verfügbar bei Reichelt und DigiKey.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/256452/levelshifter.pdf  AN97055] von Philips, &amp;quot;Bi-directional level shifter for I²C-bus and other systems&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Bevor man ein Philips I2C Chip auswählt sollte man prüfen ob er verfügbar ist und auch das verfügbare Gehäuse wählen. Man sollte auch überlegen ob ein Puffer wirklich gebraucht wird. Wenn man echte I2C ICs mit 5V betreibt, dann sind die Eingänge vom Typ Schmitt Trigger CMOS (z.&amp;amp;nbsp;B. PCF8574). Dann müssen 3.3V Pegel auf 5V umgesetzt werden. Wenn man jedoch SMBUS Ics verwendet (z.&amp;amp;nbsp;B. ADT7461, Silabs 8051) dann sind die Schwellspannungen TTL kompatibel und es ist keine Anpassung notwendig. Für neue Pegelwandler sollte man hier nachschauen. http://www.bus-buffer.com&lt;br /&gt;
&lt;br /&gt;
* [http://www.edn.com/article/CA193193.html &amp;quot;Two-transistor circuit replaces IC&amp;quot;]. Für diese Anwendung kann ENABLE direkt mit 3.3V verbunden werden. Es ist eigentlich nur dazu da, den ICs &amp;quot;hot-swappable&amp;quot; zu machen (kann unter Spannung gesteckt und getrennt werden). Es geht sogar mit nur einem [[Transistor]] [http://www.mikrocontroller.net/topic/92447 siehe Forum]. Man sollte beachten, daß die Schaltung sowohl für SCL als auch SDA benötigt wird. &lt;br /&gt;
* Noch einfachere Lösungen mit nur einem MOSFET und zwei Pull-Up Widerständen pro Leitung sind in den folgenden Links zu finden. &lt;br /&gt;
** [https://cdn-shop.adafruit.com/datasheets/AN10441.pdf AN10441.pdf] von NXP&lt;br /&gt;
** [http://www.semiconductors.philips.com/acrobat_download/literature/9398/39340011.pdf 39340011.pdf] (Kapitel 18), bei der Berechnung der erreichbaren Geschwindigkeit dürfen die parasitären Kapazitäten der FETs nicht ignoriert werden&lt;br /&gt;
&lt;br /&gt;
=== Auswählbare Pegel ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Ein CMOS Logikpegel zwischen 1,8V, 2,5V und 3,3V (abhängig von der Anwendung) muss auf 5V CMOS Logikpegel gewandelt werden. Es geht nur um diese Richtung mit maximal 8MHz. Es gibt die Stromversorgung für alle Pegel. Ein normaler Komparator wie LM311 ist nicht möglich, da er beim Betrieb mit 5V Versorgunsspannung erst ab 1V zu schalten anfängt. Meine Idee ist die Verwendung eines High Speed OPVs mit R2R Eingang, z.&amp;amp;nbsp;B. LMH6645.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Antworten:&#039;&#039;&#039;&lt;br /&gt;
* Man könnte einen ultra-low threshold N-Kanal MOSFET nehmen und als Open Drain mit einem Pull-Up nach 5V betreiben, BSH103 könnte passen (Schwellspannung ~0,4V).&lt;br /&gt;
* High-Speed Single Supply Komparator wie z.&amp;amp;nbsp;B. [http://www-s.ti.com/sc/ds/tl712.pdf TL712] .&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC8T245&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Ich suchen einen IC, welcher eine Pegelwandlung von 3,3V nach 1,8V, 2,0V oder 5V ermöglicht und während des Betriebs umgeschaltet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Antworten:&#039;&#039;&#039;&lt;br /&gt;
* So ein IC ist der Linear [http://www.linear.com/pc/productDetail.jsp?navId=H0,C1,C1007,C1071,P1601 LTC1555L-1.8] .&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC8T245&lt;br /&gt;
&lt;br /&gt;
=== AVR SPI (SDC/MMC)===&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;bidirektionalen Betrieb&#039;&#039;&#039; zwischen 5V-AVR und 3,3V-Geräten und anders herum gibt es den Level-Translator &#039;&#039;&#039;MAX3378E&#039;&#039;&#039; von Maxim.&lt;br /&gt;
&lt;br /&gt;
Wenn die Datenrichtung am SPI im Zielsystem festgelegt ist, reichen &#039;&#039;&#039;unidirektionale Bausteine&#039;&#039;&#039;:&lt;br /&gt;
* 3x von 5V nach 3,3V und 1x von 3,3V nach 5V: &#039;&#039;&#039;MAX3392E&#039;&#039;&#039;&lt;br /&gt;
* 1x von 5V nach 3,3V und 3x von 3,3V nach 5V: &#039;&#039;&#039;MAX3390E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zum Anschließen einer SDC/MMC an einen 5V-AVR eignen sich somit der MAX3978E und der MAX3392E. Beide sind u.A. im winzigen TSSOP-14-Gehäuse verfügbar, nehmen sehr wenig Energie auf und eignen sich auch für andere Spannungen. Mit 3,3 und 5V beträgt die garantierte Übertragungsrate 8Mbps.&lt;br /&gt;
&lt;br /&gt;
* [http://datasheets.maxim-ic.com/en/ds/MAX3372E-MAX3393E.pdf Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit zum Übersetzen zwischen 3,3 und 5V liegt in der Verwendung des &#039;&#039;&#039;74LVC245&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bastlerfreundlicher als &#039;&#039;&#039;MAX33XXX&#039;&#039;&#039; (in SO-Gehäuse):&lt;br /&gt;
* 5V &amp;gt; 3,3V (SCK, MOSI, CS): 74LVC-serie (z.B. 74LVC14A)&lt;br /&gt;
* 3,3V &amp;gt; 5V (MISO): 74HCT-Serie (z.B. 74HCT125, 74HCT251)&lt;br /&gt;
&lt;br /&gt;
5V-AVR an eine MMC (ohne Level-Shifter-Baustein):&lt;br /&gt;
* [http://www.microsyl.com/index.php/2010/03/24/led-sign-with-mmc-memory-card/ Projektseite] &lt;br /&gt;
* [http://www.microsyl.com/projects/ledsign/ledsign1.pdf Schaltplan]&lt;br /&gt;
&lt;br /&gt;
=== Mikrocontroller ⇔ Parallelport ([[ISP]]-Dongle, [[JTAG]] Wiggler, ...) ===&lt;br /&gt;
&lt;br /&gt;
Dieser Schaltplan funktioniert auch bei 3,3 V wenn man einen 74&amp;lt;B&amp;gt;HC&amp;lt;/B&amp;gt;244 anstatt eines 74&amp;lt;B&amp;gt;LS&amp;lt;/B&amp;gt;244 verwendet: [http://www.epanorama.net/circuits/parallel_output.html Parallel port interfacing made easy: Simple circuits and programs to show how to use PC parallel port output capabilities].&lt;br /&gt;
&lt;br /&gt;
=== Doppeltes Leitungspaar RX/TX 5V/3,3V ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.hackaday.com/2008/06/19/sparkfuns-logic-level-converter/ SparkFun&#039;s Logic Level Converter] ist eine Baugruppe mit MOSFETs [http://www.fairchildsemi.com/pf/BS/BSS138.html BSS138] für die Pegelwandlung von 5V auf 3,3V. 5V/2,8V und 5V/1,8V sind ebenfalls machbar.&lt;br /&gt;
&lt;br /&gt;
=== Steuerleitung zwischen Mikrocontroller und FPGA ===&lt;br /&gt;
&lt;br /&gt;
Oftmals werden PLDs oder FPGAs per Microcontroller-Platine angesteuert. Ältere Typen laufen meist als 5V oder sitzen in 5V-kompatiblen Platinen. Sollen moderne FPGAs angesteuert werden, trifft man fast immer auf 3,3-V-Typen, bzw. muss sogar 2,5-V- / 1,8-V-Bänke beschalten, wenn nur noch dort Pins frei sind.&lt;br /&gt;
&lt;br /&gt;
==== Mikrocontroller ⇒ FPGA ====&lt;br /&gt;
&lt;br /&gt;
Die 5 V sind also im Extremfall auf 1,8 V herabzusetzen, was bei einem maximal zulässigen Diodenstrom von 3 mA (Beispiel Xilinx) einen Mindestwiderstand von ca. 1 kΩ erfordert. Die resultierende maximale Schaltfrequenz liegt dann bei einem typischen FPGA-Eingang bei etwa &amp;lt; 500 kHz. Soll der Eingang aus Belastungsgründen nicht mit mehr als 0,3 mA belastet werden, müsste der Widerstand auf 10 kΩ steigen, wodurch die Frequenz auf 1/10 sinkt. Zudem ist der Eingang dann störempfindlicher. Daher ist es besser, man schaltet dem Eingang eine zusätzliche Z-Diode bei und dimensioniert den Vorwiderstand so, dass die Strombelastbarkeit des Mikrocontrollers ausgelastet wird.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist es, die Spannung mit einer Diode in Vorwärtsrichtung herabzusetzen. Dann muss jedoch der Vorwiderstand noch exakter toleriert werden und auch Abweichungen der Spannung (Welligkeit) berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
==== FPGA ⇒ Mikrocontroller ====&lt;br /&gt;
&lt;br /&gt;
Umgekehrt ist es oft nötig, dass Bausteine einen fremden Chip treiben müssen, dessen Eingang bereits mit einem Pull-Up versehen ist. Über diesen wird dann stets ein Strom in die Schutzdiode eingeprägt, auch wenn der Ausgang auf HIGH geht. Soll z. B. von einem PLD oder einem FPGA aus eine Mikrocontrollerplatine bedient werden, die über einen Pull-Up von 1 kΩ verfügt, würden immer ca. 1 mA in die Schutzdiode eingeprägt. Hier kann eine Seriendiode helfen, die Spannung genügend herabzusetzen, um den Ausgang zu schützen und dennoch die Funktion zu erhalten. Dann steuert ein LOW-Ausgang den Eingang auf geschätzte 1V, was aber meistens für das Erkennen von LOW noch sicher reicht.&lt;br /&gt;
&lt;br /&gt;
== Bauteile ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;74ALVC164245&#039;&#039;&#039; - &#039;&#039;16bit dual supply translating transceiver&#039;&#039;. Eine Seite von 1.5V bis 3.6V, die andere von 1.5 bis 5.5V.&lt;br /&gt;
* &#039;&#039;&#039;74LVX573&#039;&#039;&#039; (unidirektional, Latch, nicht alle Hersteller bauen diesen 5V tolerant!)&lt;br /&gt;
* &#039;&#039;&#039;74LVX245&#039;&#039;&#039; (bidirektional, nicht alle Hersteller bauen diesen 5V tolerant!)&lt;br /&gt;
* &#039;&#039;&#039;74LVX125&#039;&#039;&#039; - &#039;&#039;Low Voltage Quad Buffer with 3-STATE Outputs&#039;&#039;. http://www.fairchildsemi.com/pf/74/74LVX125.html&lt;br /&gt;
* &#039;&#039;&#039;SN74LVC2T45&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;SN74LVC8T245&#039;&#039;&#039; - &#039;&#039;8-Bit Dual-Supply Bus Transceiver with Configurable Voltage Translation and Three-State Outputs&#039;&#039;. http://focus.ti.com/docs/prod/folders/print/sn74lvc8t245.html&lt;br /&gt;
* &#039;&#039;&#039;74LCX244MSA&#039;&#039;&#039; von Fairchild.&lt;br /&gt;
* &#039;&#039;&#039;MAX3377&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAX3000&#039;&#039;&#039; 8-Kanal bidirektioneler Pegelwandler ohne Richtungsumschaltung&lt;br /&gt;
* &#039;&#039;&#039;ADG3308&#039;&#039;&#039; 8-Kanal bi-dir. Pegelwandler ohne Richtungsumschaltung, 1,15V..5,5V, 50MBps (hohe Umschaltströme beachten)&lt;br /&gt;
&lt;br /&gt;
Vierfachdioden im kleinen 6-poligen SMD-Gehäuse:&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00130230.pdf DSILC6-4xx.pdf]&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00065974.pdf DVIULC6-4SC6.pdf]&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00001734.pdf DALC208.pdf]&lt;br /&gt;
* [http://www.diodes.com/datasheets/ds30195.pdf QSBT40, vierfach Schottky Terminator für Datenleitungen]&lt;br /&gt;
* [http://www.littlefuse.com/data/en/Data_Sheets/SP724Lead_Free.pdf SP724, Siliziumschutzarray]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/307702#3316500 Forumsbeitrag]: Entkopplung von FT232 und AVR&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/503454?goto=6409954#6409949 Forumsbeitrag]:  2x level shift in Reihe (I2C)&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/525065#6828127 Forumsbeitrag]: Vorsicht bei bidirektionalen Pegelwandlern mit automatischer Richtungserkennung&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* Holmes D., [http://delphys.net/d.holmes/hardware/levelshift.html Bi-directional level-shift with MOSFETs]&lt;br /&gt;
* Gaurang Kavaiya, [http://www.edn.com/design/analog/4318916/Don-t-pay-for-level-translators-in-systems-using-multiple-power-supply-voltages Don’t pay for level translators in systems using multiple power-supply voltages], EDN, MAY 25, 2006, 81-86&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/scf3_lc.htm Einfacher Pegelwandler im ELKO]&lt;br /&gt;
* [http://www.prog-link.com/dcf77/dcf77-17.html Pegelwandler für DFC77 Module]&lt;br /&gt;
* [http://elektronik.kai-uwe-schmidt.de/index.php?page=mp3_blueschaltung Pegelwandler für [[I2C]] Bus in einem MP3 Player]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/256452/levelshifter.pdf Application Note von Philips, I2C Pegelwandler]&lt;br /&gt;
* [http://www.nxp.com/documents/user_manual/UM10204.pdf I2C Spezifikation]  &lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-234277.html#new Forumsbeitrag zum Thema 1,8V-5V Pegelwandler] &lt;br /&gt;
* [http://www.st.com/web/en/resource/technical/document/datasheet/CD00001208.pdf 74LCX16245, 16 Bit Pegelwandler]&lt;br /&gt;
* [http://www.standardics.nxp.com/products/lvc/buffers/ LVC Logikfamilie]&lt;br /&gt;
* [http://www.standardics.nxp.com/products/lvc/transceivers/ LVC Tranceiver]&lt;br /&gt;
* [http://www.microchip.com/stellent/groups/techpub_sg/documents/devicedoc/en026368.pdf 3V Tips ‘n Tricks] (PDF) von Microchip&lt;br /&gt;
* [http://www.ti.com/lit/an/slaa148/slaa148.pdf Interfacing the 3-V MSP430 to 5-V Circuits] (PDF) von Texas Instruments&lt;br /&gt;
* [http://www.ti.com/logic-circuit/voltage-level-translation/overview.html Texas Instruments Voltage level translators]: Auswahl passender Bauelemente durch Eingabe der gewünschten Parameter&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Pegelwandler&amp;diff=104875</id>
		<title>Pegelwandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Pegelwandler&amp;diff=104875"/>
		<updated>2021-12-10T10:27:09Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* I2C-Bus: gemeinsam 3.3V und 5V */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Pegelwandeln (engl. level shifting) wird oft notwendig, wenn Systeme mit unterschiedlicher Ausgangs- und Eingangsspannungen (z.&amp;amp;nbsp;B. Versorgungs- oder Logikspannungen) miteinander verbunden werden sollen. Das vielleicht bekannteste Beispiel ist die Umsetzung von 0V/5V [[TTL]] Logikpegeln auf die -13V/13V Pegel einer seriellen [[RS232]] Schnittstelle. Die Probleme beim Pegelwandeln können sein:&lt;br /&gt;
&lt;br /&gt;
# Überlastung einer oder beider Seiten, bis hin zur Zerstörung&lt;br /&gt;
# Inkompatible Logikpegel und daraus resultierendes Nichtfunktionieren der Schaltung, oder noch schlimmer, sporadische Fehlfunktionen&lt;br /&gt;
# Verzögerungen der Signale durch die Pegelwandlung und daraus resultierende maximale Signalfrequenzen&lt;br /&gt;
&lt;br /&gt;
=== Überlastung ===&lt;br /&gt;
&lt;br /&gt;
Das Erzeugen von verschiedenen Versorgungsspannungen ist ziemlich einfach, aber man muss sicher gehen, dass man die Signalpegel der Bauteile auf Toleranz überprüft. Wenn z.B. ein 5V Bauteil ein Signal an ein 3V Bauteil schickt, können beide Bauteile beschädigt werden. Vor allem für neue ICs ist es ein Problem mit &amp;quot;hohen&amp;quot; Spannungen wie 5V zu arbeiten. Auf Grund der immer kleineren Schaltkreisstrukturen (aktuelle Prozessoren werden mit 14nm Technologie hergestellt!) werden auch die Abstände und Schichtdicken immer geringer. Das reduziert natürlich auch die Spannungs- und Stromfestigkeit der Transistoren auf dem IC. Neue ICs vertragen deshalb meist nur noch 3.3V, teilweise sogar weniger! Die Überlastung erfolgt durch zu hohe Spannung und dadurch mehr oder weniger langsame Zerstörung des ICs.&lt;br /&gt;
&lt;br /&gt;
=== Schutzdioden ===&lt;br /&gt;
&lt;br /&gt;
Hauptursache Nummer zwei für Überlastung von ICs mit verschiedenen Betriebsspannungen sind die in nahezu allen ICs integrierten Schutzdioden. Deren Aufgabe ist es in Normalfall, elektrostatische Entladungen auf eine sichere, niedrige Spannung zu begrenzen. Die Entladungen geschehen durch unsachgemässe Handhabung und Transport von ICs, z.&amp;amp;nbsp;B. wenn jemand über einen Kunstfaserteppich läuft, sich dabei elektrostatisch auflädt und einen IC anfasst, oder wenn Bauteile in einem Gerät eingebaut sind und der Anwender berührt offen liegende Kontakte (RS232 Eingang, USB-Stick, PCI-Steckkarten beim Einbau etc.). Auch elektrostatische Entladungen / EMV können Ursache zu hoher Pegel auf den Leitungen sein.&lt;br /&gt;
&lt;br /&gt;
Die Schutzdioden beginnen, Strom zu leiten, wenn die Eingangsspannung ca. 300 mV - 600 mV über U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; ansteigt oder entsprechend unter GND absinkt. Im Normalbetrieb sollten die Schutzdioden keinen Strom leiten. Manchmal kann man sie aber zur Spannungsbegrenzung missbrauchen, siehe [[#STEP-DOWN:_5V_-.3E_3.3V | Spannungsherabsetzung mit Vorwiderstand]].&lt;br /&gt;
&lt;br /&gt;
Besonderes Augenmerk ist hierbei auf die optimale Dimensionierung des R zu legen, um sicherzustellen, dass kein zu hoher Strom über die Schutzdioden abgeführt werden muss. Je nach Chip-Type und Ausgang halten diese zwischen 100 µA und 10 mA aus.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_schutzdioden.png]]&lt;br /&gt;
&lt;br /&gt;
=== 5-V-tolerante Eingänge ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;5-Volt-tolerant&amp;lt;/i&amp;gt; bedeutet, dass 3-Volt-Bausteine ohne Probleme von einem 5-Volt-Baustein angesteuert werden dürfen.&lt;br /&gt;
&lt;br /&gt;
Viele Bauteile mit einer Betriebsspannung von 3 V verfügen über 5-V-tolerante Eingänge. Man sollte aber grundsätzlich im Datenblatt dies nachschauen, bevor die Schaltung aufgebaut wird. Sind sie es nicht, so ist ein &amp;lt;b&amp;gt;Pegelwandler&amp;lt;/b&amp;gt; auf den Verbindungsleitungen zwischen den Bauteilen notwendig. Ein Pegelwandler kann eine einfache Zener-Diode mit einem Widerstand sein, es kann aber auch ein eigens dafür vorgesehener IC sein. Sind die Signalwege bidirektional, so wird man meist die Lösung mit einem eigenen IC bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Bei geringen Geschwindigkeitsanforderungen und erlaubten flachflankigen Signalen (bei Zähl- und Takteingängen ist dazu Schmitt-Trigger-Verhalten erforderlich) genügt ein Serienwiderstand (Richtwert 10 kΩ) in Verbindung mit der Eingangsschutzbeschaltung. Bei allen derartigen „passiven Pegelkonvertern“ muss die Logikschaltschwelle durchfahren werden. Bei heutzutage üblichen treibenden CMOS-Ausgangsstufen ist das kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ob ein Bauteil 5-V-tolerant ist und unter welchen Betriebsbedingungen das gilt, steht im Datenblatt des betreffenden Bauteils vom betreffenden Hersteller. Wenn es auf diese Eigenschaft ankommt, lieber genau bei Lieferanten nachsehen, von welchem Hersteller die Bauteile kommen.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
&lt;br /&gt;
[[AVR]]s sind generell &#039;&#039;&#039;nicht&#039;&#039;&#039; 5-V-tolerant, wenn sie mit 3,3 V betrieben werden! Die absolute obere Grenze für Eingangsspannungen liegt bei U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; + 0,5 V. Zu finden in den elektrischen Spezifikationen im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Die GPIO-Pins des Raspberry Pi sind ebenfalls &#039;&#039;&#039;nicht&#039;&#039;&#039; 5-V-tolerant!&lt;br /&gt;
&lt;br /&gt;
Vorsicht bei:&lt;br /&gt;
&lt;br /&gt;
* 74&#039;&#039;&#039;LVX&#039;&#039;&#039;xxxx und 74&#039;&#039;&#039;LCX&#039;&#039;&#039;xxxx (245, 244, 240 ...) an Vcc = 3,3 V.&amp;lt;br&amp;gt;&amp;lt;font color=FF0000&amp;gt;Achtung&amp;lt;/font&amp;gt;: Nicht alle 74LVX sind für 5 V -&amp;gt; 3,3 V geeignet, da jeder Hersteller die ICs anders baut!&lt;br /&gt;
* SN74LVC07AD&lt;br /&gt;
* SN74LV1T04 (auch geeignet zur umgekehrten Konvertierung (3,3V-&amp;gt;5V))&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität von Logikpegeln ===&lt;br /&gt;
&lt;br /&gt;
Siehe auch http://www.interfacebus.com/Design_Translation.html&lt;br /&gt;
&lt;br /&gt;
Verschiedene Mikroprozessoren haben eigene elektrische Kenndaten für HIGH- und LOW-Pegel, die abhängig von der Versorgungsspannung sind, z.&amp;amp;nbsp;B. der [[R8C]]:&lt;br /&gt;
&lt;br /&gt;
* HIGH größer 0,8 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&lt;br /&gt;
* LOW kleiner 0,2 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man muss die Spannungen der Aus- und Eingänge vergleichen. Wenn es um ein Hobbyprojekt geht, kann man einfach messen. Wenn es um eine kommerzielle Anwendung geht, die man verkaufen will, sollte man besser die Spezifikationen der ICs studieren.&lt;br /&gt;
&lt;br /&gt;
== UNIDIREKTIONAL ==&lt;br /&gt;
&lt;br /&gt;
=== 1,8 V ⇒ 5 V ===&lt;br /&gt;
&lt;br /&gt;
* Die besondere Eigenschaft der alten TTL-Schaltkreise, nämlich dass Strom bei LOW &#039;&#039;&#039;aus&#039;&#039;&#039; dem Eingang in den treibenden Ausgang fließt kann man sich zunutze machen, wie die nachfolgende Schaltung zeigt. In dieser wird der HIGH-Pegel des 1,8-V-Signals durch eine Schottkydiode um ca. 0,3 V auf 2,1 V erhöht. Damit ist man fast offiziell im HIGH-Bereich für TTL (Schaltschwelle 1,4 V, HIGH &amp;gt; 2,0 V). Der LOW-Pegel wird auf ca. 0,3 V erhöht, was voll den TTL-Richtlinien entspricht. Als Schaltkreisfamilie &#039;&#039;&#039;muss&#039;&#039;&#039; ein [[74xx|TTL-Typ]] eingesetzt werden, also LS, F, AS oder ähnlich. CMOS-Typen wie HC, LVC etc. funktionieren &#039;&#039;&#039;nicht&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_LS.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=FF0000&amp;gt;Achtung&amp;lt;/font&amp;gt;: Diese Schaltung entspricht bei HIGH ungefähr einem offenen TTL-Eingang, was zwar meistens funktioniert, aber etwas störempfindlich sein kann. Davon wurde in der TTL-Ära stets abgeraten. Zudem ist der Pegelwechsel LOW nach HIGH durch den niedrigen Strom eher langsam. Man kann das jedoch mit einem Pullup-Widerstand absichern. Dann sind auch Gatter der 74HCT-Reihe einsetzbar.&lt;br /&gt;
&lt;br /&gt;
=== 3,3 V ⇒ 5 V ===&lt;br /&gt;
&lt;br /&gt;
Diese Konversion ist mit Abstand die häufigste. Dabei kann man getrost 3,3 V (früher) und 3 V (moderner) gleich setzen.&lt;br /&gt;
&lt;br /&gt;
* 3,3-V-Pegel werden bei TTL-kompatiblen Eingängen richtig erkannt (Schaltschwelle 1,4 V). Es ist kein Pegelwandler erforderlich. Direkte Verbindung. Einer der großen Vorteile klassischer TTL-Technik!&lt;br /&gt;
&lt;br /&gt;
* 5-V-CMOS Eingänge haben typisch eine minimale Eingangsspannug für HIGH (&amp;lt;math&amp;gt;V_{IH}&amp;lt;/math&amp;gt;) von 0.6 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 0.6 * 5 V = 3 V. Das kann ein 3,3-V-CMOS-Ausgang direkt treiben, allerdings kann sich das Zeitverhalten dadurch etwas ändern, weil der HIGH Pegel später erkannt wird. Vorsicht! Viele 5-V-CMOS-ICs wollen für HIGH offiziell mindestens 0,7 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 3,5 V oder manche auch 0,8 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 4,0V! Das geht dann offiziell nicht mehr mit einem 3,3-V-Ausgang! Für Hobbyzwecke kann man das aber ggf. probieren.&lt;br /&gt;
Zu beachten ist, dass der nicht ganz nach High durchgesteuerte Eingang Querstrom von der Speisespannung ziehen kann. Das kann für batteriebetriebene Geräte oder USB-konformes Standby durchaus ausschlaggebend sein.&lt;br /&gt;
&lt;br /&gt;
Möglich ist auch eine &#039;&#039;&#039;Zentrierung&#039;&#039;&#039; des Ausgangspegels mit 2 Widerständen wie im folgenden linken Bild. Allerdings besteht die Gefahr, dass die 3,3-V-Versorgung hochläuft, da Spannungsregler (hier: für die 3,3 V) nicht dafür ausgelegt sind, bei Überspannung an deren Ausgang zusätzlich Strom nach Masse abzuleiten: Die 3,3-V-Verbraucher müssen bei High eine Mindestlast erbringen, etwa mit einem zusätzlichen Widerstand &#039;&#039;&#039;R3&#039;&#039;&#039; vom Ausgang nach GND.&lt;br /&gt;
&lt;br /&gt;
[[bild:Zentrierung-3P3-5P.png]] [[bild:Zentrierung-3P3-5P-R3.png]]&lt;br /&gt;
&lt;br /&gt;
* 3,3-V-[[Ausgangsstufen_Logik-ICs | Open Collector]] nach 5 V (TTL oder CMOS): Einfach einen Pull-Up Widerstand hinzufügen und gut. Allerdings verbraucht der Pull-Up-Widerstand bei LOW auf jeden Fall Strom und begrenzt bei HIGH den maximalen Gate-Umladestrom. Die Schaltgeschwindigkeit von LOW nach HIGH wird durch die Größe des Pull-Ups bestimmt. Je nach Geschwindigkeitsanforderungen kann der in Mikrocontrollern meistens zuschaltbare innere Widerstand dazu benutzt werden. Zudem kann dieser, bei bekannt LOW bleibendem Eingangspegel, zur Reduktion der Stromaufnahme abgeschaltet werden. Bipolare TTL-Schaltkreise benötigen in der Bastelschaltung keinen Pull-Up (liefern Strom); bei Schaltungen mit erhöhter Zuverlässigkeit ist dennoch ein externer Pull-Up angeraten (Richtwert 4,7 kΩ).&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_3-5.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Das Simulieren von Open Collector in Mikrocontrollern oder mittels Tristate-Treibern oder die Verwendung von Open-Collector-Ausgängen von Schaltkreisen, bei denen keine höhere Ausgangsspannung spezifiziert ist (etwa 74HC03), ist für diesen Zweck unzulässig und wenig hilfreich, weil Gateschutzdioden und andere parasitäre Siliziumstrukturen den Strom aus dem Widerstand nach 3,3 V ableiten und so maximal 4 V generieren. Auch hier besteht die Gefahr des Hochlaufens der 3,3-V-Versorgung.&lt;br /&gt;
&lt;br /&gt;
* 3,3 V auf echte 5 V (CMOS) geht am einfachsten mit einem Baustein der HCT-Familie (NICHT HC!). Diese haben TTL-kompatible Eingänge und echte CMOS-Ausgänge&lt;br /&gt;
&lt;br /&gt;
* Man kann einen Komparator &amp;lt;small&amp;gt;in nichtinvertierender Schaltung&amp;lt;/small&amp;gt; benutzen (LM339/393). Allerdings ist diese Lösung relativ langsam, abhängig vom verwendeten Komparator. Komparatoren bieten eine freie Wahl des Eingangsspannungsbereichs und sind deshalb eine gute Wahl bei &#039;&#039;variabler&#039;&#039; Speisespannung der Treiberseite.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_comp_3-5.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/part/74HCT245 74HCT245], [http://www.mikrocontroller.net/part/74HCT244 74HCT244]oder [http://www.mikrocontroller.net/part/74HCT240 74HCT240] (Das &#039;&#039;&#039;T&#039;&#039;&#039; ist wichtig. HCs können funktionieren, sind aber suboptimal, da bei 5V Versorgung und höheren Temperaturen U&amp;lt;sub&amp;gt;input,high&amp;lt;/sub&amp;gt; = 3,2 V)&lt;br /&gt;
* [http://www.mikrocontroller.net/part/74HCT125 74HCT125]: OE Pins auf Masse und dann das Signal einfach anschließen. &lt;br /&gt;
* SN74LVC07AD &lt;br /&gt;
* SN74LV1T04 (auch geeignet zur umgekehrten Konvertierung (5 V ⇒ 3,3 V))&lt;br /&gt;
* 74V1T126 (single Gatter, U&amp;lt;sub&amp;gt;input,high&amp;lt;/sub&amp;gt; = 2 V)&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇒ 9..15(..30) V ===&lt;br /&gt;
&lt;br /&gt;
* Am einfachsten geht das mit einem (geeigneten!) Open-Collector-Ausgang, einfach einen Pull-Up hinzufügen (an die hohe Spannung) und fertig. Ein 74&#039;&#039;xx&#039;&#039;03 geht hier nicht! Auch kann man nicht einen Push-Pull-Ausgang eines Mikrocontrollers dafür verwenden, indem man den Ausgang bei HIGH zum Eingang macht.&lt;br /&gt;
Hintergrund sind parasitäre Dioden zwischen Ausgang und Speisespannung.&lt;br /&gt;
Alle (geeigneten) Treiberausgänge haben eine maximal erlaubte Kollektorspannung, die zu beachten ist. Mehr Freiheit hat man bei der Verwendung von Einzeltransistoren, wobei eine gewisse Lücke von 30 V bis 200 V von Bipolartransistoren dominiert wird; für kleinere oder größere Spannungen gibt es preiswerte MOSFETs. (Die Lücke entsteht durch den geringen Bedarf des Weltmarktes an diesen Kollektorspannungen.)&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_5-12.png]]&lt;br /&gt;
&lt;br /&gt;
* Man kann einen Komparator benutzen. Allerdings ist diese Lösung relativ langsam, abhängig vom verwendeten Komparator. Wenn nur zwei Signale gewandelt werden müssen bietet sich der LM393 an, ein Doppelkomparator mit Open-Collector-Ausgang, mit dem man auf einen beliebigen Pegel ausgeben kann. Der LM339 (man beachte den unauffälligen Zahlendreher) ist ein Vierfachkomparator mit den gleichen Eigenschaften. Wenn wenig Platz vorhanden ist, dann ist der TL311 im winzigen SOT-23 Gehäuse sehr empfehlenswert. Bei jedem Komparator kann auch einfach eine Invertierung gemacht werden, einfach die Eingänge + und - vertauschen. Diese Komparatoren eignen sich bis ca. 1 MHz.&lt;br /&gt;
&lt;br /&gt;
* [http://www.elektronik-kompendium.de/sites/praxis/bausatz_pegelwandler-mit-transistoren.htm Pegelwandler mit Transistor, invertierend]&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_trans_inv.png]]&lt;br /&gt;
&lt;br /&gt;
* Pegelwandler mit Transistor, nicht invertierend&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_trans_ni.png]]&lt;br /&gt;
&lt;br /&gt;
Die Idee ist einfach. Wenn der Ausgang des 5-V-Gatters auf HIGH ist dann ist der Transistor ausgeschaltet, der Pull-Up-Widerstand R7 zieht den Ausgang auf + 12 V. Ist der Ausgang des 5-V-Gatters auf LOW ist, dann ist er vollkommen durchgesteuert und der Ausgang nahe 0 V (je nach Typ ca. 300 mV). Der Vorteil ist hier erhöhte Störsicherheit im Gegensatz zur einfachen Ansteuerung der Basis über einen Vorwiderstand. Außerdem wird dadurch nicht die Logik invertiert. Nachteilig ist der geringe Strom, der bei HIGH zur Verfügung steht (typisch 100 µA). Diese Schaltung ist die seltene Anwendung einer Basisschaltung für digitale Signale. Der Vorteil der Basisschaltung ist die höhere Grenzfrequenz durch die herabgesetzte Wirksamkeit der (störenden) Miller-Kapazität.&lt;br /&gt;
&lt;br /&gt;
* Wenn mehr Geschwindigkeit, Ausgangsstrom und weniger Stromverbrauch nötig ist, dann muss ein spezieller Baustein her, wie z.&amp;amp;nbsp;B.&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
** [[Mosfet-Übersicht#Mosfet-Treiber|MOSFET-Treiber]] z.B. ICL7667&lt;br /&gt;
** [[H-Brücken Übersicht | Motortreiber]] ICs: (z.&amp;amp;nbsp;B. L293, L298, UCC27325 und deren Verwandte), wenns nicht zu schnell ist (einige Dutzend kHz)&lt;br /&gt;
** CD40109, 4fach Pegelwandler, bei Reichelt verfügbar&lt;br /&gt;
** HEF4104, 4fach Pegelwandler mit normalen und invertierten Ausgängen sowie Tristate. Um ggf. sicherzustellen, dass wie im Datenblatt beschrieben immer U&amp;lt;sub&amp;gt;DDI&amp;lt;/sub&amp;gt; &amp;lt;= U&amp;lt;sub&amp;gt;DDO&amp;lt;/sub&amp;gt; ist, kann man einfach eine Diode von U&amp;lt;sub&amp;gt;DDO&amp;lt;/sub&amp;gt; nach U&amp;lt;sub&amp;gt;DDI&amp;lt;/sub&amp;gt; schalten (z.&amp;amp;nbsp;B. Schottky SB120, aber auch 1N4148 &amp;amp; Co. sollte problemlos funktionieren)&lt;br /&gt;
** CD4504, 6fach Pegelwandler 3-20V, Eingangspegel TTL oder CMOS (umschaltbar) =&amp;gt; CMOS, keine Reihenfolge von U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;/U&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt; erforderlich (Bezugsquelle: CSD)&lt;br /&gt;
** MAX232, der braucht nur 5 V Versorgungsspannung. Allerdings ist der Ausgangswiderstand relativ hoch (ca. 300 Ω) und man kann nur ca. 5 mA Ausgangstrom liefern. Die Ausgangsspannung beträgt maximal 10 V.&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇒ 3,3 V ===&lt;br /&gt;
&lt;br /&gt;
Ob 3,3 V (klassisch) oder 3 V (modern) ist bei dieser Betrachtung nahezu egal.&lt;br /&gt;
&lt;br /&gt;
* Zuerst sollte man prüfen, ob die Eingänge 5V-tolerant sind. Dann kann man die ICs direkt verbinden. Sehr schnell und billig!&lt;br /&gt;
&lt;br /&gt;
* Wenn die Eingänge nicht 5-V-tolerant sind und es trotzdem schnell sein soll, muss ein Gatter aus der LVC- oder AHC-Familie dazwischen geschaltet werden, also eines mit 5V-Toleranz. Bei 3 V Betriebsspannung kann man problemlos 5 V an den Eingang anlegen. Der Baustein 74HC4050 erlaubt per Definition eine Pegelwandlung bis etwa 15 V (siehe Datenblatt). Beide Anordungen haben auch eine sehr niedrige Ruhestromaufnahme.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:* 74LVC245A (&#039;A&#039; ist wichtig, I/Os 5V-tolerant)&lt;br /&gt;
:* 74LVC245DW &lt;br /&gt;
:* 74LVT245 &lt;br /&gt;
:* 74LVXxxx (245, 244, 240 ...) an Vcc=3,3V. Achtung: Nicht alle 74LVX sind für 5V -&amp;gt; 3,3V geeignet, da jeder Hersteller die ICs anders baut!&lt;br /&gt;
:** 74LVX04 &lt;br /&gt;
:** 74LVX244 (Fairchild)&lt;br /&gt;
:** 74LVX245 (nicht von Reichelt, nicht 5V tolerant)&lt;br /&gt;
:** bei TI heissen die 74LVX... nur 74LV...&lt;br /&gt;
&lt;br /&gt;
:* 74HC4050 (bis 15 V Step-Down-Pegelwandlung laut Datenblatt, bei Reichelt in DIP und SO erhältlich)&lt;br /&gt;
:* MAX3373/MAX3375&lt;br /&gt;
:* NC7SZ08 oder andere aus derselben Serie. CMOS-Logik mit 5-V-toleranten Eingängen, recht flott und braucht dank SOT-23 auch wenig Platz auf der Platine&lt;br /&gt;
&lt;br /&gt;
* 5 V Open Collector auf 3,3-V-Eingang. Einfach einen Pull-Up hinzufügen (Pull-Up liegt auf 3,3 V). Nachteilig ist der relativ hohe Stromverbrauch bei LOW, die begrenzte Geschwindigkeit bei hochohmigen Pull-Ups und der relativ geringe Ausgangsstrom bei HIGH (abhängig vom Pull-Up).&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
* Spannungsteiler mit 680 Ω und 1 kΩ. Der Nachteil dieser Lösung ist der relativ hohe Stromverbrauch (~3mA), der relativ geringe Ausgangsstrom (mehr als 200..300 µA sollte man da nicht rausziehen) und die relativ geringe Geschwindigkeit (ca. 10 MHz).&lt;br /&gt;
&lt;br /&gt;
[[Datei:SPI level shifter with resistor divider.png|miniatur|rechts|fehlerhafter SPI-Takt nach Pegelwandler mit Widerstandsteiler (1,8/3,3 kΩ)&amp;lt;br /&amp;gt;unten: 5V-Ausgang am Mikrocontroller&amp;lt;br /&amp;gt;&lt;br /&gt;
oben: 3,3V-Eingang an der SD-Karte nach Pegelwandler]]&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_st_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
* 1 kΩ Vorwiderstand. Dadurch wird der Strom vom 5-V-Ausgang in die 3,3-V-Versorgung durch die internen Schutzdioden auf ca. 1 mA begrenzt. Diese Lösung ist auch relativ langsam (ca. 5MHz). Ggf. kann man den Vorwiderstand auf 100 Ω reduzieren, das erhöht dann wieder die Geschwindigkeit. Aufpassen, einige ICs vertragen nur 1 mA oder weniger durch die Schutzdioden! Ausserdem muss man aufpassen, da jetzt von der 5-V-Seite Strom in die 3,3-V-Versorgung eingespeist wird. Besonders in Schaltungen mit sehr niedriger Stromaufnahme kann das zum Problem werden, wenn die Stromaufnahme geringer ist, als über die Vorwiderstände eingespeist wird. Dann nimmt es meist der Spannungsregler für 3,3 V übel wenn jemand „schiebt“, sprich, Strom einspeist. Denn die allermeisten Spannungsregler können nur Strom liefern (source), aber keinen Strom aufnehmen (sink). Es gibt 4-fach-Diodennetzwerke, die die internen Schutzdioden entlasten können (Schottkydioden mit kleinerer Flusspannung von ≈ 0,3 V als die internen Silizizumdioden mit ≈ 0,7 V), außerdem ist teilweise noch eine [[Diode#Z-Diode|Zenerdiode]] enthalten, die ggf. den überschüssig eingespeisten Strom aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Alle Lösungen mit Vorwiderständen reduzieren die Flankensteilheit der Signale. Dies kann bei Takt- und Zähleingängen zu unerwünschten Schwingungen und damit Fehlzählungen führen. Derartig benutzte Eingänge sollten Schmitt-Trigger-Verhalten aufweisen.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_vw_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
Achtung: Mindestens für 74HC(T) Gatter ist dokumentiert (Philips 74HC/T High-Speed CMOS User Guide), dass auch schon geringer Strom durch die internen Schutzdioden zu einer unerwünschten Kopplung von Eingängen führen kann, d.h. der Strom fliesst zu einem anderen Eingang wieder hinaus. Sind also andere Eingänge ebenso hochohmig angeschlossen, kann dieser Querstrom zu Fehlfunktion führen.&lt;br /&gt;
&lt;br /&gt;
== BIDIREKTIONAL ==&lt;br /&gt;
&lt;br /&gt;
Für bidirektionale Busse gibt es spezielle Pegelwandler mit 2 Versorgungsspannungen. Allerdings brauchen die meist ein Signal zur Richtungsumschaltung. Auch muss man die Reihenfolge der Versorgungsspannungen beim Einschalten beachten. Aktive bidirektionale Pegelwandler OHNE Steuereingang zur Richtungsumschaltung sind mit Vorsicht zu genießen, denn die brauchen teilweise kurzzeitig einen relativ hohen Strom, um die Eingänge zu treiben.&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇔ 3,3 V ===&lt;br /&gt;
&lt;br /&gt;
* Wenn die 5-V-Seite TTL-kompatible Eingänge hat kann wieder der Spannungsteiler oder Vorwiderstand wie bei der unidirektionalen Anpassung verwendet werden (mit all seinen Vor- und Nachteilen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* SN74CB3T3306&lt;br /&gt;
* SN74CBTD3861 (10 Bit,flow through, Betrieb mit 5 Volt)&lt;br /&gt;
* MAX1741 &lt;br /&gt;
* MAX3378E &lt;br /&gt;
* 74AHC126 s.u.&lt;br /&gt;
* ST2378 (bei CSD erhältlich, 3.5 eur, leider TSSOP)&lt;br /&gt;
* TXS0104E (TI: 4-BIT BIDIRECTIONAL VOLTAGE-LEVEL TRANSLATOR FOR OPEN-DRAIN AND PUSH-PULL APPLICATIONS)&lt;br /&gt;
* SN74LVC07A&lt;br /&gt;
* von Analog Devices die ADUM Serie&lt;br /&gt;
&lt;br /&gt;
=== 1,65 V ... 5,5 V ⇔ 1,65 V ... 5,5 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC2T45&lt;br /&gt;
* SN74LVC(H)8T245&lt;br /&gt;
* SN74LVC(H)16T245&lt;br /&gt;
&lt;br /&gt;
=== 1,2 V ... 3,6 V ⇔ 1,65V ... 5,5V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* TXB0101&lt;br /&gt;
* TXB0102&lt;br /&gt;
* TXB0104&lt;br /&gt;
* TXB0106&lt;br /&gt;
* TXB0108&lt;br /&gt;
&lt;br /&gt;
=== 1,2 V ... 3,6V ⇔ 1,2 V ... 3,6 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* SN74AVC(H)1T45&lt;br /&gt;
* SN74AVC(H)2T45&lt;br /&gt;
* SN74AVC(H)4T245&lt;br /&gt;
* SN74AVC(H)8T245&lt;br /&gt;
* SN74AVC(H)16T245&lt;br /&gt;
* SN74AVC(H)20T245&lt;br /&gt;
* SN74AVC(H)24T245&lt;br /&gt;
* SN74AVC(H)32T245&lt;br /&gt;
&lt;br /&gt;
=== 1,5 V ... 3,6 V ⇔ 1,5 V ... 5,5 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* 74LVC4245A&lt;br /&gt;
&lt;br /&gt;
== Mit galvanischer Trennung ==&lt;br /&gt;
&lt;br /&gt;
* [[Optokoppler]] (Langsam! Es gibt verschieden schnelle Koppler, aber über 1 MHz kommen sie kaum hinaus. Grundregel: Solche mit Fototransistoren sind am langsamsten, Richtwert 10 kHz, Fotodioden sind schneller, schnelle Optokoppler haben eine gesondert zu speisende Empfängerschaltung.)&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_opto.png]]&lt;br /&gt;
&lt;br /&gt;
* GMR-Koppler von der Firma NVE &lt;br /&gt;
* iCoupler Technologie von der Firma Analog Devices&lt;br /&gt;
* [[Kapazitiver Koppler]] (schnell, begrenzter Potenzialversatz)&lt;br /&gt;
* Transformatorkopplung (nur für gleichspannungsfreie Wechselsignale geeignet; sehr schnell; Beispiel: Netzwerkkarten)&lt;br /&gt;
&lt;br /&gt;
Lit.: &#039;&#039;Galvanische Trennung: Optokoppler, GMR-Koppler oder iCoupler?&#039;&#039;, Siegfried W. Best, Redaktion elektronik industrie, [http://www.elektronik-industrie.de/ei/11,2003/article/2f0082f824c.html elektronik industrie 11-2003, S. 22ff.]&lt;br /&gt;
&lt;br /&gt;
== Praktische Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Einfaches RS232-Interface ===&lt;br /&gt;
&lt;br /&gt;
[http://web.archive.org/web/20050122013618/http://www.henrik-reimers.de/control/rs232interface.gif Erfolgreicher Einsatz bis 19200 Baud und bis zu 10 m Leitungslänge]&lt;br /&gt;
Beschränkungen:&lt;br /&gt;
&lt;br /&gt;
* ggf. Platzbedarf&lt;br /&gt;
* Geschwindigkeit s.o.&lt;br /&gt;
&lt;br /&gt;
Beispiel: http://www.hagtech.com/pdf/translator.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[I2C]]-Bus: gemeinsam 3.3V und 5V ===&lt;br /&gt;
&lt;br /&gt;
* [[MSP430]] an 3,3V/5V: [https://www.ti.com/lit/pdf/slaa148 slaa148.pdf]&lt;br /&gt;
&lt;br /&gt;
* Philips [http://www.nxp.com/documents/data_sheet/PCA9515.pdf PCA9515]: I2C Puffer mit Pegelwandlung. Der PCA9515 ist ein I2C-Bus Repeater, welcher I2C Busse mit verschiedenen Spannungen isoliert. Verfügbar bei Reichelt und DigiKey.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/256452/levelshifter.pdf  AN97055] von Philips, &amp;quot;Bi-directional level shifter for I²C-bus and other systems&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Bevor man ein Philips I2C Chip auswählt sollte man prüfen ob er verfügbar ist und auch das verfügbare Gehäuse wählen. Man sollte auch überlegen ob ein Puffer wirklich gebraucht wird. Wenn man echte I2C ICs mit 5V betreibt, dann sind die Eingänge vom Typ Schmitt Trigger CMOS (z.&amp;amp;nbsp;B. PCF8574). Dann müssen 3.3V Pegel auf 5V umgesetzt werden. Wenn man jedoch SMBUS Ics verwendet (z.&amp;amp;nbsp;B. ADT7461, Silabs 8051) dann sind die Schwellspannungen TTL kompatibel und es ist keine Anpassung notwendig. Für neue Pegelwandler sollte man hier nachschauen. http://www.bus-buffer.com&lt;br /&gt;
&lt;br /&gt;
* [http://www.edn.com/article/CA193193.html &amp;quot;Two-transistor circuit replaces IC&amp;quot;]. Für diese Anwendung kann ENABLE direkt mit 3.3V verbunden werden. Es ist eigentlich nur dazu da, den ICs &amp;quot;hot-swappable&amp;quot; zu machen (kann unter Spannung gesteckt und getrennt werden). Es geht sogar mit nur einem [[Transistor]] [http://www.mikrocontroller.net/topic/92447 siehe Forum]. Man sollte beachten, daß die Schaltung sowohl für SCL als auch SDA benötigt wird. &lt;br /&gt;
* Noch einfachere Lösungen mit nur einem MOSFET und zwei Pull-Up Widerständen pro Leitung sind in den folgenden Links zu finden. &lt;br /&gt;
** [https://cdn-shop.adafruit.com/datasheets/AN10441.pdf] von NXP&lt;br /&gt;
** [http://www.semiconductors.philips.com/acrobat_download/literature/9398/39340011.pdf 39340011.pdf] (Kapitel 18), bei der Berechnung der erreichbaren Geschwindigkeit dürfen die parasitären Kapazitäten der FETs nicht ignoriert werden&lt;br /&gt;
&lt;br /&gt;
=== Auswählbare Pegel ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Ein CMOS Logikpegel zwischen 1,8V, 2,5V und 3,3V (abhängig von der Anwendung) muss auf 5V CMOS Logikpegel gewandelt werden. Es geht nur um diese Richtung mit maximal 8MHz. Es gibt die Stromversorgung für alle Pegel. Ein normaler Komparator wie LM311 ist nicht möglich, da er beim Betrieb mit 5V Versorgunsspannung erst ab 1V zu schalten anfängt. Meine Idee ist die Verwendung eines High Speed OPVs mit R2R Eingang, z.&amp;amp;nbsp;B. LMH6645.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Antworten:&#039;&#039;&#039;&lt;br /&gt;
* Man könnte einen ultra-low threshold N-Kanal MOSFET nehmen und als Open Drain mit einem Pull-Up nach 5V betreiben, BSH103 könnte passen (Schwellspannung ~0,4V).&lt;br /&gt;
* High-Speed Single Supply Komparator wie z.&amp;amp;nbsp;B. [http://www-s.ti.com/sc/ds/tl712.pdf TL712] .&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC8T245&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Ich suchen einen IC, welcher eine Pegelwandlung von 3,3V nach 1,8V, 2,0V oder 5V ermöglicht und während des Betriebs umgeschaltet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Antworten:&#039;&#039;&#039;&lt;br /&gt;
* So ein IC ist der Linear [http://www.linear.com/pc/productDetail.jsp?navId=H0,C1,C1007,C1071,P1601 LTC1555L-1.8] .&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC8T245&lt;br /&gt;
&lt;br /&gt;
=== AVR SPI (SDC/MMC)===&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;bidirektionalen Betrieb&#039;&#039;&#039; zwischen 5V-AVR und 3,3V-Geräten und anders herum gibt es den Level-Translator &#039;&#039;&#039;MAX3378E&#039;&#039;&#039; von Maxim.&lt;br /&gt;
&lt;br /&gt;
Wenn die Datenrichtung am SPI im Zielsystem festgelegt ist, reichen &#039;&#039;&#039;unidirektionale Bausteine&#039;&#039;&#039;:&lt;br /&gt;
* 3x von 5V nach 3,3V und 1x von 3,3V nach 5V: &#039;&#039;&#039;MAX3392E&#039;&#039;&#039;&lt;br /&gt;
* 1x von 5V nach 3,3V und 3x von 3,3V nach 5V: &#039;&#039;&#039;MAX3390E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zum Anschließen einer SDC/MMC an einen 5V-AVR eignen sich somit der MAX3978E und der MAX3392E. Beide sind u.A. im winzigen TSSOP-14-Gehäuse verfügbar, nehmen sehr wenig Energie auf und eignen sich auch für andere Spannungen. Mit 3,3 und 5V beträgt die garantierte Übertragungsrate 8Mbps.&lt;br /&gt;
&lt;br /&gt;
* [http://datasheets.maxim-ic.com/en/ds/MAX3372E-MAX3393E.pdf Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit zum Übersetzen zwischen 3,3 und 5V liegt in der Verwendung des &#039;&#039;&#039;74LVC245&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bastlerfreundlicher als &#039;&#039;&#039;MAX33XXX&#039;&#039;&#039; (in SO-Gehäuse):&lt;br /&gt;
* 5V &amp;gt; 3,3V (SCK, MOSI, CS): 74LVC-serie (z.B. 74LVC14A)&lt;br /&gt;
* 3,3V &amp;gt; 5V (MISO): 74HCT-Serie (z.B. 74HCT125, 74HCT251)&lt;br /&gt;
&lt;br /&gt;
5V-AVR an eine MMC (ohne Level-Shifter-Baustein):&lt;br /&gt;
* [http://www.microsyl.com/index.php/2010/03/24/led-sign-with-mmc-memory-card/ Projektseite] &lt;br /&gt;
* [http://www.microsyl.com/projects/ledsign/ledsign1.pdf Schaltplan]&lt;br /&gt;
&lt;br /&gt;
=== Mikrocontroller ⇔ Parallelport ([[ISP]]-Dongle, [[JTAG]] Wiggler, ...) ===&lt;br /&gt;
&lt;br /&gt;
Dieser Schaltplan funktioniert auch bei 3,3 V wenn man einen 74&amp;lt;B&amp;gt;HC&amp;lt;/B&amp;gt;244 anstatt eines 74&amp;lt;B&amp;gt;LS&amp;lt;/B&amp;gt;244 verwendet: [http://www.epanorama.net/circuits/parallel_output.html Parallel port interfacing made easy: Simple circuits and programs to show how to use PC parallel port output capabilities].&lt;br /&gt;
&lt;br /&gt;
=== Doppeltes Leitungspaar RX/TX 5V/3,3V ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.hackaday.com/2008/06/19/sparkfuns-logic-level-converter/ SparkFun&#039;s Logic Level Converter] ist eine Baugruppe mit MOSFETs [http://www.fairchildsemi.com/pf/BS/BSS138.html BSS138] für die Pegelwandlung von 5V auf 3,3V. 5V/2,8V und 5V/1,8V sind ebenfalls machbar.&lt;br /&gt;
&lt;br /&gt;
=== Steuerleitung zwischen Mikrocontroller und FPGA ===&lt;br /&gt;
&lt;br /&gt;
Oftmals werden PLDs oder FPGAs per Microcontroller-Platine angesteuert. Ältere Typen laufen meist als 5V oder sitzen in 5V-kompatiblen Platinen. Sollen moderne FPGAs angesteuert werden, trifft man fast immer auf 3,3-V-Typen, bzw. muss sogar 2,5-V- / 1,8-V-Bänke beschalten, wenn nur noch dort Pins frei sind.&lt;br /&gt;
&lt;br /&gt;
==== Mikrocontroller ⇒ FPGA ====&lt;br /&gt;
&lt;br /&gt;
Die 5 V sind also im Extremfall auf 1,8 V herabzusetzen, was bei einem maximal zulässigen Diodenstrom von 3 mA (Beispiel Xilinx) einen Mindestwiderstand von ca. 1 kΩ erfordert. Die resultierende maximale Schaltfrequenz liegt dann bei einem typischen FPGA-Eingang bei etwa &amp;lt; 500 kHz. Soll der Eingang aus Belastungsgründen nicht mit mehr als 0,3 mA belastet werden, müsste der Widerstand auf 10 kΩ steigen, wodurch die Frequenz auf 1/10 sinkt. Zudem ist der Eingang dann störempfindlicher. Daher ist es besser, man schaltet dem Eingang eine zusätzliche Z-Diode bei und dimensioniert den Vorwiderstand so, dass die Strombelastbarkeit des Mikrocontrollers ausgelastet wird.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist es, die Spannung mit einer Diode in Vorwärtsrichtung herabzusetzen. Dann muss jedoch der Vorwiderstand noch exakter toleriert werden und auch Abweichungen der Spannung (Welligkeit) berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
==== FPGA ⇒ Mikrocontroller ====&lt;br /&gt;
&lt;br /&gt;
Umgekehrt ist es oft nötig, dass Bausteine einen fremden Chip treiben müssen, dessen Eingang bereits mit einem Pull-Up versehen ist. Über diesen wird dann stets ein Strom in die Schutzdiode eingeprägt, auch wenn der Ausgang auf HIGH geht. Soll z. B. von einem PLD oder einem FPGA aus eine Mikrocontrollerplatine bedient werden, die über einen Pull-Up von 1 kΩ verfügt, würden immer ca. 1 mA in die Schutzdiode eingeprägt. Hier kann eine Seriendiode helfen, die Spannung genügend herabzusetzen, um den Ausgang zu schützen und dennoch die Funktion zu erhalten. Dann steuert ein LOW-Ausgang den Eingang auf geschätzte 1V, was aber meistens für das Erkennen von LOW noch sicher reicht.&lt;br /&gt;
&lt;br /&gt;
== Bauteile ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;74ALVC164245&#039;&#039;&#039; - &#039;&#039;16bit dual supply translating transceiver&#039;&#039;. Eine Seite von 1.5V bis 3.6V, die andere von 1.5 bis 5.5V.&lt;br /&gt;
* &#039;&#039;&#039;74LVX573&#039;&#039;&#039; (unidirektional, Latch, nicht alle Hersteller bauen diesen 5V tolerant!)&lt;br /&gt;
* &#039;&#039;&#039;74LVX245&#039;&#039;&#039; (bidirektional, nicht alle Hersteller bauen diesen 5V tolerant!)&lt;br /&gt;
* &#039;&#039;&#039;74LVX125&#039;&#039;&#039; - &#039;&#039;Low Voltage Quad Buffer with 3-STATE Outputs&#039;&#039;. http://www.fairchildsemi.com/pf/74/74LVX125.html&lt;br /&gt;
* &#039;&#039;&#039;SN74LVC2T45&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;SN74LVC8T245&#039;&#039;&#039; - &#039;&#039;8-Bit Dual-Supply Bus Transceiver with Configurable Voltage Translation and Three-State Outputs&#039;&#039;. http://focus.ti.com/docs/prod/folders/print/sn74lvc8t245.html&lt;br /&gt;
* &#039;&#039;&#039;74LCX244MSA&#039;&#039;&#039; von Fairchild.&lt;br /&gt;
* &#039;&#039;&#039;MAX3377&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAX3000&#039;&#039;&#039; 8-Kanal bidirektioneler Pegelwandler ohne Richtungsumschaltung&lt;br /&gt;
* &#039;&#039;&#039;ADG3308&#039;&#039;&#039; 8-Kanal bi-dir. Pegelwandler ohne Richtungsumschaltung, 1,15V..5,5V, 50MBps (hohe Umschaltströme beachten)&lt;br /&gt;
&lt;br /&gt;
Vierfachdioden im kleinen 6-poligen SMD-Gehäuse:&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00130230.pdf DSILC6-4xx.pdf]&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00065974.pdf DVIULC6-4SC6.pdf]&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00001734.pdf DALC208.pdf]&lt;br /&gt;
* [http://www.diodes.com/datasheets/ds30195.pdf QSBT40, vierfach Schottky Terminator für Datenleitungen]&lt;br /&gt;
* [http://www.littlefuse.com/data/en/Data_Sheets/SP724Lead_Free.pdf SP724, Siliziumschutzarray]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/307702#3316500 Forumsbeitrag]: Entkopplung von FT232 und AVR&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/503454?goto=6409954#6409949 Forumsbeitrag]:  2x level shift in Reihe (I2C)&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/525065#6828127 Forumsbeitrag]: Vorsicht bei bidirektionalen Pegelwandlern mit automatischer Richtungserkennung&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* Holmes D., [http://delphys.net/d.holmes/hardware/levelshift.html Bi-directional level-shift with MOSFETs]&lt;br /&gt;
* Gaurang Kavaiya, [http://www.edn.com/design/analog/4318916/Don-t-pay-for-level-translators-in-systems-using-multiple-power-supply-voltages Don’t pay for level translators in systems using multiple power-supply voltages], EDN, MAY 25, 2006, 81-86&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/scf3_lc.htm Einfacher Pegelwandler im ELKO]&lt;br /&gt;
* [http://www.prog-link.com/dcf77/dcf77-17.html Pegelwandler für DFC77 Module]&lt;br /&gt;
* [http://elektronik.kai-uwe-schmidt.de/index.php?page=mp3_blueschaltung Pegelwandler für [[I2C]] Bus in einem MP3 Player]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/256452/levelshifter.pdf Application Note von Philips, I2C Pegelwandler]&lt;br /&gt;
* [http://www.nxp.com/documents/user_manual/UM10204.pdf I2C Spezifikation]  &lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-234277.html#new Forumsbeitrag zum Thema 1,8V-5V Pegelwandler] &lt;br /&gt;
* [http://www.st.com/web/en/resource/technical/document/datasheet/CD00001208.pdf 74LCX16245, 16 Bit Pegelwandler]&lt;br /&gt;
* [http://www.standardics.nxp.com/products/lvc/buffers/ LVC Logikfamilie]&lt;br /&gt;
* [http://www.standardics.nxp.com/products/lvc/transceivers/ LVC Tranceiver]&lt;br /&gt;
* [http://www.microchip.com/stellent/groups/techpub_sg/documents/devicedoc/en026368.pdf 3V Tips ‘n Tricks] (PDF) von Microchip&lt;br /&gt;
* [http://www.ti.com/lit/an/slaa148/slaa148.pdf Interfacing the 3-V MSP430 to 5-V Circuits] (PDF) von Texas Instruments&lt;br /&gt;
* [http://www.ti.com/logic-circuit/voltage-level-translation/overview.html Texas Instruments Voltage level translators]: Auswahl passender Bauelemente durch Eingabe der gewünschten Parameter&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=104779</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=104779"/>
		<updated>2021-10-14T10:55:33Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Titel von Weblink aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Bei einem sogenannten [http://de.wikipedia.org/wiki/Finite_State_Machine Endlichen Zustandsautomaten] (engl. &#039;&#039;&#039;f&#039;&#039;&#039;inite &#039;&#039;&#039;s&#039;&#039;&#039;tate &#039;&#039;&#039;m&#039;&#039;&#039;achine, kurz FSM) handelt es sich um die Realisation eines Steuerungskonzeptes, welches eine abstrahierte Maschine zum Vorbild hat, die eine Reihe von Zuständen besitzt, durch die sich ihre Funktion definiert. Diese Maschine arbeitet, indem sie von einem Zustand in einen anderen übergeht und bei den Zustandsübergängen oder dem Verharren in Zuständen bestimmte Aktionen ausführt. Dabei ergibt sich der Folgezustand aus der Kombination des momentanen Zustands und einem externen Ereignis, z. B. einem Tastendruck oder einem Signal aus anderen Bereichen der Software. Dabei wird die Maschine oftmals in verschiedenen Zuständen nur für ganz bestimmte Ereignisse sensibel gemacht.&lt;br /&gt;
&lt;br /&gt;
Die FSM selbst wird immer in irgendeiner Weise über einen Takt angetrieben, kann also nicht in beliebig kurzen Zeitspannen auf Ereignisse reagieren und Zustände wechseln. Der aktive Takt definiert dabei, ob gerade ein Zustandswechsel stattfindet, oder ob in Zuständen verharrt wird. Mit jedem Takt wird anhand des vorliegenden Zustands und dem Status der Eingabekanäle entschieden, welcher Zustand als nächstes vorliegen soll und welche Aktionen dabei auszuführen sind.&lt;br /&gt;
&lt;br /&gt;
Abstrahierte Formen dieser Maschine werden in vielen elektronischen Geräten eingesetzt, um Bedieneraktivitäten und andere Ereignisse im System zu verarbeiten sowie autark ablaufende Prozesse geeignet zu beeinflussen. Entsprechend formulierte FSMs können sowohl in Software auf Prozessoren als auch als eletronische Hardware aufgebaut werden. &lt;br /&gt;
&lt;br /&gt;
Die Beschreibung einer FSM ist auf mehrere Arten möglich. Zum einen kann sie in Form einer Tabelle beschrieben werden, aber auch eine graphische Darstellung der Zustände und deren Abhängigkeiten in Form eines Zustandsdiagramms ist möglich.&lt;br /&gt;
&lt;br /&gt;
==Darstellung von Zustandsautomaten==&lt;br /&gt;
&lt;br /&gt;
Zustandsautomaten haben den großen Charme, dass es meistens leicht möglich ist, ihre Funktion durch eine Grafik zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es ist eine FSM zu entwerfen, die eine Rollosteuerung übernimmt. Es gibt einen Motor, der sich in 3 Zuständen befinden kann: stop, rauf drehend, runter drehend. Außerdem gibt es Endschalter, welche betätigt werden, wenn das Rollo die jeweilige Endposition erreicht hat. Und es gibt 2 Taster &amp;quot;Up&amp;quot; und &amp;quot;Down&amp;quot; durch welche der Benutzer den Bewegungswunsch an die FSM weitergibt. Irgendwie weiß jeder, wie so eine Rollosteuerung funktioniert, und so recht und schlecht kann das auch jeder in der einen oder anderen Form beschreiben. Aber kann man das ganze auch so &#039;beschreiben&#039;, dass man im Vorfeld, vor der Programmierung tatsächlich alle Eventualitäten erfasst und so darstellt, dass auch ein Nicht-Informatiker die Funktionsweise versteht? Genau an dieser Stelle kommt die graphische Darstellung ins Spiel. &lt;br /&gt;
&lt;br /&gt;
Wie sieht nun eine derartige FSM aus? Jede Wolke im Bild sei ein Zustand, dem man einen Namen gibt. Die Pfeile zwischen den Wolken zeigen die Zustandsübergänge an, wobei am Pfeil vermerkt ist, unter welcher Bedingung dieser Übergang genommen werden kann (in Rot) und welche Aktionen dabei auszuführen sind (in Blau).&lt;br /&gt;
&lt;br /&gt;
[[Datei:StateRollo.jpg|center|framed|Zustandsautomat für eine Rollosteuerung]]&lt;br /&gt;
&lt;br /&gt;
Aus der Zeichnung ist ablesbar:&lt;br /&gt;
Befindet sich die Maschine im Zustand &amp;quot;unten&amp;quot; und wird die Taste &amp;quot;Up&amp;quot; gedrückt, dann folgt als Aktion, daß der Motor auf &amp;quot;rauf drehend&amp;quot; gestellt wird und gleichzeitig wechselt die Maschine in den Zustand &amp;quot;nach oben&amp;quot;. In diesem Zustand verbleibt die Maschine, während der Motor immer weiter dreht, bis der Endschalter meldet, dass das Rollo oben angekommen ist. Dies ist eine Möglichkeit wie die Maschine den Zustand &amp;quot;nach oben&amp;quot; verlassen kann. In diesem Fall wird dann der Motor abgeschaltet und die Maschine wechselt in den Zustand &amp;quot;oben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Man sieht hier schon, dass es mit so einer Grafik relativ einfach ist, sich von der korrekten Logik zu überzeugen. In einfachsten Fall legt man zur Simulation einfach einen Gegenstand in die betreffende Wolke, die den gerade aktiven Zustand symbolisiert. Danach geht man alle Möglichkeiten durch, wie diese Maschine von aussen (Taster, Schalter, etc) beeinflusst werden kann und sieht sich an, ob es dafür in der Grafik einen Pfeil gibt, der von der aktiven Wolke wegführt. Gibt es keinen, dann passiert auch nichts. Gibt es einen, dann verschiebt man den Gegenstand in die betreffende Wolke und führt (in Gedanken) die Aktion aus. Auf die Art kann man ganz leicht einige typische Benutzerszenarien durchspielen aber auch ausprobieren, ob man alle Eventualitäten berücksichtigt hat. Denn gerade diese Evantualitäten, an die man am Anfang gar nicht denkt, die sind es, die einem in weiterer Folge oft Probleme bereiten.&lt;br /&gt;
&lt;br /&gt;
Um bei der Rollosteuerung zu bleiben: Was soll denn passieren, wenn das Rollo gerade hochfährt und der Benutzer ein weiteres mal auf &amp;quot;Up&amp;quot; drückt? Oder wenn er auf &amp;quot;Down&amp;quot; drückt? In der Grafik ist ersichtlich, wie in diesem Fall zu verfahren ist. (Und Hand aufs Herz: Hätten Sie daran gedacht, dass diese Fälle zu berücksichtigen sind, als sie &#039;Rollosteuerung&#039; gelesen haben?)&lt;br /&gt;
&lt;br /&gt;
==Implementierungsvariationen==&lt;br /&gt;
&lt;br /&gt;
Der konkrete softwaremässige Aufbau einer FSM kann in weiten Grenzen variieren. Das grundlegende Konzept, Aktionen an Zustände zu knüpfen und logische Abläufe an die Abfolge von Zuständen zu binden, bleibt dabei in allen Fällen erhalten. Aber je nach Lust und Laune und dem Können des Programmierers gibt es viele unterschiedliche Möglichkeiten eine FSM zu implementieren. Ziel ist es dabei immer, die eigentliche Maschine, also das was in der Zustandstabelle ausgedrückt wird, so einfach und überschaubar wie möglich zu präsentieren. Sie implementiert die Logik und definiert was die Maschine eigentlich macht und warum sie es macht. Ein einfacher Ansatz ist die Verwendung des C-Konstukts switch, in der in jedem case-zweig die einzelnen Zustände kodiert werden. Es ist aber auch durchaus möglich eine universelle FSM zu bauen, bei denen eine generische Funktion die Tabelle in Arrayform bekommt und zusammen mit einigen globalen Variablen die Maschine implementiert. Oft wird auch eine Statemaschine dadurch gebaut, indem das zentrale switch-case Konstukt der Sprache [C] durch einen einzelnen [[Funktionszeiger in C | Funktionszeiger]] ersetzt wird und jeder Zustand nichts anderes als eine Funktion ist. Der Übergang von einem Zustand in einen anderen Zustand ist dann nichts anderes als das Zuweisen einer Funktion an diesen Funktionszeiger. Oder aber man kombiniert Tabelle und Funktionszeiger in ein gemeinsames Konzept.&lt;br /&gt;
&lt;br /&gt;
==Grundlegender Aufbau==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird eine FSM in Software verwirklicht, welche die Ampelsteuerung einer Kreuzung übernimmt.&lt;br /&gt;
[[Bild:Statemachine_Kreuzung.png|center|framed|Ampeln an einer Kreuzung]]&lt;br /&gt;
&lt;br /&gt;
Die Abfolge der Lichtzeichen einer einzelnen Ampel ist dabei&lt;br /&gt;
&amp;lt;br&amp;gt;[[Bild:Statemachine_Ampel.png|center|framed|Zustände einer einzelnen Ampel]]&lt;br /&gt;
&lt;br /&gt;
Die komplette Lichtfolge aller Ampeln in der Kreuzung stellt sich dann wie folgt dar: Es ist dabei ausreichend, nur Ampel 1 und Ampel 2 zu betrachten, da Ampel 3 bzw. Ampel 4 die jeweils gleichen Lichtsignale anzeigen. Dies muss nicht immer so sein! Auf einer Kreuzung kann es durchaus für eine Fahrtrichtung Zusatzampeln geben, die die Lichtfolge der Hauptampel modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:15em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| nächster&amp;lt;br&amp;gt;Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustandsnummer ist in diesem Fall einfach die Taktung der FSM. Verfolgt man die Zustände von einem Zustand zum nächsten, dann kann man sich sehr leicht davon überzeugen, daß die Lichtfolge der beiden Ampeln tatsächlich der gewünschten Abfolge entspricht.&lt;br /&gt;
&lt;br /&gt;
Hat man die Funktionalität einer FSM erst mal soweit in Tabellenform festgelegt, dann ist es sehr einfach daraus ein Programm in einer Programmiersprache wie z.B. C abzuleiten, welches diese Statemachine implementiert.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man dabei folgenden Aufbau vornehmen:&lt;br /&gt;
* Es gibt eine globale Variable, die den aktuellen Zustand der Maschine repräsentiert. Die Zustände wurden in obiger Tabelle bereits durchnummeriert, so dass es sich anbietet, Zustände innerhalb der Maschine durch ebendiese Zahlen darzustellen.&lt;br /&gt;
* Die FSM wird als Funktion implementiert, die für jeden einzelnen Takt aufgerufen wird.&lt;br /&gt;
* Jeder Zustand wird innerhalb der Funktion durch einen case innerhalb einer  switch Anweisung dargestellt.&lt;br /&gt;
* Jeder Zustand kann vor verlassen der Funktion den aktuellen Zustand der FSM beim nächsten Aufruf der Funktion festlegen, indem er an die globale Variable die Nummer des nächsten Zustands zuweist.&lt;br /&gt;
* Jegliche Form von Warteschleifen innerhalb der FSM sind verboten. Wenn die FSM auf ein Ereignis warten müsste, dann ist dafür ein eigener Zustand vorzusehen, der auf das Eintreten des Ereignisses prüft und nur dann den nächsten Zustand auswählt, wenn das Ereignis tatsächlich eingetreten ist. Damit erreicht man [[Multitasking]].&lt;br /&gt;
* Es ist sinnvoll, den Ampelfarben Namen in Form eines #define oder enums zu geben, damit wird das Konstrukt deutlich leichter lesbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );  // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );  // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
&lt;br /&gt;
unsigned char state = 1;   // globale Variable, die den Status repräsentiert&lt;br /&gt;
&lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      state = 2;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = 3;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 4;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 4:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 5;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 5:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 6;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 6:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 7;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 7:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 8;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 8:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = 1;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    stateMachine();&lt;br /&gt;
    delay_ms( 1000 );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird diese Funktion im Sekundentakt aufgerufen, so werden die Funktionen Ampel1() bzw. Ampel2() mit der jeweils richtigen Lichtstellung in der richtigen Reihenfolge aufgerufen um die Lichtwechsel der Ampeln einer Kreuzung zu realisieren. Der Einfachheit halber wird in diesem Beispiel die Funktion delay_ms() verwendet. Praktisch wird man in den meisten Fällen besser einen [[Timer]] benutzen, um die Statemachine periodisch aufzurufen. Wie das geht und was das für Vorteile hat ist im Artikel [[Multitasking#Verbesserter Ansatz mit Timer | Multitasking]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Reaktionen auf äußere Ereignisse==&lt;br /&gt;
&lt;br /&gt;
Obige Statemaschine ist noch sehr primitiv. Angenommen an dieser Ampelkreuzung gibt es eine Induktionsschleife. Diese sei derartig geschaltet, dass die Hauptrichtung über Ampel2/Ampel4 ständig Grün zeigt und nur bei Annäherung eines Fahrzeugs auf der Strecke Ampel1/Ampel3 wird ein Lichtwechselzyklus durchgeführt, um diesem Fahrzeug die geordnete Durchfahrt zu ermöglichen. Die Statemaschine muss daher auf ein äußeres Ereignis reagieren können. Der Übergang von Zustand 1 in Zustand 2 ist von diesem Ereignis abhängig. Nur wenn es auftritt wird dieser Übergang durchgeführt, ansonsten verbleibt die Maschine im Zustand 1. Die Beschreibung der FSM wird also um einen weiteren Tabelleneintrag ergänzt, in dem festgehalten wird, wie mit dem zusätzlichen Eingang verfahren werden soll. In dieserm erweiterten Beispiel sollen die Zustände mit einem aussagekräftigen Namen versehen werden, denn Menschen sind sehr schlecht im Umgang mit abstrakten Zahlen, sie sind viel besser mit Wörtern vertraut. Die x in der Tabellenspalte &amp;quot;Induktionsschleife&amp;quot; besagen, daß dieses Eingangsignal für die Entscheidungen der Statemaschine keine Rolle spielt (engl. don&#039;t care).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:50em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!| Zustand ||| Name ||| Ampel 1 || | Ampel 2 ||  Induktionsschleife || | nächster&amp;lt;br&amp;gt;Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || OSTWEST_GRUEN      || rot     ||  grün      || ==1 ? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || OSTWEST_GELB       || rot     ||  gelb      || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || ALLE_ROT_1         || rot     ||  rot       || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || NORDSUED_ROTGELB   ||rot/gelb ||  rot       || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || NORDSUED_GRUEN     || grün    ||  rot       || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || NORDSUED_GELB      || gelb    ||  rot       || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || ALLE_ROT_2         || rot     ||  rot       || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || OSTWEST_ROTGELB    || rot     ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB, ALLE_ROT_2} state_t ;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLE_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLE_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Warteschleifen==&lt;br /&gt;
&lt;br /&gt;
Das Warten auf ein äußeres Ereignis kann mit dem Verzweigen oder auch nicht Verzweigen in einen anderen Zustand realisiert werden. In obiger Statemaschine soll z.B. die Grünphase der Ampel1 von einem Takt auf 5 Takte angehoben werden. Grundfalsch wäre es, dies jetzt mit einer while-Schleife im Zustand 5 zu realisieren. Warten wird immer über zusätzliche Zustände realisiert. Eine Statemaschine darf innerhalb eines Zustands niemals auf etwas warten, sondern muss so schnell als möglich die Kontrolle wieder abgeben. Geht man naiv an die Sache ran, dann könnte man die 5 Takte über die Einführung von zusätzlichen Zuständen leicht erreichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:35em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| Induktions-&amp;lt;br&amp;gt;schleife ||width=&amp;quot;20%&amp;quot;| nächster&amp;lt;br&amp;gt;Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || grün ||  rot  || x || 10&lt;br /&gt;
|-&lt;br /&gt;
| 10 || grün ||  rot  || x || 11&lt;br /&gt;
|-&lt;br /&gt;
| 11 || grün ||  rot  || x || 12&lt;br /&gt;
|-&lt;br /&gt;
| 12 || grün ||  rot  || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daß ein derartiges Vorgehen bei längeren Wartezeiten oder gar bei berechneter Wartezeitdauer nicht praktikabel ist, dürfte auf der Hand liegen. Besser ist daher die Einführung eines internen Zählers sowie nur eines einzigen, neuen Wartezustands. Beginnt die Wartezeit wird der Zähler auf einen Wert entsprechend der Wartezeit gestellt. Im neuen Zustand wird der Zähler um 1 verringert und nur dann, wenn der Zähler 0 erreicht hat, wird in den ursprünglichen Folgezustand gewechselt. Der Zähler kann also in ähnlicher Form wie die Induktionsschleife als Ereignislieferant aufgefasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|width:40em; text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! width=&amp;quot;17%&amp;quot; | Zustand&lt;br /&gt;
! width=&amp;quot;17%&amp;quot; | Ampel 1&lt;br /&gt;
! width=&amp;quot;17%&amp;quot; | Ampel 2&lt;br /&gt;
! width=&amp;quot;20%&amp;quot; | Induktions-&amp;lt;br&amp;gt;schleife&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Wartezeit&lt;br /&gt;
! nächster&amp;lt;br&amp;gt;Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1 ? || x || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x || x || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || =4 || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || x ||  x  || x || dec / ==0 ? || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB,&lt;br /&gt;
               ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB,&lt;br /&gt;
               ALLE_ROT_2, WARTE_NORDSUED}  state_t;&lt;br /&gt;
 &lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
unsigned char zaehler;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLES_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      zaehler = 4;&lt;br /&gt;
      state = WARTE_NORDSUED;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case WARTE_NORDSUED:&lt;br /&gt;
      zaehler = zaehler - 1;&lt;br /&gt;
      if( zaehler == 0 )&lt;br /&gt;
        state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Tabellenform ==&lt;br /&gt;
&lt;br /&gt;
Im letzten Beispiel wollen wir die Ampelsteuerung noch etwas realistischer gestalten. Denn die einzelnen Phasen sind unterschiedlich lang, der Zustand Gelb ist deutlich kürzer als der Zustand Grün. Wenn wir also in fast jedem Zustand eine bestimmte Anzahl Takte warten wollen, erscheint es nicht sinnvoll, dafür jedesmal einen neuen Zustand anzuspringen. Sinnvoller ist die Integration des Wartens direkt in den Zustand, so wie im vorherigen Beispiel der Zustand &amp;quot;WARTE_NORDSUED&amp;quot;. Dabei fallen jedoch zwei Sachen auf.&lt;br /&gt;
&lt;br /&gt;
* In jedem Zustand muss die Wartezeit des &#039;&#039;nächsten&#039;&#039; Zustands zugewiesen werden. Das ist etwas verwirrend.&lt;br /&gt;
* Fast alle Anweisungen sind gleich in den Zuständen, nur die Zahlen und der Wert für den nächsten Zustand ändern sich.&lt;br /&gt;
&lt;br /&gt;
Darum soll hier die FSM von einer großen switch Anweisung auf eine Tabelle geändert werden. Das hat den Vorteil, dass die Zustandstabelle nahezu 1:1 in den Quelltext geschrieben werden kann und sie so sehr kompakt und übersichtlich ist. Die eigentliche FSM wird sehr klein und arbeitet sich durch die Tabelle durch. Zur weiteren Verbesserung der Lesbarkeit (siehe [[Strukturierte Programmierung auf Mikrocontrollern]]) nutzen wir einen Struct, welche den Zustand der State machine mit sinnvollen Variablennamen beschreibt. Bei dieser Methode muss man beachten, dass die Reihenfolge der Zustände in der enum Definition gleich sein muss mit der Reihenfolge der Zustände in der Tabelle, sonst funktioniert es nicht. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define GRUEN     2&lt;br /&gt;
#define GELB      4&lt;br /&gt;
#define ROTGELB   5&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
int Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
 &lt;br /&gt;
typedef enum { OSTWEST_GRUEN=0, OSTWEST_GELB, ALLE_ROT_1,&lt;br /&gt;
               NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_2,&lt;br /&gt;
               OSTWEST_ROTGELB }  state_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int Ampel1;&lt;br /&gt;
    int Ampel2;&lt;br /&gt;
    int I_Schleife;&lt;br /&gt;
    int Wartezeit;&lt;br /&gt;
    int Naechster;&lt;br /&gt;
} ampel_state_t;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
int zaehler=1;&lt;br /&gt;
 &lt;br /&gt;
// Tabelle fuer state machine&lt;br /&gt;
 &lt;br /&gt;
ampel_state_t state_table[8] = {&lt;br /&gt;
 &lt;br /&gt;
// AMPEL1 AMPEL2   Induktionsschleife ? &lt;br /&gt;
// |         |       |   Wartezeit in s&lt;br /&gt;
// |         |       |   |&lt;br /&gt;
// |         |       |   |   naechster Zustand     Name&lt;br /&gt;
//----------------------------------------------------------------------&lt;br /&gt;
{ROT     , GRUEN   , 1, 10,  OSTWEST_GELB},        // OSTWEST_GRUEN&lt;br /&gt;
{ROT     , GELB    , 0,  1,  ALLE_ROT_1},          // OSTWEST_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  NORDSUED_ROTGELB},    // ALLE_ROT_1&lt;br /&gt;
{ROTGELB , ROT     , 0,  1,  NORDSUED_GRUEN},      // NORDSUED_ROTGELB&lt;br /&gt;
{GRUEN   , ROT     , 0, 10,  NORDSUED_GELB},       // NORDSUED_GRUEN&lt;br /&gt;
{GELB    , ROT     , 0,  1,  ALLE_ROT_2},          // NORDSUED_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  OSTWEST_ROTGELB},     // ALLE_ROT_2&lt;br /&gt;
{ROT     , ROTGELB , 0,  1,  OSTWEST_GRUEN}};      // OSTWEST_ROTGELB&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
    Ampel1(state_table[state].Ampel1);&lt;br /&gt;
    Ampel2(state_table[state].Ampel2);&lt;br /&gt;
 &lt;br /&gt;
    if (zaehler&amp;gt;0) {&lt;br /&gt;
        zaehler--;    &lt;br /&gt;
    } else {&lt;br /&gt;
        if ( ((state_table[state].I_Schleife == 1) &amp;amp;&amp;amp; Induktionsschleife() ) ||&lt;br /&gt;
             (state_table[state].I_Schleife == 0) )&lt;br /&gt;
        {&lt;br /&gt;
            state =   state_table[state].Naechster;&lt;br /&gt;
            zaehler = state_table[state].Wartezeit;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierung einer objektorientierten Finite State Machine in C++==&lt;br /&gt;
&lt;br /&gt;
* Notation von Endlichen Automaten in UML&lt;br /&gt;
* Praktisches Beispiel, anhand dessen die Funktionsweise eines Toasters erklärt wird. Dazu wird die Notation in UML verwendet. &lt;br /&gt;
* Implementation des Beispiels in C++ auf einem AVR-Controller&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Möglichkeit bzw. das Beispiel sollte als Denkanstoss verstanden werden und nicht als Referenzimplementation. Es wurden bewusst bestimmte Feinheiten von endlichen Automaten verzichtet, um das Beispiel auf gut verständlichem Niveau zu halten. &lt;br /&gt;
&lt;br /&gt;
* Dokumentation im PDF Format [http://www.mikrocontroller.net/attachment/137066/ImplementierungEinerFiniteStateMachine_V1.1.pdf ImplementierungEinerFiniteStateMachine_V1.1.pdf]&lt;br /&gt;
* LaTeX Source der Dokumentation [http://www.mikrocontroller.net/attachment/137067/Dokumentation_Source_V1.1.zip Dokumentation_Source_V1.1.zip]&lt;br /&gt;
* Beispielcode für AVR-Studio 4 [http://www.mikrocontroller.net/attachment/135434/AVR_Beispiel_Source.zip AVR_Beispiel_Source.zip]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/248837#2556592 Forumsbeitrag]: Eine objektorientierte State Machine in C++&lt;br /&gt;
&lt;br /&gt;
== Grafische Modellierung einer Finite State Machine ==&lt;br /&gt;
Das Open Source Werkzeug Yakindu Statechart Tools (http://www.statecharts.org) ermöglicht es Zustandsautomaten grafisch zu modellieren, deren Verhalten zu simulieren und Code für verschiedene Sprachen (C/C++, Java) zu generieren.&lt;br /&gt;
Die grafischen Modellelemente entsprechen denen der UML2 und werden durch eine einfache und zweckmäßige Expression-Language ergänzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfaches Ampel Modell&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Modell einer einfachen Ampel wie oben beschrieben sieht in Yakindu SCT wie folgt aus: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1.jpg|center|framed|Einfaches Ampel Modell]]&lt;br /&gt;
&lt;br /&gt;
Wie erwartet hat die Ampel vier Zustände, die wiederum mit Übergangs-Pfeilen (Transitionen) verbunden sind. Jede Transition verfügt über einen Auslöser, in diesem Fall mit dem Namen &#039;&#039;tick&#039;&#039;    &lt;br /&gt;
Mit Hilfe der Yakindu DSL wird im linken Teil des Editors ein internes Event mit dem Name &amp;quot;tick&amp;quot; definiert, das entsprechend der Taktung des Zustandsautomaten &amp;quot;gefeuert&amp;quot; werden soll. Der Ausdruck &#039;&#039;every 1s / raise tick&#039;&#039; sorgt dafür, dass das Event &#039;&#039;tick&#039;&#039; jede Sekunde einmal gefeuert wird.&lt;br /&gt;
Da Yakindu SCT es erlaubt Zustandsautomaten zu simulieren, ist es jederzeit überprüfbar ob das modellierte Verhalten den Erwartungen entspricht. Über &#039;&#039;Run as... --&amp;gt; YAKINDU Statechart&#039;&#039; lässt sich in die &#039;&#039;Simulation View&#039;&#039; wechseln. Der jeweils aktive Zustand wird nun rot hinterlegt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1b.jpg|center|framed|Simulation View]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfache Kreuzung mit Zwei Ampel-Gruppen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im zweiten Beispiel soll eine einfache Ampelkreuzung modelliert werden. Es wird davon ausgegangen, dass die Ampeln in zwei Gruppen geschaltet werden. Ampel 1 und 3 bilden die nord_süd – Gruppe, während die übrigen Ampeln die ost-west – Gruppe bilden. Der Einfachheit halber werden Ampeln einer Gruppe immer gleich geschaltet. Wie oben darf eine Ampel-Gruppe nur dann den Zustand &#039;&#039;rot&#039;&#039; verlassen, wenn die jeweils andere Gruppe sich im Zustand &#039;&#039;rot&#039;&#039; befindet. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel2.jpg|800px|center|Ampelkreuzung]]&lt;br /&gt;
&lt;br /&gt;
Im Yakindu SCT Modell gibt es nun für jede Ampel-Gruppe eine eigene Region. Wird der Zustandsautomat betreten so wird nun parallel der Zustand &#039;&#039;rot&#039;&#039; in der &#039;&#039;nord_sued&#039;&#039; Region und der Zustand &#039;&#039;gruen&#039;&#039; in der &#039;&#039;ost_west&#039;&#039; Region aktiv. Wie bereits im ersten Beispiel wird der Zustandsautomat über das &#039;&#039;tick&#039;&#039; Ereignis angetrieben, das jede Sekunde einmal auftritt. &lt;br /&gt;
Um das gewünschte Ampel-Verhalten zu modellieren wird nun die Transition von &#039;&#039;rot&#039;&#039; zu &#039;&#039;rot-gelb&#039;&#039; mit einem &#039;&#039;Guard&#039;&#039;, also einer Bedingung geschützt. Zwar wird der Übergang weiterhin mit dem Ereignis &#039;&#039;tick&#039;&#039; angestoßen, allerdings wird der Übergang nur ausgeführt wenn die in eckigen Klammern formulierte Boolesche-Bedingung erfüllt ist. Die Funktion &#039;&#039;active()&#039;&#039; gehört zu den Bordmitteln von Yakindu SCT und prüft ob ein bestimmter Zustand aktiv ist. In diesem Beispiel kann in der Region &#039;&#039;nord_sued&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; nur verlassen werden, wenn in der Region &#039;&#039;ost-west&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; aktiv ist. Wie auch im vorhergegangenen Beispiel lässt sich das Verhalten simulieren, so das überprüft werden kann ob das Verhalten den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ampel mit Induktionsschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Verhalten der Ampelanlage aus Beispiel 2 soll um eine Induktionsschleife erweitert werden. Der Verkehr an der Ampelanlage fließt normalerweise in &#039;&#039;ost_west&#039;&#039; – Richtung, daher die Ampel in dieser Richtung immer den Zustand &#039;&#039;grün&#039;&#039; haben, es sei denn die Induktionsschleife in &#039;&#039;nord-süd&#039;&#039; - Richtung wird ausgelöst.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel3.jpg|800px|center|Ampelkreuzung mit Induktionsschleife]]&lt;br /&gt;
&lt;br /&gt;
Um dieses Verhalten in das SCT-Modell zu integrieren muss zunächst ein neues Ereignis definiert werden. Dieses Ereignis wird als Teil des &#039;&#039;Interface-Scopes&#039;&#039; definiert, da es außerhalb des Zustandsautomaten erzeugt werden soll. Ereignisse die Teil einer externen Schnittstelle sind werden mit einer Richtung (in / out) deklariert, die angibt ob das Ereignis den Zustandsautomat betritt, oder verlässt. &lt;br /&gt;
&lt;br /&gt;
Nach dem das neue Ereignis definiert ist,  muss nur noch der Auslöser für den Übergang von &#039;&#039;gruen&#039;&#039; zu &#039;&#039;gelb&#039;&#039; geändert werden. Statt wie bisher durch das &#039;&#039;tick&#039;&#039; Event, wird nun das &#039;&#039;induktionsSignal&#039;&#039; als Auslöser verwendet. In der Simulations-Ansicht kann das neue Ereignis manuell mit einem Klick ausgelöst werden, so dass das korrekte Verhalten wieder getestet werden kann.   &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_simView.jpg|center|framed|Induktionsschleife auslösen]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warteschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es soll die Grün-Phase verlängert werden, so dass erst nach dem 5. &#039;&#039;tick&#039;&#039; der Übergang in den &#039;&#039;gelb&#039;&#039; Zustand erfolgt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct beispiel4.jpg|800px|center|Ampelkreuzung mit Warteschleife]]&lt;br /&gt;
&lt;br /&gt;
Um eine Warteschleife zu realisieren wird dem &#039;&#039;Internal-Scope&#039;&#039; zuerst eine neue Variable hinzugefügt. Da während des Wartens der &#039;&#039;grün&#039;&#039; Zustand nicht verlassen wird, lässt sich das Herunterzählen der Wartezeit mittels eines zusammengesetzten Zustands darstellen. Wird der Zustand &#039;&#039;grün&#039;&#039; betreten, wird zunächst einen Eintritts-Aktion ausgeführt, die den Wert von &#039;&#039;wartezeit&#039;&#039; auf 5 setzt. Außerdem wird ebenfalls der Zustand &#039;&#039;Warten&#039;&#039; aktiv. Erfolgt nun ein &#039;&#039;tick&#039;&#039; wird ohne &#039;&#039;grün&#039;&#039; zu verlassen in &#039;&#039;WartezeitVerringern&#039;&#039; gewechselt und der Wert von &#039;&#039;wartezeit&#039;&#039; um 1 verringert. &lt;br /&gt;
Der Übergang zu &#039;&#039;gelb&#039;&#039; ist wieder durch einen Guard geschützt und kann nur erfolgen wenn die  Bedingung &#039;&#039;wartezeit == 0&#039;&#039; erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Code aus dem Modell generieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um nun Code aus dem Modell zu generieren muss zuerst eine GeneratorModel-Datei erzeugt werden, in der unter anderem die Ziel-Sprache angegeben wird.&lt;br /&gt;
Um den Zustandsautomaten abzubilden verwendet die konkrete Implementierung ein &#039;&#039;switch case&#039;&#039; Konstrukt, das dem oben Gezeigten ähnelt. Außerdem wurde ein &#039;&#039;code-only&#039;&#039; Ansatz verfolgt, so dass keine externen Bibliotheken oder Frameworks benötigt werden. Das komplette Eclipse Projekt kann [http://statecharts.org/Examples/ampel.zip hier] runtergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Realisation von FSMs in Hardware ==&lt;br /&gt;
=== Aufbau einer FSM in digitalen Chips ===&lt;br /&gt;
&lt;br /&gt;
Sollen sehr schnelle Steuerungen und Entscheider aufgebaut werden, wurden und werden digitale Bausteine mit Logikgattern verdrahtet, die steuerbare Zähler enthalten. Damit lassen sich effektive Taktgeschwindigkeiten im Bereich von mehreren MHz erreichen, die in Sicherheitsbereichen eingesetzt werden. Oft werden solche Schaltungen auch zur Überwachung von anderen Schaltungsteilen eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Früher wurden fast alle logischen Schaltungen auf diese Weise entworfen, z.B. auch die ersten Computer von IBM.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung von FSMs in programmierbarer Hardware ===&lt;br /&gt;
&lt;br /&gt;
Da heute digitale Hardware vielfach in Form von programmierter PLD- und [[FPGA]]-Bausteine realisiert ist, gleicht der Entwurfsprozess der FSMs dem in der klassischen Softwareentwicklung. Dabei besteht je nach Vorliegen der funktionellen Beschreibung und anderer Randbedingungen die Möglichkeit, ein Abbild der digitalen Schaltung in VHDL zu formulieren und zu importieren, bzw. ein klassisches state diagram neu zu entwerfen oder die Zustandswechsel in Tabellenform zu importieren und das Erzeugerwerkzeug die FSM generieren zu lassen, was besonders bei umfangreichen FMSs praktiziert wird.&lt;br /&gt;
&lt;br /&gt;
Letztendlich kann in Hardware jede sequentielle Logikschaltung, welche [[FlipFlop]]s und Dekoder enthält als FSM betrachtet werden, egal ob es ein einfaches Schieberegister oder eine komplexe ALU einer CPU ist. Die einfachste, denkbare FSM ist ein Toggle-FlipFlop, welches mit jedem Takt seinen Ausgangszustand wechselt.&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsvergleich ==&lt;br /&gt;
*In Software realisierte state machines erreichen unter C++ auf Windows-PCs trotz hoher Prozessorleistung selten niedrigere Reaktionszeiten als im Millisekundenbereich. Die damit in Echtzeit erfassbaren und prozessierbaren externen Ereignisse bewegen sich üblicherweise im Bereich von einigen 100Hz. Ein Extrembeispiel ist der USB-3.0-Bus im Zusammenspiel mit HW-IO-Karten: Die Bandbreite lässt ein Laden von real über 3Gbit im streaming mode zu, während im Regelungsbetrieb in der Schleife typische Latenzen von bis zu 10ms auftreten, bis die Reaktion der PC-SW auf eine äußeree Signaländerung auch ausgegeben wurde.&lt;br /&gt;
*Mit einem Echtzeitbetriebsssystem auf einem PC, z. B. Linux mit Preempt-RT Patch, werden ungefähr 35 µs Zykluszeit erreicht, also circa 30 kHz. Trotz des stark verbesserten Treiberssystems unter Linux sind auf PCs auch hier mehrere Millisekunden Latenz zu beobachten.&lt;br /&gt;
*Mit Microcontrollern und DSPs erreicht man mit Nicht-Multi-tasking-FSMs Abtastraten bis einige 100kHz. Unter ASM programmierte Signalprozessoren erreichen Abtastraten bis hin zu 20% ihrer Taktfrequenz, wenn sie direkt auf externe Port-Pins zugreifen.&lt;br /&gt;
*In VHDL realisierte state machines besitzen je nach FPGA-Familie, Art der Codierung typische Taktfrequenzen von bis zu 400MHz. Je nach Zyklustiefe laufen damit realisierte FSMs auf bis zu 100MHz und anders als bei DSPs und PCs senkt die Hinzunahme weiterer FMSs nicht deren Loop-Frequenz.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.aqdi.com/state.htm Using State Machines In Your Designs] (C) 2003 Hank Wallace&lt;br /&gt;
* [http://qfsm.sourceforge.net/ Qfsm] - A graphical tool for designing finite state machines (GPL)&lt;br /&gt;
* [https://www.itemis.com/en/yakindu/statechart-tools/ YAKINDU Statechart Tools] Ein Werkzeug zum Modellieren und Simulieren von Statecharts sowie Code-Generatoren für Java, C und C++. &lt;br /&gt;
* [http://www.sinelabore.com www.sinelabore.com] Ein Werkzeug das aus UML State Machines C-Code speziell für eingebettete Systeme erzeugt.&lt;br /&gt;
* [http://smc.sourceforge.net SMC The State Machine Compiler]&lt;br /&gt;
* [http://block-net.de/Programmierung/cpp/fsm/fsm.html C/C++ event driven FSM] Open source Werkzeug zur Generierung von C++ FSM Code und UML Diagramm mittels Transitionstabelle. &lt;br /&gt;
* http://astade.tigris.org/ -&amp;gt; http://wiki.astade.de/dokuwiki/doku.php (https://www.mikrocontroller.net/search?query=astade)&lt;br /&gt;
* [http://stefanfrings.de/multithreading_arduino/index.html Multithreading in C und Arduino] von Stefan Frings&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED&amp;diff=104685</id>
		<title>LED</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED&amp;diff=104685"/>
		<updated>2021-09-06T06:46:31Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung == &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ledrgb.jpg|thumb|right|246px|Detailfoto einer RGB-LED [http://www.mikrocontroller.net/topic/109784#990685]]]&lt;br /&gt;
&lt;br /&gt;
Eine LED (engl. &amp;lt;B&amp;gt;L&amp;lt;/B&amp;gt;ight &amp;lt;B&amp;gt;E&amp;lt;/B&amp;gt;mitting &amp;lt;B&amp;gt;D&amp;lt;/B&amp;gt;iode, &#039;&#039;Leuchtdiode&#039;&#039;) besteht aus einem [[Halbleiter]]-PN-Übergang, der durch seine Zusammensetzung Licht eines stark begrenzten Wellenbereiches emittiert, wenn er in Durchlassrichtung von Strom durchflossen wird. Die Helligkeit einer LED ist in erster Näherung proportional zum Strom.&lt;br /&gt;
&lt;br /&gt;
Die Farbe des emittierten Lichts hängt vom verwendeten Halbleitermaterial ab. Es existieren [[Halbleiter | Halbleitermaterialien]] für den gesamten sichtbaren Bereich als auch für den Infrarotbereich und den nahen Ultraviolettbereich. Für kurze Wellenlängen (Blau bis Ultraviolett) ist ein Halbleitermaterial wie z.&amp;amp;nbsp;B. GaN oder InGaN erforderlich (UV &amp;lt; 365nm: AlN). Für die ersten blauen LEDs wurde SiC verwendet, welches aber eine schlechte Effizienz aufweist. (Quelle:Wikipedia).&lt;br /&gt;
&lt;br /&gt;
Weißes Licht oder andere Farbmischungen können erzeugt werden, indem man eine Blau- oder Ultraviolett-LED mit einem Phosphormaterial (weiß: mit Cer dotiertes YAG) beschichtet, welches durch das Licht der LED zur Emission angeregt wird. Die entstehende Farbe wird dabei von der Beschichtung bestimmt.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Flußspannung ==&lt;br /&gt;
&lt;br /&gt;
LEDs haben im Vergleich zu gewöhnlichen [[Diode|Dioden]] eine vergleichsweise hohe, vom Halbleitermaterial abhängige [[Durchlass-Spannung | Flußspannung]]. Bevor diese erreicht wird, fließt nur sehr wenig Strom und die LED leuchtet praktisch nicht. Oberhalb der Flußspannung steigt der Strom schnell an (Diodenkennlinie). Die Flußspannung reicht von ca. 1,2 V bei Infrarot-LEDs bis zu etwa 4 V bei Ultraviolett-LEDs. Auffällig ist die Korrelation zwischen Spannung und der Farbe, die damit zusammenhängt, dass die Emission höherenergetischer Photonen einen größeren Bandabstand (Energiedifferenz) im Halbleitermaterial erfordert, welcher von den Elektronen überwunden werden muss, wenn sie ihre Energie abgegeben. Da anfänglich nur Halbleiter mit geringem Bandabstand produziert wurden und aufgrund von mangelnder Reinheit oft Zwischenniveaurekombination stattfand, waren lange Zeit keine blauen oder gar echte violette LEDs herstellbar. Die ersten verfügbaren LEDs waren naturgemäß auch rot.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:14em; text-align:center&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Flußspannung von LEDs&lt;br /&gt;
|-&lt;br /&gt;
! Farbe || &amp;lt;math&amp;gt;U_F&amp;lt;/math&amp;gt; [V]&lt;br /&gt;
|-&lt;br /&gt;
| Infrarot || 1,2&lt;br /&gt;
|-&lt;br /&gt;
| Rot || 1,8&lt;br /&gt;
|-&lt;br /&gt;
| Gelb || 2,0&lt;br /&gt;
|-&lt;br /&gt;
| Grün || 2,2&lt;br /&gt;
|-&lt;br /&gt;
| Grün&amp;lt;br&amp;gt;(Ultrahell) || 3,3&lt;br /&gt;
|-&lt;br /&gt;
| Blau || 3,6&lt;br /&gt;
|-&lt;br /&gt;
| Weiß || 3,6&lt;br /&gt;
|-&lt;br /&gt;
| Ultraviolett || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Durchlassstrom == &lt;br /&gt;
&lt;br /&gt;
Da LEDs durch einen zu hohen Strom zerstört werden, muss der Strom begrenzt werden. Ein direkter Betrieb an einer Konstantspannung, wie sie bei Glühlampen üblich ist, ist hier nicht sinnvoll. Eine Standard-LED zur Anzeige (THT 3 oder 5mm sowie SMD 0603-1206) wird üblicherweise mit 20 mA betrieben. Moderne LEDs kommen häufig mit sehr viel weniger Strom aus. So benötigt eine Low-Current LED nur 2 mA um sehr hell zu leuchten. In der Praxis werden LEDs oft mit einem weit geringeren als dem maximal zulässigen Durchlassstrom betrieben. Insbesondere im Entwicklungs- und Experimentierumfeld kann eine für maximal 20 mA ausgelegte LED auch mit lediglich 3-5 mA betrieben werden. Der subjektiv wahrgenommene Helligkeitsverlust ist deutlich geringer, als der prozentuale Unterschied der Stromstärke vermuten lässt, siehe Artikel [[LED-Fading]]. Leistungs-LEDs zur Beleuchtung werden mit typisch 100mA(0,33W), 350mA (1W) bzw. 1000mA (3W) betrieben. Nach oben sind kaum Grenzen gesetzt, bis hin zu LED-Matritzen mit 100W und mehr.&lt;br /&gt;
&lt;br /&gt;
=== Warum benötigt man einen Vorwiderstand? ===&lt;br /&gt;
&lt;br /&gt;
Diese Frage wird seit langer Zeit immer wieder gestellt.&lt;br /&gt;
&lt;br /&gt;
Die [https://www.mikrocontroller.net/attachment/151822/LED-Kennlinien.png Kennlinie] einer LED ist stark nichtlinear. Unterhalb der Flußspannung fließt fast kein Strom und die LED leuchtet kaum. Oberhalb der Flußspannung steigt der Stromfluß schon bei kleinen Spannungsänderungen stark an. In der Praxis müsste man nun die Spannung für jede einzelne LED exakt einstellen, um den exakten Strom zu treffen und auch zu halten. Das kann und will man aber nicht. Außerdem unterliegt die Flußspannung sowohl einer Fertigungstoleranz als auch einer negativen Temperaturdrift, d.h. bei höherer Temperatur (Umgebung oder Eigenerwärmung) sinkt die Flußspannung. Alle diese Effekte kann man problemlos mit einem Vorwiderstand soweit abschwächen, dass sie praktisch keine große Rolle mehr spielen, ganz ohne präzise Spannungseinstellung.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel. In diesem [https://www.mikrocontroller.net/attachment/151822/LED-Kennlinien.png Bild] ist die Kennlinie einer grünen LED mit und ohne Vorwiderstand dargestellt. Die Flußspannung beträgt ca. 2,2V bei 10mA LED-Strom. Wenn man jetzt exakt 2,05V anlegt, fließen 6mA (blaue Kurve). Schwankt jetzt aber die angelegte Spannung um +/-0,2V (10%), dann schwankt der Strom um +14/-5mA! Ganz anders mit Vorwiderstand. Man braucht eine höhere Spannung, hier beispielsweise 4V, wobei auch 6mA fließen (rosa Kurve). Schwankt diese nun um +/-0,4V (10%), schwankt der Strom nur um +/-1mA. Das ist deutlich stabiler!&lt;br /&gt;
&lt;br /&gt;
=== Vorwiderstand ===&lt;br /&gt;
&lt;br /&gt;
Im einfachsten Fall und bei relativ geringfügig variierender Betriebsspannung kann man dazu einen Widerstand einsetzen.&lt;br /&gt;
&lt;br /&gt;
[[bild:led_rv.png|right]]&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_V=\frac{Vcc-U_\text{LED}}{I_\text{LED}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand in Ohm&lt;br /&gt;
* Vcc: Betriebsspannung in Volt&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{LED}&amp;lt;/math&amp;gt;: Durchlassspannung der LED in Volt&lt;br /&gt;
* &amp;lt;math&amp;gt;I_{LED}&amp;lt;/math&amp;gt;: Strom durch die LED in Ampere&lt;br /&gt;
&lt;br /&gt;
Bei 6 V Betriebsspannung, einer Durchlassspannung der LED von 2,4 V und einem gewünschten Strom von 20 mA braucht man nach dem ohmschen Gesetz einen Widerstand von 180Ω, bei 12 V Betriebsspannung sind es 480Ω. In der Praxis wird jeweils der nächstgrößere Standardwert gewählt (E-Reihen).&lt;br /&gt;
&lt;br /&gt;
Was passiert nun, wenn die Flußspannung der LED etwas anders ist als angenommen, z.B. durch Fertigungstoleranzen, höheren Strom oder stark veränderte Temperatur? Bleiben wir bei dem Beispiel mit 6V Versorgungsspannung, 2,4V Flußspannung, 20mA und 180 Ohm Vorwiderstand. Es fallen rechnerisch 3,6V am Vorwiderstand ab. Wenn nun die Flußspannung um 0,2V schwankt (realistischer Wert), ändert sich die Spannung über dem Vorwiderstand um diese 0,2V. Bezogen auf 3,6V Spannungsabfall sind das 5,5%. Bei 12V Betriebsspannung und damit 9,6V Spannungsabfall über dem Vorwiderstand sind es nur noch 2%. Daraus erkennt man, dass der Vorwiderstand umso besser als [[Konstantstromquelle]] wirkt, je höher der Spannungsabfall über diesem ist. Eine echte Konstantstromquelle mit aktiven Elementen (Transistoren) erreicht den gleichen Effekt mit deutlich weniger Spannungsabfall.&lt;br /&gt;
&lt;br /&gt;
Mit einem 480-Ohm-Widerstand, welcher für 12 V Betriebsspannung passend ist, würden bei 6 Volt statt 20 mA nur noch 7,5 mA fließen. Mit einem 180-Ohm-Widerstand, welcher für 6 V Betriebsspannung passend ist, würden bei 12 V statt der gewünschten 20 mA allerdings schon 53 mA fließen. &lt;br /&gt;
&lt;br /&gt;
Beachten muss man auch die als Wärme abgegebene &#039;&#039;&#039;Verlustleistung&#039;&#039;&#039; über dem Vorwiderstand, vor allem wenn man LEDs an eine recht hohe Betriebsspannung von 12 V oder gar 24 V anschließt. Die Verlustleistung berechnet sich einfach aus&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P_\text{RV} = (V_\text{cc}-U_\text{LED}) \cdot I_\text{LED} = I_\text{LED}^2 \cdot R_\text{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel mit der 2,4-V-LED und einem Strom von 20 mA heißt das, dass an dem 480-Ohm-Widerstand eine Verlustleistung von 192 mW abfällt. Ein kleiner SMD-Widerstand der Größe 0805 hält das nicht mehr aus (1/8 W = 125 mW maximal).&lt;br /&gt;
&lt;br /&gt;
Wie man aus dem Beispiel erkennt, ist bei stark variierender Betriebsspannung ein Vorwiderstand weniger geeignet. Es sei denn, man nimmt sehr unterschiedliche LED-Ströme und damit LED-Helligkeiten oder möglicherweise die Zerstörung der LED in Kauf.&lt;br /&gt;
&lt;br /&gt;
=== Unsichtbarer Vorwiderstand ===&lt;br /&gt;
&lt;br /&gt;
Bei Batteriebetrieb werden LEDs häufig ohne Vorwiderstand betrieben. So z.B. bei billigen Taschenlampen und Fahrradlampen. Dabei werden oft sogar zwei 1,5V Batterien in Reihe geschaltet und die LED direkt angeschlossen. Der Grund ist, dass das alles nichts kosten darf und man sich auf den Innenwiderstand der Batterie und der LEDs verlässt, um den Strom halbwegs zu begrenzen. Allerdings schwankt damit die Helligkeit der LED stark mit den Toleranzen und dem Ladezustand der Batterien.&lt;br /&gt;
&lt;br /&gt;
=== Konstantstromquelle ===&lt;br /&gt;
&lt;br /&gt;
Bei stark schwankender Versorgungsspannung oder Umgebungstemperatur heißt der Ausweg [[Konstantstromquelle]]. Kriterien für die Auswahl einer Schaltung für die Konstantstromquelle sind hierbei z.&amp;amp;nbsp;B. Betriebsspannungsbereich, erforderliche Genauigkeit und Kosten. Auch hier ist zu beachten, daß die Verlustleistung der Konstantstromquelle von den Bauteilen abgeführt werden muss, mit einer gewissen Ausnahme der Lösungen mit Schaltregler.&lt;br /&gt;
&lt;br /&gt;
== Mehrere LEDs zusammenschalten ==&lt;br /&gt;
&lt;br /&gt;
Diese Frage bewegt immer wieder die Gemüter. Wie schaltet man mehrere LEDs &#039;&#039;&#039;richtig&#039;&#039;&#039; zusammen?&lt;br /&gt;
&lt;br /&gt;
=== Reihenschaltung ===&lt;br /&gt;
&lt;br /&gt;
In einer Reihenschaltung ist der Strom durch alle Verbraucher gleich, ideal für LEDs. Hat man eine ausreichend hohe Versorgungsspannung, kann man mehrere LEDs in Reihe schalten. Dann reicht ein einziger Widerstand bzw. eine [[Konstantstromquelle]]. Allerdings sollte man das nicht übertreiben. 100–150 LEDs direkt an die Netzspannung zu hängen ist nicht möglich, da die LEDs zu viel Sperrspannung abbekommen würden. Auch bei gleichgerichteter Spannung besteht ein Sicherheitsproblem. Als Hobbybastler sollte man sich auch hier auf Spannungen kleiner als 40V beschränken.&lt;br /&gt;
&lt;br /&gt;
=== Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
Das direkte Parallelschalten von LEDs ist sehr kritisch und muss vermieden werden. Grund ist die exponentielle Diodenkennlinie, welche bewirkt, dass eine kleine Spannungsänderung eine große Stromänderung hervorruft. Schaltet man nun zwei LEDs mit verschiedenen Durchlassspannung parallel, bekommt die mit der niedrigeren Durchlassspannung DEUTLICH mehr Strom ab, dadurch wird sie nicht nur deutlich heller sondern auch wärmer. Das führt zum 2. Problem, denn mit steigender Temperatur sinkt die Durchlassspannung zusätzlich, wodurch sich der Effekt weiter verstärkt! LEDs verschiedener Farben haben sehr unterschiedliche Durchlassspannungen, hier ist ein direktes Parallelschalten vollkommen unmöglich. Aber selbst LEDs mit gleicher Farbe und aus einem Produktionsdurchlauf (Lot) weisen herstellungsbedingt bisweilen erhebliche Streuungen der Durchlassspannung auf!&lt;br /&gt;
&lt;br /&gt;
Richtig Parallelschalten kann man LEDs aber durch&lt;br /&gt;
&lt;br /&gt;
* Vorwiderstand/Konstantstromquelle für jede einzelne LED&lt;br /&gt;
* Auswählen von ausgemessenen LEDs mit sehr ähnlicher Flußspannung&lt;br /&gt;
&lt;br /&gt;
Letztere Methode wird von professionellen Herstellern verwendet, um bei grösseren Anzeigen LEDs direkt parallel schalten zu können. Die Unterschiede in der Flußspannung bei Nennstrom sollten dabei kleiner als 10mV(?) sein. Das gilt natürlich auch für das Parallelschalten von LED-Strängen, also Reihenschaltungen von LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Reihen- plus Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:LED_array_Iconst.png|framed|LED-Array mit Konstantstromquelle]]&lt;br /&gt;
Eine Kombination aus Serien- und Parallelschaltung ist weniger kritisch, da sich die unterschiedlichen Kennlinien statistisch mitteln. Z.B. kann man 20 LEDs in Reihe und mehrere solcher Stränge parallel schalten. Eine einzelne Diode mit geringerer Durchlaßspannung wird im Strom durch 9 andere begrenzt. Der Stromanstieg infolge der Unterschiede der einzelnen Stränge erzeugt an allen Bahnwiderständen der Dioden einen Spannungsabfall, der die ungleiche Stromverteilung begrenzt. Dieses Array von LEDs kann man nun mit einer leistungsstarken [[Konstantstromquelle]] speisen. Da LEDs mit bis zu 20% in ihrer effektiven Leuchtkraft bei gleichem Strom streuen, sollte man wenigstens 10 LEDs in Reihe schalten und diese auch nur zu 70% auslasten, um optische Schwankungen auf ein Maß der Nichtsichtbarkeit zu senken und Mitkopplungseffekte infolge von Erwärmung zu begrenzen. Statistisch streuen die Helligkeiten dann nur noch im Bereich einiger Prozente. Allerdings hat diese Verschaltung einen Nachteil. Fällt in einem Strang eine LED mit Unterbrechung aus, verteilt sich der konstante Gesamtstrom auf die restlichen Stränge, diese werden somit stärker belastet, im Extremfall überlastet.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
[[bild:LED_array_Uconst.png|framed|LED-Array an Konstantspannung]]&lt;br /&gt;
Möchte man das vermeiden, nutzt man sinnvollerweise pro Strang einen Vorwiderstand oder noch besser gleich eine [[Konstantstromquelle]] auf Basis eines LM317 oder ähnlich und speist das Array mit einer Konstant&#039;&#039;&#039;spannungs&#039;&#039;&#039;quelle (normales Netzteil). Damit sind die Stromschwankungen auf Grund der Tolereranz der Flußspannungen sicher beseitig. Dabei muss man beachten, daß die Versorgungsspannung hoch genug gewählt wurde, um die Toleranzen auszugleichen. Die einzelnen Vorwiderstände bzw. Konstanzstromquellen haben den Vorteil, daß beim Ausfall einer Kette die anderen Ketten nicht zusätzlich belastet werden.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Pulsbetrieb an Überspannung ==&lt;br /&gt;
LEDs können kurzzeitig über dem Nennstrom betrieben werden, um eine höhere Lichtausbeute zu erzielen, wenn 3 Bedingungen beachtet werden:&lt;br /&gt;
* die maximale Spannung darf nicht zu hoch werden, um die Feldstärke im Bauelement, ab der eine Atomwanderung auftritt nicht zu überschreiten. Kommt die LED in die Nähe dieses Punktes, so setzt eine Alterung ein&lt;br /&gt;
* der Pulsstrom darf nicht zu hoch werden, um die LED kapazititv nicht zu überladen. Diese Gefahr besteht bei rechteckigen Stromimpulsen, weil die LED hochfrequente Signale gut aufnehmen kann. Die Ladungen sammeln sich dann in der Raumladungszone und erzeugen ein hohes Gegenfeld, welches einen Strom zur Folge hat.&lt;br /&gt;
* mittlere Leistung darf nicht überschritten werden, damit es zu keinem Wärmetod der LED kommt.&lt;br /&gt;
&lt;br /&gt;
Besagte Probleme sind insbesondere bei Leistungs-LED im Pulsbetrieb zu beobachten, weil trotz PWM-Dimmung zwar ein mathematisch kleinerer Strom fliesst, die kapazitiven Ströme und Umschaltverluste aber zu insgesamt mehr Belastung führen.&lt;br /&gt;
&lt;br /&gt;
== Direktbetrieb an 230V ==&lt;br /&gt;
&lt;br /&gt;
LEDs können an 230V direkt mit einem [https://www.mikrocontroller.net/articles/Controller_an_230V#Versorgung_.C3.BCber_Vorwiderstand.2FKondensator Kondensatornetzteil] betrieben werden. Die Strombegrenzung erfolgt mit einem spannungsfesten Kondensator, welcher in Reihe zur eigentlichen LED-Schaltung liegt. Die LEDs können wie im obigen Beispiel auf 20V oder 24V ausgelegt werden und sollten mit zwei antiseriell geschalteten Z-Dioden auf 24/28V begrenzt werden, um Spannungsspitzen abzufangen. Die Kapazität richtet sich nach der Stromaufnahme der LED-Stränge. Eine andere Möglichkeit befindet sich im Artikel [[LED-Glühbirne]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: IO-Grundlagen#Hardware]]&lt;br /&gt;
* [[LED-&amp;quot;Birnen&amp;quot;]]&lt;br /&gt;
* [[LED-Matrix]]&lt;br /&gt;
* [[LED-Fading]]&lt;br /&gt;
* [[Lichtsensor / Helligkeitssensor#LED]]&lt;br /&gt;
* [[Ambilight in Hardware]]&lt;br /&gt;
* [[Konstantstromquelle]] &lt;br /&gt;
* [[Konstantstromquelle fuer Power LED]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/158836?goto=2759782#2759782 Forumsbeitrag]: LEDs an 230V Netzspannung mit Konstantstromquelle&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/219681#2197034 Forumsbeitrag]: Toleranzen von LEDs und deren Wirkung, oder &amp;quot;Warum man einen Vorwiderstand braucht&amp;quot;&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/74169#618682 Forumsbeitrag]: 16-Segment Ganganzeige ohne Mikrocontroller&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267113#2788848 Forumsbeitrag]: Unbekannte LEDs ausmessen.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/280991?goto=2966997#2966820 Forumsbeitrag]: Konstantstromquelle für LED an 40-420VDC&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/290710?goto=3106790#3106790 Forumsbeitrag]: Graphische Ermittlung des LED-Stroms und der Toleranzen&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/311454#new Forumsbeitrag]: Glühbirnen ungepulst betreiben?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/289238#3073788 Forumsbeitrag]: 2 LEDs mit einem Portpin steuern&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261525?goto=new#new Forumsbeitrag]: Samsung Hochvolt AC LED Erfahrungen?&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/441010#5248244 Forumsbeitrag]: Berechung des Spannungsabfalls an langen LED-Ketten&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/390644#new Forumsbeitrag]: Messung von LEDs und Statistik&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/389174#4459604 Forumsbeitrag]: Dokumente zu Lasern im Pulsbetrieb&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/478427#5925959 Forumsbeitrag]: ultrakompakte Diodenmatrix für 1 aus 9 zu 7-Segment Dekoder&lt;br /&gt;
*  [https://www.mikrocontroller.net/topic/480508?goto=5963206#5963206 Forumsbeitrag]: Blaue und Weiße LED an 3,3V?&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/507645#new Forumsbeitrag]: LED Nachtlicht optimieren&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/442959#5274817 Forumsbeitrag]: Hochfrequente LED-Ansteuerung&lt;br /&gt;
* [https://www.mikrocontroller.net/attachment/354428/ledtau.pdf Das Zeitverhalten von Licht Emittierenden Dioden (LEDs), PDF]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://de.wikibooks.org/wiki/Arbeiten_mit_LEDs/_Grundlagen Wikibooks Arbeiten mit LEDs: Grundlagen] - Sehr gute Erklärung, auch für Anfänger&lt;br /&gt;
* [http://www.theledlight.com/technical.html www.theledlight.com] - LED Information and Technical Data (englisch)&lt;br /&gt;
* [http://forum.electronicwerkstatt.de/phpBB/faq/led/ LED FAQ für Anfänger]&lt;br /&gt;
* [http://members.misty.com/don/ledx.html Don Klipstein&#039;s LED Main Page (engl.)]&lt;br /&gt;
* [http://www.robotroom.com/LEDTester.html Selecting a LED] - LED Tester von David Cook (Beginnerprojekt)&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/throw Some thoughts on throwies] von Windell H. Oskay von www.evilmadscientist.com&lt;br /&gt;
*[http://www.led-rechner.de www.led-rechner.de]&lt;br /&gt;
*[http://catalog.osram-os.com/catalogue/catalogue.do?act=downloadFile&amp;amp;favOid=02000002000040ac000100b6 Vergleich von LED-Schaltungen ] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
* [http://catalog.osram-os.com/catalogue/catalogue.do;jsessionid=CBC285EE73F7A4DA3956223C87D46516?act=downloadFile&amp;amp;favOid=0200000200004264000100b6 Ansteuerung von Power TOPLEDs] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
*[http://catalog.osram-os.com/catalogue/catalogue.do;jsessionid=CBC285EE73F7A4DA3956223C87D46516?act=downloadFile&amp;amp;favOid=0200000200001b48000200b6 Verhalten von InGaN LEDs in Parallelschaltungen] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
*[https://en.wikipedia.org/?title=Light-emitting_diode Leuchtdiode]&lt;br /&gt;
*[http://electronics-electrical.exportersindia.com/lighting-displays/led-lights.htm LED-Leuchten Hersteller]&lt;br /&gt;
* [http://www.bastler-beutel.de/HTML/Projekte/Matrix/index.htm Diodenmatrix], Einfache Erklärung eines 1 aus 10 zu 7-Segent Dekoders auf Diodenbasis&lt;br /&gt;
* [https://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.8.0 LED an 230VAC], Vor und Nachteile vieler verschiedener Schaltungen in der dse-FAQ&lt;br /&gt;
* [https://www.youtube.com/watch?v=DdToSNgPnO8 QuinLED]: What PWM frequency is required for shooting video&lt;br /&gt;
* [http://stefanfrings.de/LED/index.html Leuchtdioden (Stefan Frings)] Über Farben, Wirkungsgrad und wie man sie richtig mit Strom versorgt&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Displays und Anzeigen| ]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED&amp;diff=104684</id>
		<title>LED</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED&amp;diff=104684"/>
		<updated>2021-09-06T06:44:24Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung == &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ledrgb.jpg|thumb|right|246px|Detailfoto einer RGB-LED [http://www.mikrocontroller.net/topic/109784#990685]]]&lt;br /&gt;
&lt;br /&gt;
Eine LED (engl. &amp;lt;B&amp;gt;L&amp;lt;/B&amp;gt;ight &amp;lt;B&amp;gt;E&amp;lt;/B&amp;gt;mitting &amp;lt;B&amp;gt;D&amp;lt;/B&amp;gt;iode, &#039;&#039;Leuchtdiode&#039;&#039;) besteht aus einem [[Halbleiter]]-PN-Übergang, der durch seine Zusammensetzung Licht eines stark begrenzten Wellenbereiches emittiert, wenn er in Durchlassrichtung von Strom durchflossen wird. Die Helligkeit einer LED ist in erster Näherung proportional zum Strom.&lt;br /&gt;
&lt;br /&gt;
Die Farbe des emittierten Lichts hängt vom verwendeten Halbleitermaterial ab. Es existieren [[Halbleiter | Halbleitermaterialien]] für den gesamten sichtbaren Bereich als auch für den Infrarotbereich und den nahen Ultraviolettbereich. Für kurze Wellenlängen (Blau bis Ultraviolett) ist ein Halbleitermaterial wie z.&amp;amp;nbsp;B. GaN oder InGaN erforderlich (UV &amp;lt; 365nm: AlN). Für die ersten blauen LEDs wurde SiC verwendet, welches aber eine schlechte Effizienz aufweist. (Quelle:Wikipedia).&lt;br /&gt;
&lt;br /&gt;
Weißes Licht oder andere Farbmischungen können erzeugt werden, indem man eine Blau- oder Ultraviolett-LED mit einem Phosphormaterial (weiß: mit Cer dotiertes YAG) beschichtet, welches durch das Licht der LED zur Emission angeregt wird. Die entstehende Farbe wird dabei von der Beschichtung bestimmt.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Flußspannung ==&lt;br /&gt;
&lt;br /&gt;
LEDs haben im Vergleich zu gewöhnlichen [[Diode|Dioden]] eine vergleichsweise hohe, vom Halbleitermaterial abhängige [[Durchlass-Spannung | Flußspannung]]. Bevor diese erreicht wird, fließt nur sehr wenig Strom und die LED leuchtet praktisch nicht. Oberhalb der Flußspannung steigt der Strom schnell an (Diodenkennlinie). Die Flußspannung reicht von ca. 1,2 V bei Infrarot-LEDs bis zu etwa 4 V bei Ultraviolett-LEDs. Auffällig ist die Korrelation zwischen Spannung und der Farbe, die damit zusammenhängt, dass die Emission höherenergetischer Photonen einen größeren Bandabstand (Energiedifferenz) im Halbleitermaterial erfordert, welcher von den Elektronen überwunden werden muss, wenn sie ihre Energie abgegeben. Da anfänglich nur Halbleiter mit geringem Bandabstand produziert wurden und aufgrund von mangelnder Reinheit oft Zwischenniveaurekombination stattfand, waren lange Zeit keine blauen oder gar echte violette LEDs herstellbar. Die ersten verfügbaren LEDs waren naturgemäß auch rot.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:14em; text-align:center&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Flußspannung von LEDs&lt;br /&gt;
|-&lt;br /&gt;
! Farbe || &amp;lt;math&amp;gt;U_F&amp;lt;/math&amp;gt; [V]&lt;br /&gt;
|-&lt;br /&gt;
| Infrarot || 1,2&lt;br /&gt;
|-&lt;br /&gt;
| Rot || 1,8&lt;br /&gt;
|-&lt;br /&gt;
| Gelb || 2,0&lt;br /&gt;
|-&lt;br /&gt;
| Grün || 2,2&lt;br /&gt;
|-&lt;br /&gt;
| Grün&amp;lt;br&amp;gt;(Ultrahell) || 3,3&lt;br /&gt;
|-&lt;br /&gt;
| Blau || 3,6&lt;br /&gt;
|-&lt;br /&gt;
| Weiß || 3,6&lt;br /&gt;
|-&lt;br /&gt;
| Ultraviolett || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Durchlassstrom == &lt;br /&gt;
&lt;br /&gt;
Da LEDs durch einen zu hohen Strom zerstört werden, muss der Strom begrenzt werden. Ein direkter Betrieb an einer Konstantspannung, wie sie bei Glühlampen üblich ist, ist hier nicht sinnvoll. Eine Standard-LED zur Anzeige (THT 3 oder 5mm sowie SMD 0603-1206) wird üblicherweise mit 20 mA betrieben. Moderne LEDs kommen häufig mit sehr viel weniger Strom aus. So benötigt eine Low-Current LED nur 2 mA um sehr hell zu leuchten. In der Praxis werden LEDs oft mit einem weit geringeren als dem maximal zulässigen Durchlassstrom betrieben. Insbesondere im Entwicklungs- und Experimentierumfeld kann eine für maximal 20 mA ausgelegte LED auch mit lediglich 3-5 mA betrieben werden. Der subjektiv wahrgenommene Helligkeitsverlust ist deutlich geringer, als der prozentuale Unterschied der Stromstärke vermuten lässt, siehe Artikel [[LED-Fading]]. Leistungs-LEDs zur Beleuchtung werden mit typisch 100mA(0,33W), 350mA (1W) bzw. 1000mA (3W) betrieben. Nach oben sind kaum Grenzen gesetzt, bis hin zu LED-Matritzen mit 100W und mehr.&lt;br /&gt;
&lt;br /&gt;
=== Warum benötigt man einen Vorwiderstand? ===&lt;br /&gt;
&lt;br /&gt;
Diese Frage wird seit langer Zeit immer wieder gestellt.&lt;br /&gt;
&lt;br /&gt;
Die [https://www.mikrocontroller.net/attachment/151822/LED-Kennlinien.png Kennlinie] einer LED ist stark nichtlinear. Unterhalb der Flußspannung fließt fast kein Strom und die LED leuchtet kaum. Oberhalb der Flußspannung steigt der Stromfluß schon bei kleinen Spannungsänderungen stark an. In der Praxis müsste man nun die Spannung für jede einzelne LED exakt einstellen, um den exakten Strom zu treffen und auch zu halten. Das kann und will man aber nicht. Außerdem unterliegt die Flußspannung sowohl einer Fertigungstoleranz als auch einer negativen Temperaturdrift, d.h. bei höherer Temperatur (Umgebung oder Eigenerwärmung) sinkt die Flußspannung. Alle diese Effekte kann man problemlos mit einem Vorwiderstand soweit abschwächen, dass sie praktisch keine große Rolle mehr spielen, ganz ohne präzise Spannungseinstellung.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel. In diesem [https://www.mikrocontroller.net/attachment/151822/LED-Kennlinien.png Bild] ist die Kennlinie einer grünen LED mit und ohne Vorwiderstand dargestellt. Die Flußspannung beträgt ca. 2,2V bei 10mA LED-Strom. Wenn man jetzt exakt 2,05V anlegt, fließen 6mA (blaue Kurve). Schwankt jetzt aber die angelegte Spannung um +/-0,2V (10%), dann schwankt der Strom um +14/-5mA! Ganz anders mit Vorwiderstand. Man braucht eine höhere Spannung, hier beispielsweise 4V, wobei auch 6mA fließen (rosa Kurve). Schwankt diese nun um +/-0,4V (10%), schwankt der Strom nur um +/-1mA. Das ist deutlich stabiler!&lt;br /&gt;
&lt;br /&gt;
=== Vorwiderstand ===&lt;br /&gt;
&lt;br /&gt;
Im einfachsten Fall und bei relativ geringfügig variierender Betriebsspannung kann man dazu einen Widerstand einsetzen.&lt;br /&gt;
&lt;br /&gt;
[[bild:led_rv.png|right]]&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_V=\frac{Vcc-U_\text{LED}}{I_\text{LED}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand in Ohm&lt;br /&gt;
* Vcc: Betriebsspannung in Volt&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{LED}&amp;lt;/math&amp;gt;: Durchlassspannung der LED in Volt&lt;br /&gt;
* &amp;lt;math&amp;gt;I_{LED}&amp;lt;/math&amp;gt;: Strom durch die LED in Ampere&lt;br /&gt;
&lt;br /&gt;
Bei 6 V Betriebsspannung, einer Durchlassspannung der LED von 2,4 V und einem gewünschten Strom von 20 mA braucht man nach dem ohmschen Gesetz einen Widerstand von 180Ω, bei 12 V Betriebsspannung sind es 480Ω. In der Praxis wird jeweils der nächstgrößere Standardwert gewählt (E-Reihen).&lt;br /&gt;
&lt;br /&gt;
Was passiert nun, wenn die Flußspannung der LED etwas anders ist als angenommen, z.B. durch Fertigungstoleranzen, höheren Strom oder stark veränderte Temperatur? Bleiben wir bei dem Beispiel mit 6V Versorgungsspannung, 2,4V Flußspannung, 20mA und 180 Ohm Vorwiderstand. Es fallen rechnerisch 3,6V am Vorwiderstand ab. Wenn nun die Flußspannung um 0,2V schwankt (realistischer Wert), ändert sich die Spannung über dem Vorwiderstand um diese 0,2V. Bezogen auf 3,6V Spannungsabfall sind das 5,5%. Bei 12V Betriebsspannung und damit 9,6V Spannungsabfall über dem Vorwiderstand sind es nur noch 2%. Daraus erkennt man, dass der Vorwiderstand umso besser als [[Konstantstromquelle]] wirkt, je höher der Spannungsabfall über diesem ist. Eine echte Konstantstromquelle mit aktiven Elementen (Transistoren) erreicht den gleichen Effekt mit deutlich weniger Spannungsabfall.&lt;br /&gt;
&lt;br /&gt;
Mit einem 480-Ohm-Widerstand, welcher für 12 V Betriebsspannung passend ist, würden bei 6 Volt statt 20 mA nur noch 7,5 mA fließen. Mit einem 180-Ohm-Widerstand, welcher für 6 V Betriebsspannung passend ist, würden bei 12 V statt der gewünschten 20 mA allerdings schon 53 mA fließen. &lt;br /&gt;
&lt;br /&gt;
Beachten muss man auch die als Wärme abgegebene &#039;&#039;&#039;Verlustleistung&#039;&#039;&#039; über dem Vorwiderstand, vor allem wenn man LEDs an eine recht hohe Betriebsspannung von 12 V oder gar 24 V anschließt. Die Verlustleistung berechnet sich einfach aus&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P_\text{RV} = (V_\text{cc}-U_\text{LED}) \cdot I_\text{LED} = I_\text{LED}^2 \cdot R_\text{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel mit der 2,4-V-LED und einem Strom von 20 mA heißt das, dass an dem 480-Ohm-Widerstand eine Verlustleistung von 192 mW abfällt. Ein kleiner SMD-Widerstand der Größe 0805 hält das nicht mehr aus (1/8 W = 125 mW maximal).&lt;br /&gt;
&lt;br /&gt;
Wie man aus dem Beispiel erkennt, ist bei stark variierender Betriebsspannung ein Vorwiderstand weniger geeignet. Es sei denn, man nimmt sehr unterschiedliche LED-Ströme und damit LED-Helligkeiten oder möglicherweise die Zerstörung der LED in Kauf.&lt;br /&gt;
&lt;br /&gt;
=== Unsichtbarer Vorwiderstand ===&lt;br /&gt;
&lt;br /&gt;
Bei Batteriebetrieb werden LEDs häufig ohne Vorwiderstand betrieben. So z.B. bei billigen Taschenlampen und Fahrradlampen. Dabei werden oft sogar zwei 1,5V Batterien in Reihe geschaltet und die LED direkt angeschlossen. Der Grund ist, dass das alles nichts kosten darf und man sich auf den Innenwiderstand der Batterie und der LEDs verlässt, um den Strom halbwegs zu begrenzen. Allerdings schwankt damit die Helligkeit der LED stark mit den Toleranzen und dem Ladezustand der Batterien.&lt;br /&gt;
&lt;br /&gt;
=== Konstantstromquelle ===&lt;br /&gt;
&lt;br /&gt;
Bei stark schwankender Versorgungsspannung oder Umgebungstemperatur heißt der Ausweg [[Konstantstromquelle]]. Kriterien für die Auswahl einer Schaltung für die Konstantstromquelle sind hierbei z.&amp;amp;nbsp;B. Betriebsspannungsbereich, erforderliche Genauigkeit und Kosten. Auch hier ist zu beachten, daß die Verlustleistung der Konstantstromquelle von den Bauteilen abgeführt werden muss, mit einer gewissen Ausnahme der Lösungen mit Schaltregler.&lt;br /&gt;
&lt;br /&gt;
== Mehrere LEDs zusammenschalten ==&lt;br /&gt;
&lt;br /&gt;
Diese Frage bewegt immer wieder die Gemüter. Wie schaltet man mehrere LEDs &#039;&#039;&#039;richtig&#039;&#039;&#039; zusammen?&lt;br /&gt;
&lt;br /&gt;
=== Reihenschaltung ===&lt;br /&gt;
&lt;br /&gt;
In einer Reihenschaltung ist der Strom durch alle Verbraucher gleich, ideal für LEDs. Hat man eine ausreichend hohe Versorgungsspannung, kann man mehrere LEDs in Reihe schalten. Dann reicht ein einziger Widerstand bzw. eine [[Konstantstromquelle]]. Allerdings sollte man das nicht übertreiben. 100–150 LEDs direkt an die Netzspannung zu hängen ist nicht möglich, da die LEDs zu viel Sperrspannung abbekommen würden. Auch bei gleichgerichteter Spannung besteht ein Sicherheitsproblem. Als Hobbybastler sollte man sich auch hier auf Spannungen kleiner als 40V beschränken.&lt;br /&gt;
&lt;br /&gt;
=== Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
Das direkte Parallelschalten von LEDs ist sehr kritisch und muss vermieden werden. Grund ist die exponentielle Diodenkennlinie, welche bewirkt, dass eine kleine Spannungsänderung eine große Stromänderung hervorruft. Schaltet man nun zwei LEDs mit verschiedenen Durchlassspannung parallel, bekommt die mit der niedrigeren Durchlassspannung DEUTLICH mehr Strom ab, dadurch wird sie nicht nur deutlich heller sondern auch wärmer. Das führt zum 2. Problem, denn mit steigender Temperatur sinkt die Durchlassspannung zusätzlich, wodurch sich der Effekt weiter verstärkt! LEDs verschiedener Farben haben sehr unterschiedliche Durchlassspannungen, hier ist ein direktes Parallelschalten vollkommen unmöglich. Aber selbst LEDs mit gleicher Farbe und aus einem Produktionsdurchlauf (Lot) weisen herstellungsbedingt bisweilen erhebliche Streuungen der Durchlassspannung auf!&lt;br /&gt;
&lt;br /&gt;
Richtig Parallelschalten kann man LEDs aber durch&lt;br /&gt;
&lt;br /&gt;
* Vorwiderstand/Konstantstromquelle für jede einzelne LED&lt;br /&gt;
* Auswählen von ausgemessenen LEDs mit sehr ähnlicher Flußspannung&lt;br /&gt;
&lt;br /&gt;
Letztere Methode wird von professionellen Herstellern verwendet, um bei grösseren Anzeigen LEDs direkt parallel schalten zu können. Die Unterschiede in der Flußspannung bei Nennstrom sollten dabei kleiner als 10mV(?) sein. Das gilt natürlich auch für das Parallelschalten von LED-Strängen, also Reihenschaltungen von LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Reihen- plus Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:LED_array_Iconst.png|framed|LED-Array mit Konstantstromquelle]]&lt;br /&gt;
Eine Kombination aus Serien- und Parallelschaltung ist weniger kritisch, da sich die unterschiedlichen Kennlinien statistisch mitteln. Z.B. kann man 20 LEDs in Reihe und mehrere solcher Stränge parallel schalten. Eine einzelne Diode mit geringerer Durchlaßspannung wird im Strom durch 9 andere begrenzt. Der Stromanstieg infolge der Unterschiede der einzelnen Stränge erzeugt an allen Bahnwiderständen der Dioden einen Spannungsabfall, der die ungleiche Stromverteilung begrenzt. Dieses Array von LEDs kann man nun mit einer leistungsstarken [[Konstantstromquelle]] speisen. Da LEDs mit bis zu 20% in ihrer effektiven Leuchtkraft bei gleichem Strom streuen, sollte man wenigstens 10 LEDs in Reihe schalten und diese auch nur zu 70% auslasten, um optische Schwankungen auf ein Maß der Nichtsichtbarkeit zu senken und Mitkopplungseffekte infolge von Erwärmung zu begrenzen. Statistisch streuen die Helligkeiten dann nur noch im Bereich einiger Prozente. Allerdings hat diese Verschaltung einen Nachteil. Fällt in einem Strang eine LED mit Unterbrechung aus, verteilt sich der konstante Gesamtstrom auf die restlichen Stränge, diese werden somit stärker belastet, im Extremfall überlastet.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
[[bild:LED_array_Uconst.png|framed|LED-Array an Konstantspannung]]&lt;br /&gt;
Möchte man das vermeiden, nutzt man sinnvollerweise pro Strang einen Vorwiderstand oder noch besser gleich eine [[Konstantstromquelle]] auf Basis eines LM317 oder ähnlich und speist das Array mit einer Konstant&#039;&#039;&#039;spannungs&#039;&#039;&#039;quelle (normales Netzteil). Damit sind die Stromschwankungen auf Grund der Tolereranz der Flußspannungen sicher beseitig. Dabei muss man beachten, daß die Versorgungsspannung hoch genug gewählt wurde, um die Toleranzen auszugleichen. Die einzelnen Vorwiderstände bzw. Konstanzstromquellen haben den Vorteil, daß beim Ausfall einer Kette die anderen Ketten nicht zusätzlich belastet werden.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Pulsbetrieb an Überspannung ==&lt;br /&gt;
LEDs können kurzzeitig über dem Nennstrom betrieben werden, um eine höhere Lichtausbeute zu erzielen, wenn 3 Bedingungen beachtet werden:&lt;br /&gt;
* die maximale Spannung darf nicht zu hoch werden, um die Feldstärke im Bauelement, ab der eine Atomwanderung auftritt nicht zu überschreiten. Kommt die LED in die Nähe dieses Punktes, so setzt eine Alterung ein&lt;br /&gt;
* der Pulsstrom darf nicht zu hoch werden, um die LED kapazititv nicht zu überladen. Diese Gefahr besteht bei rechteckigen Stromimpulsen, weil die LED hochfrequente Signale gut aufnehmen kann. Die Ladungen sammeln sich dann in der Raumladungszone und erzeugen ein hohes Gegenfeld, welches einen Strom zur Folge hat.&lt;br /&gt;
* mittlere Leistung darf nicht überschritten werden, damit es zu keinem Wärmetod der LED kommt.&lt;br /&gt;
&lt;br /&gt;
Besagte Probleme sind insbesondere bei Leistungs-LED im Pulsbetrieb zu beobachten, weil trotz PWM-Dimmung zwar ein mathematisch kleinerer Strom fliesst, die kapazitiven Ströme und Umschaltverluste aber zu insgesamt mehr Belastung führen.&lt;br /&gt;
&lt;br /&gt;
== Direktbetrieb an 230V ==&lt;br /&gt;
&lt;br /&gt;
LEDs können an 230V direkt mit einem [https://www.mikrocontroller.net/articles/Controller_an_230V#Versorgung_.C3.BCber_Vorwiderstand.2FKondensator Kondensatornetzteil] betrieben werden. Die Strombegrenzung erfolgt mit einem spannungsfesten Kondensator, welcher in Reihe zur eigentlichen LED-Schaltung liegt. Die LEDs können wie im obigen Beispiel auf 20V oder 24V ausgelegt werden und sollten mit zwei antiseriell geschalteten Z-Dioden auf 24/28V begrenzt werden, um Spannungsspitzen abzufangen. Die Kapazität richtet sich nach der Stromaufnahme der LED-Stränge. Eine andere Möglichkeit befindet sich im Artikel [[LED-Glühbirne]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: IO-Grundlagen#Hardware]]&lt;br /&gt;
* [[LED-&amp;quot;Birnen&amp;quot;]]&lt;br /&gt;
* [[LED-Matrix]]&lt;br /&gt;
* [[LED-Fading]]&lt;br /&gt;
* [[Lichtsensor / Helligkeitssensor#LED]]&lt;br /&gt;
* [[Ambilight in Hardware]]&lt;br /&gt;
* [[Konstantstromquelle]] &lt;br /&gt;
* [[Konstantstromquelle fuer Power LED]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/158836?goto=2759782#2759782 Forumsbeitrag]: LEDs an 230V Netzspannung mit Konstantstromquelle&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/219681#2197034 Forumsbeitrag]: Toleranzen von LEDs und deren Wirkung, oder &amp;quot;Warum man einen Vorwiderstand braucht&amp;quot;&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/74169#618682 Forumsbeitrag]: 16-Segment Ganganzeige ohne Mikrocontroller&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267113#2788848 Forumsbeitrag]: Unbekannte LEDs ausmessen.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/280991?goto=2966997#2966820 Forumsbeitrag]: Konstantstromquelle für LED an 40-420VDC&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/290710?goto=3106790#3106790 Forumsbeitrag]: Graphische Ermittlung des LED-Stroms und der Toleranzen&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/311454#new Forumsbeitrag]: Glühbirnen ungepulst betreiben?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/289238#3073788 Forumsbeitrag]: 2 LEDs mit einem Portpin steuern&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261525?goto=new#new Forumsbeitrag]: Samsung Hochvolt AC LED Erfahrungen?&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/441010#5248244 Forumsbeitrag]: Berechung des Spannungsabfalls an langen LED-Ketten&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/390644#new Forumsbeitrag]: Messung von LEDs und Statistik&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/389174#4459604 Forumsbeitrag]: Dokumente zu Lasern im Pulsbetrieb&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/478427#5925959 Forumsbeitrag]: ultrakompakte Diodenmatrix für 1 aus 9 zu 7-Segment Dekoder&lt;br /&gt;
*  [https://www.mikrocontroller.net/topic/480508?goto=5963206#5963206 Forumsbeitrag]: Blaue und Weiße LED an 3,3V?&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/507645#new Forumsbeitrag]: LED Nachtlicht optimieren&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/442959#5274817 Forumsbeitrag]: Hochfrequente LED-Ansteuerung&lt;br /&gt;
* [https://www.mikrocontroller.net/attachment/354428/ledtau.pdf Das Zeitverhalten von Licht Emittierenden Dioden (LEDs), PDF]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://de.wikibooks.org/wiki/Arbeiten_mit_LEDs/_Grundlagen Wikibooks Arbeiten mit LEDs: Grundlagen] - Sehr gute Erklärung, auch für Anfänger&lt;br /&gt;
* [http://www.theledlight.com/technical.html www.theledlight.com] - LED Information and Technical Data (englisch)&lt;br /&gt;
* [http://forum.electronicwerkstatt.de/phpBB/faq/led/ LED FAQ für Anfänger]&lt;br /&gt;
* [http://members.misty.com/don/ledx.html Don Klipstein&#039;s LED Main Page (engl.)]&lt;br /&gt;
* [http://www.robotroom.com/LEDTester.html Selecting a LED] - LED Tester von David Cook (Beginnerprojekt)&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/throw Some thoughts on throwies] von Windell H. Oskay von www.evilmadscientist.com&lt;br /&gt;
*[http://www.led-rechner.de www.led-rechner.de]&lt;br /&gt;
*[http://catalog.osram-os.com/catalogue/catalogue.do?act=downloadFile&amp;amp;favOid=02000002000040ac000100b6 Vergleich von LED-Schaltungen ] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
* [http://catalog.osram-os.com/catalogue/catalogue.do;jsessionid=CBC285EE73F7A4DA3956223C87D46516?act=downloadFile&amp;amp;favOid=0200000200004264000100b6 Ansteuerung von Power TOPLEDs] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
*[http://catalog.osram-os.com/catalogue/catalogue.do;jsessionid=CBC285EE73F7A4DA3956223C87D46516?act=downloadFile&amp;amp;favOid=0200000200001b48000200b6 Verhalten von InGaN LEDs in Parallelschaltungen] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
*[https://en.wikipedia.org/?title=Light-emitting_diode Leuchtdiode]&lt;br /&gt;
*[http://electronics-electrical.exportersindia.com/lighting-displays/led-lights.htm LED-Leuchten Hersteller]&lt;br /&gt;
* [http://www.bastler-beutel.de/HTML/Projekte/Matrix/index.htm Diodenmatrix], Einfache Erklärung eines 1 aus 10 zu 7-Segent Dekoders auf Diodenbasis&lt;br /&gt;
* [https://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.8.0 LED an 230VAC], Vor und Nachteile vieler verschiedener Schaltungen in der dse-FAQ&lt;br /&gt;
* [https://www.youtube.com/watch?v=DdToSNgPnO8 QuinLED]: What PWM frequency is required for shooting video&lt;br /&gt;
* [http://stefanfrings.de/LED/index.html]: Über Farben, Wirkungsgrad und wie man sie richtig mit Strom versorgt&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Displays und Anzeigen| ]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Quarze_und_AVR&amp;diff=102400</id>
		<title>Quarze und AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Quarze_und_AVR&amp;diff=102400"/>
		<updated>2020-09-19T11:48:46Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: veraltete Weblinks korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite behandelt [[Schwingquarz]]e im Zusammenhang mit [[AVR]]s.&lt;br /&gt;
&lt;br /&gt;
Die Genauigkeit von Quarzen liegt bei 10–100ppm	(1ppm = 0,0001 %) und wird somit nur noch von [[Quarzoszillator]]en überboten. Außerdem sind Quarze im Gegensatz zum internen RC-Oszillator weniger temperaturabhängig.&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Quarze sind in folgenden Situationen sinnvoll / notwendig:&lt;br /&gt;
&lt;br /&gt;
* Interner Oszillator des [[µC]] zu langsam&lt;br /&gt;
* Interner Oszillator des µC zu ungenau&lt;br /&gt;
** Bei Verwendung des [[UART]]&lt;br /&gt;
** Bei zeitgenauen Anwendungen wie [[AVR - Die genaue Sekunde / RTC | Uhren]]&lt;br /&gt;
&lt;br /&gt;
== Wahl der richtigen Frequenz ==&lt;br /&gt;
&lt;br /&gt;
Vor allem als Anfänger denkt man sich, &#039;&#039;ich kaufe einfach mal 10MHz, das ist eine so schön gerade Zahl&#039;&#039;. Allerdings sind diese Quarze nur in den seltensten Fällen sinnvoll. Viel sinnvoller sind [[Baudratenquarz]]e. &amp;quot;Baudraten&amp;quot;-Frequenzen sind ganzzahlige Vielfache der bei [[RS232]] üblichen Baudraten. Mit Baudrate-Frequenz kann  man exakte Baudraten erreichen. Mit &amp;quot;runden&amp;quot; Frequenzen entstehen hingegen Fehler, weshalb damit oft nur sehr niedrige Baudraten möglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Runde&amp;quot; Frequenzen (4MHz, 8MHz, 10MHz....) sind meist leichter erhältlich und haben den Vorteil, dass man Verzögerungsschleifen und Rechendauern relativ leicht errechnen kann.&lt;br /&gt;
&lt;br /&gt;
== Anschluss ==&lt;br /&gt;
&lt;br /&gt;
Die Kapazitäten von C1 und C2 entsprechen &#039;&#039;nicht&#039;&#039; der Lastkapazität des Quarzes! Sie errechnen sich folgendermaßen:&lt;br /&gt;
[[Bild:Quarz_Anschluss_AVR.png|right|thumb|Anschluss eines Quarzes an einen AVR]]&lt;br /&gt;
&lt;br /&gt;
C = 2·CL – (CP+CI)&lt;br /&gt;
&lt;br /&gt;
*CP: Leiterbahnen bedingte Kapazität&lt;br /&gt;
*CI: Portbedingte Kapazität&lt;br /&gt;
*CL: Datenblatt des Quarzes&lt;br /&gt;
*CP+CI ca. 5pF&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von CL = 32pF:&lt;br /&gt;
&lt;br /&gt;
C = 2·32pF – 5pF = 59pF&lt;br /&gt;
&lt;br /&gt;
wobeil gilt C = C1 = C2&lt;br /&gt;
&lt;br /&gt;
C1 und C2 sind die vom Hersteller des Kontrollers empfohlenen Werte. Mit ihnen wird die Schwingsicherheit der Oszillatorschaltung gewährleistet. C1 und C2 sollten in etwa eingehalten werden, also nicht mehr als ±20% von den Angaben abweichen.&lt;br /&gt;
&lt;br /&gt;
CL, der im Datenblatt angegebene Wert, wird beim Abgleich des Quarzes während der Herstellung benutzt. &lt;br /&gt;
&lt;br /&gt;
Wenn CL nicht eingehalten wird, hat das — solange der Faktor 2 nicht überschritten wird — keinen Einfluss auf das Schwingen des Oszillators, sondern nur auf die Frequenz, aber das in einem Maße (max. 0,01% der Frequenz) welche für die meisten Mikrocontroller-Anwendungen bedeutungslos ist.&lt;br /&gt;
{{Warnung |&lt;br /&gt;
;Hinweis: Soll ein Uhrenquarz eine Real-Time-Clock versorgen, so sind die Kapazitäten von großer Wichtigkeit. Die Uhr läuft bei falsch dimensionierten Kapazitäten gleich im 3-stelligen ppm-Bereich falsch. Das bedeutet praktisch gleich mehrere Minuten pro Tag!&lt;br /&gt;
}}&lt;br /&gt;
{{Warnung |&lt;br /&gt;
;Hinweis: Gerade die älteren Atmegas (Atmega16/32/64/128) haben am den Eingängen des Uhrenquarz für den Timer0 bereits interne Kapazitäten von 36pF pro Pin. Bei den neueren Varianten (Atmega640/1280/1281/2560/2561) haben diese Ports keine internen Kapazitäten und der Eingang ist mit Timer2 verbunden. Auskunft gibt hier der Abschnitt &amp;quot;Timer/Counter Oscillator&amp;quot; im Abschnitt &amp;quot;System Clock and Clock Options&amp;quot; des jeweiligem Datenblatt.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einstellung der Fuses ==&lt;br /&gt;
{{Warnung |&lt;br /&gt;
;Warnung: Hier ist besondere Vorsicht geboten. Fast immer liegt das Problem, wenn ein AVR nicht mehr läuft, an falsch eingestellten [[AVR Fuses]]!&lt;br /&gt;
&lt;br /&gt;
:Ein Quarz ist &#039;&#039;keine&#039;&#039; &amp;quot;External Clock&amp;quot;, sondern ein &amp;quot;External Crystal/Ceramic Resonator&amp;quot;. &lt;br /&gt;
}}&lt;br /&gt;
Bei vielen AVRs muss nicht nur &amp;quot;External Crystal&amp;quot; eingestellt werden, sondern auch der Frequenzbereich des Quarzes. Dabei gibt es die folgenden Bereiche:&lt;br /&gt;
*Low Freq.: 0,9 - 3 MHz&lt;br /&gt;
*Medium Freq.: 3 - 8 MHz&lt;br /&gt;
*High Freq.: &amp;gt;= 10 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man wirklich auf Nummer sicher gehen will, sollte man:&lt;br /&gt;
* Immer das Datenblatt und den Abschnitt &amp;quot;Clock Source&amp;quot; aufmerksam lesen.&lt;br /&gt;
* Per Fuse Calculator die Fuses berechnen lassen. Siehe dazu die Weblinks unten.&lt;br /&gt;
* Nochmals genau überprüfen&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR_Fuses#Taktquellen Fuse Einstellung|AVR Fuses: Fuse Einstellung für Taktquellen]]&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Erg.C3.A4nzende_Hinweise_zur_Taktversorgung_.28kann_.C3.BCbersprungen_werden.29 Vergleich der AVR-Taktquellen]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* AppNotes von Atmel zum Thema Quarze:&lt;br /&gt;
** [http://ww1.microchip.com/downloads/en/appnotes/atmel-2521-avr-hardware-design-considerations_applicationnote_avr042.pdf AVR042: &#039;&#039;AVR Hardware Design Considerations&#039;&#039;]&lt;br /&gt;
** [http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8128-Best-Practices-for-the-PCB-Layout-of-Oscillators_ApplicationNote_AVR186.pdf AVR186: &#039;&#039;Best Practices for the PCB layout of Oscillators&#039;&#039;]&lt;br /&gt;
* [http://www.elektroniknet.de/e-mechanik-passive/passive/artikel/85677/] Ausführungen zur Lastkapazität&lt;br /&gt;
* [http://www.engbedded.com/fusecalc Fuse Calculator]&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=101626</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=101626"/>
		<updated>2020-02-28T20:29:36Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks, Foren, Communities, Tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/en/microcontrollers/stm32h7-series.html STM32H7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** Bis 400MHz (856 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* [https://www.st.com/en/microcontrollers-microprocessors/stm32g0-series.html STM32G0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Bis 64MHz (ca. 60MIPS)&lt;br /&gt;
** 16KB...512KB Flash, bis 128KB SRAM&lt;br /&gt;
** 8-100 Pins&lt;br /&gt;
** SO-8, QFP TW im 0.8mm Raster&lt;br /&gt;
** Noch nicht alle gelisteten Varianten in Produktion (8.2019)&lt;br /&gt;
* [https://www.st.com/en/microcontrollers-microprocessors/stm32g4-series.html STM32G4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** FPU und DSP&lt;br /&gt;
** &amp;quot;Math Accelerator&amp;quot; Für Trigonometrische Funktionen, FIR, IIR&lt;br /&gt;
** Bis 170MHz (213 DMIPS)&lt;br /&gt;
** bis 512KB Flash, 128KB SRAM&lt;br /&gt;
** 48-128Pins&lt;br /&gt;
** &amp;quot;Mixed Signal MCU&amp;quot;&lt;br /&gt;
** Noch nicht alle gelisteten Varianten in Produktion (8.2019)&lt;br /&gt;
&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0(+) / Cortex-M3 / Cortex-M4(F) / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 8 ... 216 Pins als SO, LCSP, TSSOP, QFN, QFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Zusätzliche FPU &amp;quot;Math Accelerator&amp;quot; Für Trigonom. Funktionen (CORDIC), FIR, IIR(FMAC) (STM32G4)&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* USB Type-C™ Power Delivery controller (STM32G0/G4)&lt;br /&gt;
* HDMI CEC interface (STM32G0)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library (SPL) ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Die Standard Peripheral Library ist inzwischen veraltet, ST empfiehlt, sie nicht mehr zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Cube HAL ===&lt;br /&gt;
&lt;br /&gt;
Hat seit 2012 die SPL abgelöst.&lt;br /&gt;
&lt;br /&gt;
* https://www.st.com/en/embedded-software/stm32cube-mcu-packages.html&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [https://gnu-mcu-eclipse.github.io/ GNU ARM Plug-in](Linux, Windows)&lt;br /&gt;
** [https://atollic.com/truestudio/ TrueStudio for STM32] basiert auf Eclipse&lt;br /&gt;
** [http://www.openstm32.org/Downloading+the+System+Workbench+for+STM32+installer System Workbench for STM32] basiert auf Eclipse&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#Fertige_GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
** [https://github.com/blacksphere/blackmagic/wiki Black Magic Probe] als Mikrocontrollerfirmware simuliert einen seriellen Port, der direkt von GDB verwendet werden kann. Für FTDI-MPPSE basierte Adapter und ST-Link V2  läuft Blackmagic auf dem Host und stellt den Port :2000 für GDB zur Verfügung. Stlinks können, so man sich Programmierzugang zu dem STM32F103 des Stlinks beschaffen kann, auch mit BMP Firmware umgeflasht werden.&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist eine vollständige Entwicklungsplattform für diverse ARM-Controller auf Basis eines RTOS mit Hardware-Abstraktion und webbasierter Online-sowie Offline-IDE. Ähnlich dem Arduino-Konzept können mit mbed einfachere Aufgaben schnell umgesetzt werden. mbed basiert auf C++ und unterstützt verschiedene Compiler. Projekte können auch exportiert und für andere IDEs heruntergeladen werden. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com Atollic TrueStudio] wurde seit der Übernahme durch ST auf STM32 Mikrocontroller reduziert und ist jetzt kostenlos verfügbar. Basiert auf Eclipse, OpenOCD und [[ARM GCC]]. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4, die aber mittlerweile nicht mehr weiterentwickelt wird. Basiert auf dem [[ARM GCC]] und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf [[ARM GCC]] aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler ([[ARM GCC]]), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks. Artikel: [[STM32 - Einstieg mit Em::Blocks]]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
* [[ARM-ASM-Tutorial|Tutorial zu ARM-Assembler unter Windows/Linux (Englisch)]]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
* [[USB-Tutorial mit STM32]] enthält ein vollständiges Beispielprojekt&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [https://www.hitex.com/fileadmin/documents/tools/dev_tools/dt_protected/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (falls der Link nicht mehr funktioniert, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/ libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html STM32 L0/F1/F3 Anleitung]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger &lt;br /&gt;
* [[USB-Tutorial mit STM32]]&lt;br /&gt;
* [http://www.pomad.fr/node/2 Sehr schönes STM32 Anfängertutorial mit Codeanalyse bis in die Register]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101304</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101304"/>
		<updated>2019-11-17T18:41:16Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Bei einem sogenannten [http://de.wikipedia.org/wiki/Finite_State_Machine Endlichen Zustandsautomaten] (engl. &#039;&#039;&#039;f&#039;&#039;&#039;inite &#039;&#039;&#039;s&#039;&#039;&#039;tate &#039;&#039;&#039;m&#039;&#039;&#039;achine, kurz FSM) handelt es sich um die Realisation eines Steuerungskonzeptes, welches eine abstrahierte Maschine zum Vorbild hat, die eine Reihe von Zuständen besitzt, durch die sich ihr Betriebsablauf definiert. Diese Maschine arbeitet, indem sie von einem Zustand in einen anderen Zustand übergeht und bei derartigen Zustandsübergängen und im Verharren von Zuständen bestimmte Aktionen ausführt. Dabei ergibt sich der Folgezustand aus dem momentanen Zustand und einem externen Ereignis, z. B. einem Tastendruck. Dabei ist die Maschine in verschiedenen Zuständen für ganz bestimmte Ereignisse sensibel.&lt;br /&gt;
&lt;br /&gt;
Die FSM selbst wird fast immer in irgendeiner Weise über einen Takt angetrieben, kann also nicht in beliebig kurzen Zeitspannen auf Ereignisse reagieren und Zustände wechseln. In jedem Takt wird anhand des vorliegenden Zustands und dem Status der Eingabekanäle entschieden, welcher Zustand als nächstes vorliegen soll und welche Aktionen auszuführen sind.&lt;br /&gt;
&lt;br /&gt;
Abstrahierte Formen dieser Maschine werden in vielen elektronischen Geräten eingesetzt, um Bedieneraktivitäten und andere Ereignisse im System zu verarbeiten und autark ablaufende Prozesse geeignet zu beeinflussen. Entsprechend formulierte FSMs können sowohl in Software als auch Hardware aufgebaut werden. &lt;br /&gt;
&lt;br /&gt;
Die Beschreibung einer FSM ist auf mehrere Arten möglich. Zum einen kann sie in Form einer Tabelle beschrieben werden, aber auch eine graphische Darstellung der Zustände und deren Abhängigkeiten in Form eines Zustandsdiagramms ist möglich.&lt;br /&gt;
&lt;br /&gt;
==Darstellung von Zustandsautomaten==&lt;br /&gt;
&lt;br /&gt;
Zustandsautomaten haben den großen Charme, dass es meistens leicht möglich ist, ihre Funktion durch eine Grafik zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es ist eine FSM zu entwerfen, die eine Rollosteuerung übernimmt. Es gibt einen Motor, der sich in 3 Zuständen befinden kann: stop, rauf drehend, runter drehend. Außerdem gibt es Endschalter, welche betätigt werden, wenn das Rollo die jeweilige Endposition erreicht hat. Und es gibt 2 Taster &amp;quot;Up&amp;quot; und &amp;quot;Down&amp;quot; durch welche der Benutzer den Bewegungswunsch an die FSM weitergibt. Irgendwie weiß jeder, wie so eine Rollosteuerung funktioniert, und so recht und schlecht kann das auch jeder in der einen oder anderen Form beschreiben. Aber kann man das ganze auch so &#039;beschreiben&#039;, dass man im Vorfeld, vor der Programmierung tatsächlich alle Eventualitäten erfasst und so darstellt, dass auch ein Nicht-Informatiker die Funktionsweise versteht? Genau an dieser Stelle kommt die graphische Darstellung ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Wie sieht nun eine derartige FSM aus? Jede Wolke im Bild sei ein Zustand, dem man einen Namen gibt. Die Pfeile zwischen den Wolken zeigen die Zustandsübergänge an, wobei am Pfeil vermerkt ist, unter welcher Bedingung dieser Übergang genommen werden kann (in Rot) und welche Aktionen dabei auszuführen sind (in Blau).&lt;br /&gt;
&lt;br /&gt;
[[Datei:StateRollo.jpg|center|framed|Zustandsautomat für eine Rollosteuerung]]&lt;br /&gt;
&lt;br /&gt;
Aus der Zeichnung ist ablesbar:&lt;br /&gt;
Befindet sich die Maschine im Zustand &amp;quot;unten&amp;quot; und wird die Taste &amp;quot;Up&amp;quot; gedrückt, dann folgt als Aktion, daß der Motor auf &amp;quot;rauf drehend&amp;quot; gestellt wird und gleichzeitig wechselt die Maschine in den Zustand &amp;quot;nach oben&amp;quot;. In diesem Zustand verbleibt die Maschine, während der Motor immer weiter dreht, bis der Endschalter meldet, dass das Rollo oben angekommen ist. Dies ist eine Möglichkeit wie die Maschine den Zustand &amp;quot;nach oben&amp;quot; verlassen kann. In diesem Fall wird dann der Motor abgeschaltet und die Maschine wechselt in den Zustand &amp;quot;oben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Man sieht hier schon, dass es mit so einer Grafik relativ einfach ist, sich von der korrekten Logik zu überzeugen. In einfachsten Fall legt man zur Simulation einfach einen Gegenstand in die betreffende Wolke, die den gerade aktiven Zustand symbolisiert. Danach geht man alle Möglichkeiten durch, wie diese Maschine von aussen (Taster, Schalter, etc) beeinflusst werden kann und sieht sich an, ob es dafür in der Grafik einen Pfeil gibt, der von der aktiven Wolke wegführt. Gibt es keinen, dann passiert auch nichts. Gibt es einen, dann verschiebt man den Gegenstand in die betreffende Wolke und führt (in Gedanken) die Aktion aus. Auf die Art kann man ganz leicht einige typische Benutzerszenarien durchspielen aber auch ausprobieren, ob man alle Eventualitäten berücksichtigt hat. Denn gerade diese Evantualitäten, an die man am Anfang gar nicht denkt, die sind es, die einem in weiterer Folge oft Probleme bereiten.&lt;br /&gt;
&lt;br /&gt;
Um bei der Rollosteuerung zu bleiben: Was soll denn passieren, wenn das Rollo gerade hochfährt und der Benutzer ein weiteres mal auf &amp;quot;Up&amp;quot; drückt? Oder wenn er auf &amp;quot;Down&amp;quot; drückt? In der Grafik ist ersichtlich, wie in diesem Fall zu verfahren ist. (Und Hand aufs Herz: Hätten Sie daran gedacht, dass diese Fälle zu berücksichtigen sind, als sie &#039;Rollosteuerung&#039; gelesen haben?)&lt;br /&gt;
&lt;br /&gt;
==Implementierungsvariationen==&lt;br /&gt;
&lt;br /&gt;
Der konkrete softwaremässige Aufbau einer FSM kann in weiten Grenzen variieren. Das grundlegende Konzept, Aktionen an Zustände zu knüpfen und logische Abläufe an die Abfolge von Zuständen zu binden, bleibt dabei in allen Fällen erhalten. Aber je nach Lust und Laune und dem Können des Programmierers gibt es viele unterschiedliche Möglichkeiten eine FSM zu implementieren. Ziel ist es dabei immer, die eigentliche Maschine, also das was in der Zustandstabelle ausgedrückt wird, so einfach und überschaubar wie möglich zu präsentieren. Sie implementiert die Logik und definiert was die Maschine eigentlich macht und warum sie es macht. Ein einfacher Ansatz ist die Verwendung des C-Konstukts switch, in der in jedem case-zweig die einzelnen Zustände kodiert werden. Es ist aber auch durchaus möglich eine universelle FSM zu bauen, bei denen eine generische Funktion die Tabelle in Arrayform bekommt und zusammen mit einigen globalen Variablen die Maschine implementiert. Oft wird auch eine Statemaschine dadurch gebaut, indem das zentrale switch-case Konstukt der Sprache [C] durch einen einzelnen [[Funktionszeiger in C | Funktionszeiger]] ersetzt wird und jeder Zustand nichts anderes als eine Funktion ist. Der Übergang von einem Zustand in einen anderen Zustand ist dann nichts anderes als das Zuweisen einer Funktion an diesen Funktionszeiger. Oder aber man kombiniert Tabelle und Funktionszeiger in ein gemeinsames Konzept.&lt;br /&gt;
&lt;br /&gt;
==Grundlegender Aufbau==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird eine FSM in Software verwirklicht, welche die Ampelsteuerung einer Kreuzung übernimmt.&lt;br /&gt;
[[Bild:Statemachine_Kreuzung.png|center|framed|Ampeln an einer Kreuzung]]&lt;br /&gt;
&lt;br /&gt;
Die Abfolge der Lichtzeichen einer einzelnen Ampel ist dabei&lt;br /&gt;
&amp;lt;br&amp;gt;[[Bild:Statemachine_Ampel.png|center|framed|Zustände einer einzelnen Ampel]]&lt;br /&gt;
&lt;br /&gt;
Die komplette Lichtfolge aller Ampeln in der Kreuzung stellt sich dann wie folgt dar: Es ist dabei ausreichend, nur Ampel 1 und Ampel 2 zu betrachten, da Ampel 3 bzw. Ampel 4 die jeweils gleichen Lichtsignale anzeigen. Dies muss nicht immer so sein! Auf einer Kreuzung kann es durchaus für eine Fahrtrichtung Zusatzampeln geben, die die Lichtfolge der Hauptampel modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustandsnummer ist in diesem Fall einfach die Taktung der FSM. Verfolgt man die Zustände von einem Zustand zum nächsten, dann kann man sich sehr leicht davon überzeugen, daß die Lichtfolge der beiden Ampeln tatsächlich der gewünschten Abfolge entspricht.&lt;br /&gt;
&lt;br /&gt;
Hat man die Funktionalität einer FSM erst mal soweit in Tabellenform festgelegt, dann ist es sehr einfach daraus ein Programm in einer Programmiersprache wie z.B. C abzuleiten, welches diese Statemachine implementiert.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man dabei folgenden Aufbau vornehmen:&lt;br /&gt;
* Es gibt eine globale Variable, die den aktuellen Zustand der Maschine repräsentiert. Die Zustände wurden in obiger Tabelle bereits durchnummeriert, so dass es sich anbietet, Zustände innerhalb der Maschine durch ebendiese Zahlen darzustellen.&lt;br /&gt;
* Die FSM wird als Funktion implementiert, die für jeden einzelnen Takt aufgerufen wird.&lt;br /&gt;
* Jeder Zustand wird innerhalb der Funktion durch einen case innerhalb einer  switch Anweisung dargestellt.&lt;br /&gt;
* Jeder Zustand kann vor verlassen der Funktion den aktuellen Zustand der FSM beim nächsten Aufruf der Funktion festlegen, indem er an die globale Variable die Nummer des nächsten Zustands zuweist.&lt;br /&gt;
* Jegliche Form von Warteschleifen innerhalb der FSM sind verboten. Wenn die FSM auf ein Ereignis warten müsste, dann ist dafür ein eigener Zustand vorzusehen, der auf das Eintreten des Ereignisses prüft und nur dann den nächsten Zustand auswählt, wenn das Ereignis tatsächlich eingetreten ist. Damit erreicht man [[Multitasking]].&lt;br /&gt;
* Es ist sinnvoll, den Ampelfarben Namen in Form eines #define oder enums zu geben, damit wird das Konstrukt deutlich leichter lesbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );  // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );  // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
&lt;br /&gt;
unsigned char state = 1;   // globale Variable, die den Status repräsentiert&lt;br /&gt;
&lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      state = 2;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = 3;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 4;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 4:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 5;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 5:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 6;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 6:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 7;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 7:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 8;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 8:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = 1;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    stateMachine();&lt;br /&gt;
    delay_ms( 1000 );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird diese Funktion im Sekundentakt aufgerufen, so werden die Funktionen Ampel1() bzw. Ampel2() mit der jeweils richtigen Lichtstellung in der richtigen Reihenfolge aufgerufen um die Lichtwechsel der Ampeln einer Kreuzung zu realisieren. Der Einfachheit halber wird in diesem Beispiel die Funktion delay_ms() verwendet. Praktisch wird man in den meisten Fällen besser einen [[Timer]] benutzen, um die Statemachine periodisch aufzurufen. Wie das geht und was das für Vorteile hat ist im Artikel [[Multitasking#Verbesserter Ansatz mit Timer | Multitasking]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Reaktionen auf äußere Ereignisse==&lt;br /&gt;
&lt;br /&gt;
Obige Statemaschine ist noch sehr primitiv. Angenommen an dieser Ampelkreuzung gibt es eine Induktionsschleife. Diese sei derartig geschaltet, dass die Hauptrichtung über Ampel2/Ampel4 ständig Grün zeigt und nur bei Annäherung eines Fahrzeugs auf der Strecke Ampel1/Ampel3 wird ein Lichtwechselzyklus durchgeführt, um diesem Fahrzeug die geordnete Durchfahrt zu ermöglichen. Die Statemaschine muss daher auf ein äußeres Ereignis reagieren können. Der Übergang von Zustand 1 in Zustand 2 ist von diesem Ereignis abhängig. Nur wenn es auftritt wird dieser Übergang durchgeführt, ansonsten verbleibt die Maschine im Zustand 1. Die Beschreibung der FSM wird also um einen weiteren Tabelleneintrag ergänzt, in dem festgehalten wird, wie mit dem zusätzlichen Eingang verfahren werden soll. In dieserm erweiterten Beispiel sollen die Zustände mit einem aussagekräftigen Namen versehen werden, denn Menschen sind sehr schlecht im Umgang mit abstrakten Zahlen, sie sind viel besser mit Wörtern vertraut. Die x in der Tabellenspalte &amp;quot;Induktionsschleife&amp;quot; besagen, daß dieses Eingangsignal für die Entscheidungen der Statemaschine keine Rolle spielt (engl. don&#039;t care).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!| Zustand ||| Name ||| Ampel 1 || | Ampel 2 ||  Induktionsschleife || | nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || OSTWEST_GRUEN      || rot     ||  grün      || ==1 ? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || OSTWEST_GELB       || rot     ||  gelb      || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || ALLE_ROT_1         || rot     ||  rot       || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || NORDSUED_ROTGELB   ||rot/gelb ||  rot       || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || NORDSUED_GRUEN     || grün    ||  rot       || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || NORDSUED_GELB      || gelb    ||  rot       || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || ALLE_ROT_2         || rot     ||  rot       || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || OSTWEST_ROTGELB    || rot     ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB, ALLE_ROT_2} state_t ;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLE_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLE_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Warteschleifen==&lt;br /&gt;
&lt;br /&gt;
Das Warten auf ein äußeres Ereignis kann mit dem Verzweigen oder auch nicht Verzweigen in einen anderen Zustand realisiert werden. In obiger Statemaschine soll z.B. die Grünphase der Ampel1 von einem Takt auf 5 Takte angehoben werden. Grundfalsch wäre es, dies jetzt mit einer while-Schleife im Zustand 5 zu realisieren. Warten wird immer über zusätzliche Zustände realisiert. Eine Statemaschine darf innerhalb eines Zustands niemals auf etwas warten, sondern muss so schnell als möglich die Kontrolle wieder abgeben. Geht man naiv an die Sache ran, dann könnte man die 5 Takte über die Einführung von zusätzlichen Zuständen leicht erreichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| Induktionsschleife ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || grün ||  rot  || x || 10&lt;br /&gt;
|-&lt;br /&gt;
| 10 || grün ||  rot  || x || 11&lt;br /&gt;
|-&lt;br /&gt;
| 11 || grün ||  rot  || x || 12&lt;br /&gt;
|-&lt;br /&gt;
| 12 || grün ||  rot  || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daß ein derartiges Vorgehen bei längeren Wartezeiten oder gar bei berechneter Wartezeitdauer nicht praktikabel ist, dürfte auf der Hand liegen. Besser ist daher die Einführung eines internen Zählers sowie nur eines einzigen, neuen Wartezustands. Beginnt die Wartezeit wird der Zähler auf einen Wert entsprechend der Wartezeit gestellt. Im neuen Zustand wird der Zähler um 1 verringert und nur dann, wenn der Zähler 0 erreicht hat, wird in den ursprünglichen Folgezustand gewechselt. Der Zähler kann also in ähnlicher Form wie die Induktionsschleife als Ereignislieferant aufgefasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:15em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Zustand ||width=&amp;quot;10%&amp;quot;| Ampel 1 ||width=&amp;quot;10%&amp;quot;| Ampel 2 ||width=&amp;quot;10%&amp;quot;| Induktionsschleife ||width=&amp;quot;10%&amp;quot;| Wartezeit ||width=&amp;quot;10%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1 ? || x || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x || x || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || =4 || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || x ||  x  || x || dec / ==0 ? || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB,&lt;br /&gt;
               ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB,&lt;br /&gt;
               ALLE_ROT_2, WARTE_NORDSUED}  state_t;&lt;br /&gt;
 &lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
unsigned char zaehler;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLES_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      zaehler = 4;&lt;br /&gt;
      state = WARTE_NORDSUED;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case WARTE_NORDSUED:&lt;br /&gt;
      zaehler = zaehler - 1;&lt;br /&gt;
      if( zaehler == 0 )&lt;br /&gt;
        state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Tabellenform ==&lt;br /&gt;
&lt;br /&gt;
Im letzten Beispiel wollen wir die Ampelsteuerung noch etwas realistischer gestalten. Denn die einzelnen Phasen sind unterschiedlich lang, der Zustand Gelb ist deutlich kürzer als der Zustand Grün. Wenn wir also in fast jedem Zustand eine bestimmte Anzahl Takte warten wollen, erscheint es nicht sinnvoll, dafür jedesmal einen neuen Zustand anzuspringen. Sinnvoller ist die Integration des Wartens direkt in den Zustand, so wie im vorherigen Beispiel der Zustand &amp;quot;WARTE_NORDSUED&amp;quot;. Dabei fallen jedoch zwei Sachen auf.&lt;br /&gt;
&lt;br /&gt;
* In jedem Zustand muss die Wartezeit des &#039;&#039;nächsten&#039;&#039; Zustands zugewiesen werden. Das ist etwas verwirrend.&lt;br /&gt;
* Fast alle Anweisungen sind gleich in den Zuständen, nur die Zahlen und der Wert für den nächsten Zustand ändern sich.&lt;br /&gt;
&lt;br /&gt;
Darum soll hier die FSM von einer großen switch Anweisung auf eine Tabelle geändert werden. Das hat den Vorteil, dass die Zustandstabelle nahezu 1:1 in den Quelltext geschrieben werden kann und sie so sehr kompakt und übersichtlich ist. Die eigentliche FSM wird sehr klein und arbeitet sich durch die Tabelle durch. Zur weiteren Verbesserung der Lesbarkeit (siehe [[Strukturierte Programmierung auf Mikrocontrollern]]) nutzen wir einen Struct, welche den Zustand der State machine mit sinnvollen Variablennamen beschreibt. Bei dieser Methode muss man beachten, dass die Reihenfolge der Zustände in der enum Definition gleich sein muss mit der Reihenfolge der Zustände in der Tabelle, sonst funktioniert es nicht. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define GRUEN     2&lt;br /&gt;
#define GELB      4&lt;br /&gt;
#define ROTGELB   5&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
int Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
 &lt;br /&gt;
typedef enum { OSTWEST_GRUEN=0, OSTWEST_GELB, ALLE_ROT_1,&lt;br /&gt;
               NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_2,&lt;br /&gt;
               OSTWEST_ROTGELB }  state_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int Ampel1;&lt;br /&gt;
    int Ampel2;&lt;br /&gt;
    int I_Schleife;&lt;br /&gt;
    int Wartezeit;&lt;br /&gt;
    int Naechster;&lt;br /&gt;
} ampel_state_t;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
int zaehler=1;&lt;br /&gt;
 &lt;br /&gt;
// Tabelle fuer state machine&lt;br /&gt;
 &lt;br /&gt;
ampel_state_t state_table[8] = {&lt;br /&gt;
 &lt;br /&gt;
// AMPEL1 AMPEL2   Induktionsschleife ? &lt;br /&gt;
// |         |       |   Wartezeit in s&lt;br /&gt;
// |         |       |   |&lt;br /&gt;
// |         |       |   |   naechster Zustand     Name&lt;br /&gt;
//----------------------------------------------------------------------&lt;br /&gt;
{ROT     , GRUEN   , 1, 10,  OSTWEST_GELB},        // OSTWEST_GRUEN&lt;br /&gt;
{ROT     , GELB    , 0,  1,  ALLE_ROT_1},          // OSTWEST_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  NORDSUED_ROTGELB},    // ALLE_ROT_1&lt;br /&gt;
{ROTGELB , ROT     , 0,  1,  NORDSUED_GRUEN},      // NORDSUED_ROTGELB&lt;br /&gt;
{GRUEN   , ROT     , 0, 10,  NORDSUED_GELB},       // NORDSUED_GRUEN&lt;br /&gt;
{GELB    , ROT     , 0,  1,  ALLE_ROT_2},          // NORDSUED_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  OSTWEST_ROTGELB},     // ALLE_ROT_2&lt;br /&gt;
{ROT     , ROTGELB , 0,  1,  OSTWEST_GRUEN}};      // OSTWEST_ROTGELB&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
    Ampel1(state_table[state].Ampel1);&lt;br /&gt;
    Ampel2(state_table[state].Ampel2);&lt;br /&gt;
 &lt;br /&gt;
    if (zaehler&amp;gt;0) {&lt;br /&gt;
        zaehler--;    &lt;br /&gt;
    } else {&lt;br /&gt;
        if ( ((state_table[state].I_Schleife == 1) &amp;amp;&amp;amp; Induktionsschleife() ) ||&lt;br /&gt;
             (state_table[state].I_Schleife == 0) )&lt;br /&gt;
        {&lt;br /&gt;
            state =   state_table[state].Naechster;&lt;br /&gt;
            zaehler = state_table[state].Wartezeit;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierung einer objektorientierten Finite State Machine in C++==&lt;br /&gt;
&lt;br /&gt;
* Notation von Endlichen Automaten in UML&lt;br /&gt;
* Praktisches Beispiel, anhand dessen die Funktionsweise eines Toasters erklärt wird. Dazu wird die Notation in UML verwendet. &lt;br /&gt;
* Implementation des Beispiels in C++ auf einem AVR-Controller&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Möglichkeit bzw. das Beispiel sollte als Denkanstoss verstanden werden und nicht als Referenzimplementation. Es wurden bewusst bestimmte Feinheiten von endlichen Automaten verzichtet, um das Beispiel auf gut verständlichem Niveau zu halten. &lt;br /&gt;
&lt;br /&gt;
* Dokumentation im PDF Format [http://www.mikrocontroller.net/attachment/137066/ImplementierungEinerFiniteStateMachine_V1.1.pdf ImplementierungEinerFiniteStateMachine_V1.1.pdf]&lt;br /&gt;
* LaTeX Source der Dokumentation [http://www.mikrocontroller.net/attachment/137067/Dokumentation_Source_V1.1.zip Dokumentation_Source_V1.1.zip]&lt;br /&gt;
* Beispielcode für AVR-Studio 4 [http://www.mikrocontroller.net/attachment/135434/AVR_Beispiel_Source.zip AVR_Beispiel_Source.zip]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/248837#2556592 Forumsbeitrag]: Eine objektorientierte State Machine in C++&lt;br /&gt;
&lt;br /&gt;
== Grafische Modellierung einer Finite State Machine ==&lt;br /&gt;
Das Open Source Werkzeug Yakindu Statechart Tools (http://www.statecharts.org) ermöglicht es Zustandsautomaten grafisch zu modellieren, deren Verhalten zu simulieren und Code für verschiedene Sprachen (C/C++, Java) zu generieren.&lt;br /&gt;
Die grafischen Modellelemente entsprechen denen der UML2 und werden durch eine einfache und zweckmäßige Expression-Language ergänzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfaches Ampel Modell&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Modell einer einfachen Ampel wie oben beschrieben sieht in Yakindu SCT wie folgt aus: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1.jpg|center|framed|Einfaches Ampel Modell]]&lt;br /&gt;
&lt;br /&gt;
Wie erwartet hat die Ampel vier Zustände, die wiederum mit Übergangs-Pfeilen (Transitionen) verbunden sind. Jede Transition verfügt über einen Auslöser, in diesem Fall mit dem Namen &#039;&#039;tick&#039;&#039;    &lt;br /&gt;
Mit Hilfe der Yakindu DSL wird im linken Teil des Editors ein internes Event mit dem Name &amp;quot;tick&amp;quot; definiert, das entsprechend der Taktung des Zustandsautomaten &amp;quot;gefeuert&amp;quot; werden soll. Der Ausdruck &#039;&#039;every 1s / raise tick&#039;&#039; sorgt dafür, dass das Event &#039;&#039;tick&#039;&#039; jede Sekunde einmal gefeuert wird.&lt;br /&gt;
Da Yakindu SCT es erlaubt Zustandsautomaten zu simulieren, ist es jederzeit überprüfbar ob das modellierte Verhalten den Erwartungen entspricht. Über &#039;&#039;Run as... --&amp;gt; YAKINDU Statechart&#039;&#039; lässt sich in die &#039;&#039;Simulation View&#039;&#039; wechseln. Der jeweils aktive Zustand wird nun rot hinterlegt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1b.jpg|center|framed|Simulation View]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfache Kreuzung mit Zwei Ampel-Gruppen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im zweiten Beispiel soll eine einfache Ampelkreuzung modelliert werden. Es wird davon ausgegangen, dass die Ampeln in zwei Gruppen geschaltet werden. Ampel 1 und 3 bilden die nord_süd – Gruppe, während die übrigen Ampeln die ost-west – Gruppe bilden. Der Einfachheit halber werden Ampeln einer Gruppe immer gleich geschaltet. Wie oben darf eine Ampel-Gruppe nur dann den Zustand &#039;&#039;rot&#039;&#039; verlassen, wenn die jeweils andere Gruppe sich im Zustand &#039;&#039;rot&#039;&#039; befindet. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel2.jpg|800px|center|Ampelkreuzung]]&lt;br /&gt;
&lt;br /&gt;
Im Yakindu SCT Modell gibt es nun für jede Ampel-Gruppe eine eigene Region. Wird der Zustandsautomat betreten so wird nun parallel der Zustand &#039;&#039;rot&#039;&#039; in der &#039;&#039;nord_sued&#039;&#039; Region und der Zustand &#039;&#039;gruen&#039;&#039; in der &#039;&#039;ost_west&#039;&#039; Region aktiv. Wie bereits im ersten Beispiel wird der Zustandsautomat über das &#039;&#039;tick&#039;&#039; Ereignis angetrieben, das jede Sekunde einmal auftritt. &lt;br /&gt;
Um das gewünschte Ampel-Verhalten zu modellieren wird nun die Transition von &#039;&#039;rot&#039;&#039; zu &#039;&#039;rot-gelb&#039;&#039; mit einem &#039;&#039;Guard&#039;&#039;, also einer Bedingung geschützt. Zwar wird der Übergang weiterhin mit dem Ereignis &#039;&#039;tick&#039;&#039; angestoßen, allerdings wird der Übergang nur ausgeführt wenn die in eckigen Klammern formulierte Boolesche-Bedingung erfüllt ist. Die Funktion &#039;&#039;active()&#039;&#039; gehört zu den Bordmitteln von Yakindu SCT und prüft ob ein bestimmter Zustand aktiv ist. In diesem Beispiel kann in der Region &#039;&#039;nord_sued&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; nur verlassen werden, wenn in der Region &#039;&#039;ost-west&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; aktiv ist. Wie auch im vorhergegangenen Beispiel lässt sich das Verhalten simulieren, so das überprüft werden kann ob das Verhalten den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ampel mit Induktionsschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Verhalten der Ampelanlage aus Beispiel 2 soll um eine Induktionsschleife erweitert werden. Der Verkehr an der Ampelanlage fließt normalerweise in &#039;&#039;ost_west&#039;&#039; – Richtung, daher die Ampel in dieser Richtung immer den Zustand &#039;&#039;grün&#039;&#039; haben, es sei denn die Induktionsschleife in &#039;&#039;nord-süd&#039;&#039; - Richtung wird ausgelöst.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel3.jpg|800px|center|Ampelkreuzung mit Induktionsschleife]]&lt;br /&gt;
&lt;br /&gt;
Um dieses Verhalten in das SCT-Modell zu integrieren muss zunächst ein neues Ereignis definiert werden. Dieses Ereignis wird als Teil des &#039;&#039;Interface-Scopes&#039;&#039; definiert, da es außerhalb des Zustandsautomaten erzeugt werden soll. Ereignisse die Teil einer externen Schnittstelle sind werden mit einer Richtung (in / out) deklariert, die angibt ob das Ereignis den Zustandsautomat betritt, oder verlässt. &lt;br /&gt;
&lt;br /&gt;
Nach dem das neue Ereignis definiert ist,  muss nur noch der Auslöser für den Übergang von &#039;&#039;gruen&#039;&#039; zu &#039;&#039;gelb&#039;&#039; geändert werden. Statt wie bisher durch das &#039;&#039;tick&#039;&#039; Event, wird nun das &#039;&#039;induktionsSignal&#039;&#039; als Auslöser verwendet. In der Simulations-Ansicht kann das neue Ereignis manuell mit einem Klick ausgelöst werden, so dass das korrekte Verhalten wieder getestet werden kann.   &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_simView.jpg|center|framed|Induktionsschleife auslösen]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warteschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es soll die Grün-Phase verlängert werden, so dass erst nach dem 5. &#039;&#039;tick&#039;&#039; der Übergang in den &#039;&#039;gelb&#039;&#039; Zustand erfolgt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct beispiel4.jpg|800px|center|Ampelkreuzung mit Warteschleife]]&lt;br /&gt;
&lt;br /&gt;
Um eine Warteschleife zu realisieren wird dem &#039;&#039;Internal-Scope&#039;&#039; zuerst eine neue Variable hinzugefügt. Da während des Wartens der &#039;&#039;grün&#039;&#039; Zustand nicht verlassen wird, lässt sich das Herunterzählen der Wartezeit mittels eines zusammengesetzten Zustands darstellen. Wird der Zustand &#039;&#039;grün&#039;&#039; betreten, wird zunächst einen Eintritts-Aktion ausgeführt, die den Wert von &#039;&#039;wartezeit&#039;&#039; auf 5 setzt. Außerdem wird ebenfalls der Zustand &#039;&#039;Warten&#039;&#039; aktiv. Erfolgt nun ein &#039;&#039;tick&#039;&#039; wird ohne &#039;&#039;grün&#039;&#039; zu verlassen in &#039;&#039;WartezeitVerringern&#039;&#039; gewechselt und der Wert von &#039;&#039;wartezeit&#039;&#039; um 1 verringert. &lt;br /&gt;
Der Übergang zu &#039;&#039;gelb&#039;&#039; ist wieder durch einen Guard geschützt und kann nur erfolgen wenn die  Bedingung &#039;&#039;wartezeit == 0&#039;&#039; erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Code aus dem Modell generieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um nun Code aus dem Modell zu generieren muss zuerst eine GeneratorModel-Datei erzeugt werden, in der unter anderem die Ziel-Sprache angegeben wird.&lt;br /&gt;
Um den Zustandsautomaten abzubilden verwendet die konkrete Implementierung ein &#039;&#039;switch case&#039;&#039; Konstrukt, das dem oben Gezeigten ähnelt. Außerdem wurde ein &#039;&#039;code-only&#039;&#039; Ansatz verfolgt, so dass keine externen Bibliotheken oder Frameworks benötigt werden. Das komplette Eclipse Projekt kann [http://statecharts.org/Examples/ampel.zip hier] runtergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Realisation von FSMs in Hardware ==&lt;br /&gt;
=== Aufbau einer FSM in digitalen Chips ===&lt;br /&gt;
&lt;br /&gt;
Sollen sehr schnelle Steuerungen und Entscheider aufgebaut werden, wurden und werden digitale Bausteine mit Logikgattern verdrahtet, die steuerbare Zähler enthalten. Damit lassen sich effektive Taktgeschwindigkeiten im Bereich von mehreren MHz erreichen, die in Sicherheitsbereichen eingesetzt werden. Oft werden solche Schaltungen auch zur Überwachung von anderen Schaltungsteilen eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Früher wurden fast alle logischen Schaltungen auf diese Weise entworfen, z.B. auch die ersten Computer von IBM.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung von FSMs in programmierbarer Hardware ===&lt;br /&gt;
&lt;br /&gt;
Da heute digitale Hardware vielfach in Form programmierter PLD- und [[FPGA]]-Bausteine eingesetzt wird, verlagert sich der Entwurf der FSM mehr zu Softwareentwicklung hin. Dabei besteht je nach Vorliegen der funktionellen Beschreibung und eventueller Primärinformation die Möglichkeit, ein Abbild der digitalen Schaltung in VHDL zu formulieren und zu importieren, bzw. ein klassisches state diagram neu zu entwerfen oder die Zustandswechsel in Tabellenform zu importieren und das Erzeugerwerkzeug die FSM generieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Letztendlich kann in Hardware jede sequentielle Logikschaltung, welche [[FlipFlop]]s und Dekoder enthält als FSM betrachtet werden, egal ob es ein einfaches Schieberegister oder eine komplexe ALU einer CPU ist. Die einfachste, denkbare FSM ist ein Toggle-FlipFlop, welches mit jedem Takt seinen Ausgangszustand wechselt.&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsvergleich ==&lt;br /&gt;
In Software realisierte state machines erreichen unter C++ in Windows auch bei hoher Prozessauslastung selten niedrigere Reaktionszeiten als im Millisekundenbereich. Die damit in Echtzeit erfassbaren und prozessierbaren externen Ereignisse bewegen sich üblicherweise im Bereich von einigen 100Hz. Mit Microcontrollern und DSPs erreicht man mit Nicht-Multi-tasking-FSMs Abtastraten bis einige 100kHz. In VHDL realisierte state machines besitzen je nach FPGA-Familie, Art der Codierung und Zyklustiefe typische Taktfrequenzen von 10...100MHz.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.aqdi.com/state.htm Using State Machines In Your Designs] (C) 2003 Hank Wallace&lt;br /&gt;
* [http://qfsm.sourceforge.net/ Qfsm] - A graphical tool for designing finite state machines (GPL)&lt;br /&gt;
* [https://www.itemis.com/en/yakindu/statechart-tools/ YAKINDU Statechart Tools] Ein Werkzeug zum Modellieren und Simulieren von Statecharts sowie Code-Generatoren für Java, C und C++. &lt;br /&gt;
* [http://www.sinelabore.com www.sinelabore.com] Ein Werkzeug das aus UML State Machines C-Code speziell für eingebettete Systeme erzeugt.&lt;br /&gt;
* [http://smc.sourceforge.net SMC The State Machine Compiler]&lt;br /&gt;
* [http://block-net.de/Programmierung/cpp/fsm/fsm.html C/C++ event driven FSM] Open source Werkzeug zur Generierung von C++ FSM Code und UML Diagramm mittels Transitionstabelle. &lt;br /&gt;
* http://astade.tigris.org/ -&amp;gt; http://wiki.astade.de/dokuwiki/doku.php (https://www.mikrocontroller.net/search?query=astade)&lt;br /&gt;
* [http://stefanfrings.de/multithreading_arduino/index.html Multithreading mit/ohne Arduino] von Stefan Frings&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101303</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101303"/>
		<updated>2019-11-17T17:49:14Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Bei einem sogenannten [http://de.wikipedia.org/wiki/Finite_State_Machine Endlichen Zustandsautomaten] (engl. &#039;&#039;&#039;f&#039;&#039;&#039;inite &#039;&#039;&#039;s&#039;&#039;&#039;tate &#039;&#039;&#039;m&#039;&#039;&#039;achine, kurz FSM) handelt es sich um die Realisation eines Steuerungskonzeptes, welches eine abstrahierte Maschine zum Vorbild hat, die eine Reihe von Zuständen besitzt, durch die sich ihr Betriebsablauf definiert. Diese Maschine arbeitet, indem sie von einem Zustand in einen anderen Zustand übergeht und bei derartigen Zustandsübergängen und im Verharren von Zuständen bestimmte Aktionen ausführt. Dabei ergibt sich der Folgezustand aus dem momentanen Zustand und einem externen Ereignis, z. B. einem Tastendruck. Dabei ist die Maschine in verschiedenen Zuständen für ganz bestimmte Ereignisse sensibel.&lt;br /&gt;
&lt;br /&gt;
Die FSM selbst wird fast immer in irgendeiner Weise über einen Takt angetrieben, kann also nicht in beliebig kurzen Zeitspannen auf Ereignisse reagieren und Zustände wechseln. In jedem Takt wird anhand des vorliegenden Zustands und dem Status der Eingabekanäle entschieden, welcher Zustand als nächstes vorliegen soll und welche Aktionen auszuführen sind.&lt;br /&gt;
&lt;br /&gt;
Abstrahierte Formen dieser Maschine werden in vielen elektronischen Geräten eingesetzt, um Bedieneraktivitäten und andere Ereignisse im System zu verarbeiten und autark ablaufende Prozesse geeignet zu beeinflussen. Entsprechend formulierte FSMs können sowohl in Software als auch Hardware aufgebaut werden. &lt;br /&gt;
&lt;br /&gt;
Die Beschreibung einer FSM ist auf mehrere Arten möglich. Zum einen kann sie in Form einer Tabelle beschrieben werden, aber auch eine graphische Darstellung der Zustände und deren Abhängigkeiten in Form eines Zustandsdiagramms ist möglich.&lt;br /&gt;
&lt;br /&gt;
==Darstellung von Zustandsautomaten==&lt;br /&gt;
&lt;br /&gt;
Zustandsautomaten haben den großen Charme, dass es meistens leicht möglich ist, ihre Funktion durch eine Grafik zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es ist eine FSM zu entwerfen, die eine Rollosteuerung übernimmt. Es gibt einen Motor, der sich in 3 Zuständen befinden kann: stop, rauf drehend, runter drehend. Außerdem gibt es Endschalter, welche betätigt werden, wenn das Rollo die jeweilige Endposition erreicht hat. Und es gibt 2 Taster &amp;quot;Up&amp;quot; und &amp;quot;Down&amp;quot; durch welche der Benutzer den Bewegungswunsch an die FSM weitergibt. Irgendwie weiß jeder, wie so eine Rollosteuerung funktioniert, und so recht und schlecht kann das auch jeder in der einen oder anderen Form beschreiben. Aber kann man das ganze auch so &#039;beschreiben&#039;, dass man im Vorfeld, vor der Programmierung tatsächlich alle Eventualitäten erfasst und so darstellt, dass auch ein Nicht-Informatiker die Funktionsweise versteht? Genau an dieser Stelle kommt die graphische Darstellung ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Wie sieht nun eine derartige FSM aus? Jede Wolke im Bild sei ein Zustand, dem man einen Namen gibt. Die Pfeile zwischen den Wolken zeigen die Zustandsübergänge an, wobei am Pfeil vermerkt ist, unter welcher Bedingung dieser Übergang genommen werden kann (in Rot) und welche Aktionen dabei auszuführen sind (in Blau).&lt;br /&gt;
&lt;br /&gt;
[[Datei:StateRollo.jpg|center|framed|Zustandsautomat für eine Rollosteuerung]]&lt;br /&gt;
&lt;br /&gt;
Aus der Zeichnung ist ablesbar:&lt;br /&gt;
Befindet sich die Maschine im Zustand &amp;quot;unten&amp;quot; und wird die Taste &amp;quot;Up&amp;quot; gedrückt, dann folgt als Aktion, daß der Motor auf &amp;quot;rauf drehend&amp;quot; gestellt wird und gleichzeitig wechselt die Maschine in den Zustand &amp;quot;nach oben&amp;quot;. In diesem Zustand verbleibt die Maschine, während der Motor immer weiter dreht, bis der Endschalter meldet, dass das Rollo oben angekommen ist. Dies ist eine Möglichkeit wie die Maschine den Zustand &amp;quot;nach oben&amp;quot; verlassen kann. In diesem Fall wird dann der Motor abgeschaltet und die Maschine wechselt in den Zustand &amp;quot;oben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Man sieht hier schon, dass es mit so einer Grafik relativ einfach ist, sich von der korrekten Logik zu überzeugen. In einfachsten Fall legt man zur Simulation einfach einen Gegenstand in die betreffende Wolke, die den gerade aktiven Zustand symbolisiert. Danach geht man alle Möglichkeiten durch, wie diese Maschine von aussen (Taster, Schalter, etc) beeinflusst werden kann und sieht sich an, ob es dafür in der Grafik einen Pfeil gibt, der von der aktiven Wolke wegführt. Gibt es keinen, dann passiert auch nichts. Gibt es einen, dann verschiebt man den Gegenstand in die betreffende Wolke und führt (in Gedanken) die Aktion aus. Auf die Art kann man ganz leicht einige typische Benutzerszenarien durchspielen aber auch ausprobieren, ob man alle Eventualitäten berücksichtigt hat. Denn gerade diese Evantualitäten, an die man am Anfang gar nicht denkt, die sind es, die einem in weiterer Folge oft Probleme bereiten.&lt;br /&gt;
&lt;br /&gt;
Um bei der Rollosteuerung zu bleiben: Was soll denn passieren, wenn das Rollo gerade hochfährt und der Benutzer ein weiteres mal auf &amp;quot;Up&amp;quot; drückt? Oder wenn er auf &amp;quot;Down&amp;quot; drückt? In der Grafik ist ersichtlich, wie in diesem Fall zu verfahren ist. (Und Hand aufs Herz: Hätten Sie daran gedacht, dass diese Fälle zu berücksichtigen sind, als sie &#039;Rollosteuerung&#039; gelesen haben?)&lt;br /&gt;
&lt;br /&gt;
==Implementierungsvariationen==&lt;br /&gt;
&lt;br /&gt;
Der konkrete softwaremässige Aufbau einer FSM kann in weiten Grenzen variieren. Das grundlegende Konzept, Aktionen an Zustände zu knüpfen und logische Abläufe an die Abfolge von Zuständen zu binden, bleibt dabei in allen Fällen erhalten. Aber je nach Lust und Laune und dem Können des Programmierers gibt es viele unterschiedliche Möglichkeiten eine FSM zu implementieren. Ziel ist es dabei immer, die eigentliche Maschine, also das was in der Zustandstabelle ausgedrückt wird, so einfach und überschaubar wie möglich zu präsentieren. Sie implementiert die Logik und definiert was die Maschine eigentlich macht und warum sie es macht. Ein einfacher Ansatz ist die Verwendung des C-Konstukts switch, in der in jedem case-zweig die einzelnen Zustände kodiert werden. Es ist aber auch durchaus möglich eine universelle FSM zu bauen, bei denen eine generische Funktion die Tabelle in Arrayform bekommt und zusammen mit einigen globalen Variablen die Maschine implementiert. Oft wird auch eine Statemaschine dadurch gebaut, indem das zentrale switch-case Konstukt der Sprache [C] durch einen einzelnen [[Funktionszeiger in C | Funktionszeiger]] ersetzt wird und jeder Zustand nichts anderes als eine Funktion ist. Der Übergang von einem Zustand in einen anderen Zustand ist dann nichts anderes als das Zuweisen einer Funktion an diesen Funktionszeiger. Oder aber man kombiniert Tabelle und Funktionszeiger in ein gemeinsames Konzept.&lt;br /&gt;
&lt;br /&gt;
==Grundlegender Aufbau==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird eine FSM in Software verwirklicht, welche die Ampelsteuerung einer Kreuzung übernimmt.&lt;br /&gt;
[[Bild:Statemachine_Kreuzung.png|center|framed|Ampeln an einer Kreuzung]]&lt;br /&gt;
&lt;br /&gt;
Die Abfolge der Lichtzeichen einer einzelnen Ampel ist dabei&lt;br /&gt;
&amp;lt;br&amp;gt;[[Bild:Statemachine_Ampel.png|center|framed|Zustände einer einzelnen Ampel]]&lt;br /&gt;
&lt;br /&gt;
Die komplette Lichtfolge aller Ampeln in der Kreuzung stellt sich dann wie folgt dar: Es ist dabei ausreichend, nur Ampel 1 und Ampel 2 zu betrachten, da Ampel 3 bzw. Ampel 4 die jeweils gleichen Lichtsignale anzeigen. Dies muss nicht immer so sein! Auf einer Kreuzung kann es durchaus für eine Fahrtrichtung Zusatzampeln geben, die die Lichtfolge der Hauptampel modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustandsnummer ist in diesem Fall einfach die Taktung der FSM. Verfolgt man die Zustände von einem Zustand zum nächsten, dann kann man sich sehr leicht davon überzeugen, daß die Lichtfolge der beiden Ampeln tatsächlich der gewünschten Abfolge entspricht.&lt;br /&gt;
&lt;br /&gt;
Hat man die Funktionalität einer FSM erst mal soweit in Tabellenform festgelegt, dann ist es sehr einfach daraus ein Programm in einer Programmiersprache wie z.B. C abzuleiten, welches diese Statemachine implementiert.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man dabei folgenden Aufbau vornehmen:&lt;br /&gt;
* Es gibt eine globale Variable, die den aktuellen Zustand der Maschine repräsentiert. Die Zustände wurden in obiger Tabelle bereits durchnummeriert, so dass es sich anbietet, Zustände innerhalb der Maschine durch ebendiese Zahlen darzustellen.&lt;br /&gt;
* Die FSM wird als Funktion implementiert, die für jeden einzelnen Takt aufgerufen wird.&lt;br /&gt;
* Jeder Zustand wird innerhalb der Funktion durch einen case innerhalb einer  switch Anweisung dargestellt.&lt;br /&gt;
* Jeder Zustand kann vor verlassen der Funktion den aktuellen Zustand der FSM beim nächsten Aufruf der Funktion festlegen, indem er an die globale Variable die Nummer des nächsten Zustands zuweist.&lt;br /&gt;
* Jegliche Form von Warteschleifen innerhalb der FSM sind verboten. Wenn die FSM auf ein Ereignis warten müsste, dann ist dafür ein eigener Zustand vorzusehen, der auf das Eintreten des Ereignisses prüft und nur dann den nächsten Zustand auswählt, wenn das Ereignis tatsächlich eingetreten ist. Damit erreicht man [[Multitasking]].&lt;br /&gt;
* Es ist sinnvoll, den Ampelfarben Namen in Form eines #define oder enums zu geben, damit wird das Konstrukt deutlich leichter lesbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );  // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );  // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
&lt;br /&gt;
unsigned char state = 1;   // globale Variable, die den Status repräsentiert&lt;br /&gt;
&lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      state = 2;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = 3;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 4;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 4:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 5;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 5:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 6;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 6:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 7;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 7:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 8;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 8:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = 1;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    stateMachine();&lt;br /&gt;
    delay_ms( 1000 );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird diese Funktion im Sekundentakt aufgerufen, so werden die Funktionen Ampel1() bzw. Ampel2() mit der jeweils richtigen Lichtstellung in der richtigen Reihenfolge aufgerufen um die Lichtwechsel der Ampeln einer Kreuzung zu realisieren. Der Einfachheit halber wird in diesem Beispiel die Funktion delay_ms() verwendet. Praktisch wird man in den meisten Fällen besser einen [[Timer]] benutzen, um die Statemachine periodisch aufzurufen. Wie das geht und was das für Vorteile hat ist im Artikel [[Multitasking#Verbesserter Ansatz mit Timer | Multitasking]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Reaktionen auf äußere Ereignisse==&lt;br /&gt;
&lt;br /&gt;
Obige Statemaschine ist noch sehr primitiv. Angenommen an dieser Ampelkreuzung gibt es eine Induktionsschleife. Diese sei derartig geschaltet, dass die Hauptrichtung über Ampel2/Ampel4 ständig Grün zeigt und nur bei Annäherung eines Fahrzeugs auf der Strecke Ampel1/Ampel3 wird ein Lichtwechselzyklus durchgeführt, um diesem Fahrzeug die geordnete Durchfahrt zu ermöglichen. Die Statemaschine muss daher auf ein äußeres Ereignis reagieren können. Der Übergang von Zustand 1 in Zustand 2 ist von diesem Ereignis abhängig. Nur wenn es auftritt wird dieser Übergang durchgeführt, ansonsten verbleibt die Maschine im Zustand 1. Die Beschreibung der FSM wird also um einen weiteren Tabelleneintrag ergänzt, in dem festgehalten wird, wie mit dem zusätzlichen Eingang verfahren werden soll. In dieserm erweiterten Beispiel sollen die Zustände mit einem aussagekräftigen Namen versehen werden, denn Menschen sind sehr schlecht im Umgang mit abstrakten Zahlen, sie sind viel besser mit Wörtern vertraut. Die x in der Tabellenspalte &amp;quot;Induktionsschleife&amp;quot; besagen, daß dieses Eingangsignal für die Entscheidungen der Statemaschine keine Rolle spielt (engl. don&#039;t care).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!| Zustand ||| Name ||| Ampel 1 || | Ampel 2 ||  Induktionsschleife || | nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || OSTWEST_GRUEN      || rot     ||  grün      || ==1 ? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || OSTWEST_GELB       || rot     ||  gelb      || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || ALLE_ROT_1         || rot     ||  rot       || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || NORDSUED_ROTGELB   ||rot/gelb ||  rot       || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || NORDSUED_GRUEN     || grün    ||  rot       || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || NORDSUED_GELB      || gelb    ||  rot       || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || ALLE_ROT_2         || rot     ||  rot       || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || OSTWEST_ROTGELB    || rot     ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB, ALLE_ROT_2} state_t ;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLE_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLE_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Warteschleifen==&lt;br /&gt;
&lt;br /&gt;
Das Warten auf ein äußeres Ereignis kann mit dem Verzweigen oder auch nicht Verzweigen in einen anderen Zustand realisiert werden. In obiger Statemaschine soll z.B. die Grünphase der Ampel1 von einem Takt auf 5 Takte angehoben werden. Grundfalsch wäre es, dies jetzt mit einer while-Schleife im Zustand 5 zu realisieren. Warten wird immer über zusätzliche Zustände realisiert. Eine Statemaschine darf innerhalb eines Zustands niemals auf etwas warten, sondern muss so schnell als möglich die Kontrolle wieder abgeben. Geht man naiv an die Sache ran, dann könnte man die 5 Takte über die Einführung von zusätzlichen Zuständen leicht erreichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| Induktionsschleife ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || grün ||  rot  || x || 10&lt;br /&gt;
|-&lt;br /&gt;
| 10 || grün ||  rot  || x || 11&lt;br /&gt;
|-&lt;br /&gt;
| 11 || grün ||  rot  || x || 12&lt;br /&gt;
|-&lt;br /&gt;
| 12 || grün ||  rot  || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daß ein derartiges Vorgehen bei längeren Wartezeiten oder gar bei berechneter Wartezeitdauer nicht praktikabel ist, dürfte auf der Hand liegen. Besser ist daher die Einführung eines internen Zählers sowie nur eines einzigen, neuen Wartezustands. Beginnt die Wartezeit wird der Zähler auf einen Wert entsprechend der Wartezeit gestellt. Im neuen Zustand wird der Zähler um 1 verringert und nur dann, wenn der Zähler 0 erreicht hat, wird in den ursprünglichen Folgezustand gewechselt. Der Zähler kann also in ähnlicher Form wie die Induktionsschleife als Ereignislieferant aufgefasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:15em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Zustand ||width=&amp;quot;10%&amp;quot;| Ampel 1 ||width=&amp;quot;10%&amp;quot;| Ampel 2 ||width=&amp;quot;10%&amp;quot;| Induktionsschleife ||width=&amp;quot;10%&amp;quot;| Wartezeit ||width=&amp;quot;10%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1 ? || x || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x || x || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || =4 || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || x ||  x  || x || dec / ==0 ? || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB,&lt;br /&gt;
               ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB,&lt;br /&gt;
               ALLE_ROT_2, WARTE_NORDSUED}  state_t;&lt;br /&gt;
 &lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
unsigned char zaehler;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLES_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      zaehler = 4;&lt;br /&gt;
      state = WARTE_NORDSUED;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case WARTE_NORDSUED:&lt;br /&gt;
      zaehler = zaehler - 1;&lt;br /&gt;
      if( zaehler == 0 )&lt;br /&gt;
        state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Tabellenform ==&lt;br /&gt;
&lt;br /&gt;
Im letzten Beispiel wollen wir die Ampelsteuerung noch etwas realistischer gestalten. Denn die einzelnen Phasen sind unterschiedlich lang, der Zustand Gelb ist deutlich kürzer als der Zustand Grün. Wenn wir also in fast jedem Zustand eine bestimmte Anzahl Takte warten wollen, erscheint es nicht sinnvoll, dafür jedesmal einen neuen Zustand anzuspringen. Sinnvoller ist die Integration des Wartens direkt in den Zustand, so wie im vorherigen Beispiel der Zustand &amp;quot;WARTE_NORDSUED&amp;quot;. Dabei fallen jedoch zwei Sachen auf.&lt;br /&gt;
&lt;br /&gt;
* In jedem Zustand muss die Wartezeit des &#039;&#039;nächsten&#039;&#039; Zustands zugewiesen werden. Das ist etwas verwirrend.&lt;br /&gt;
* Fast alle Anweisungen sind gleich in den Zuständen, nur die Zahlen und der Wert für den nächsten Zustand ändern sich.&lt;br /&gt;
&lt;br /&gt;
Darum soll hier die FSM von einer großen switch Anweisung auf eine Tabelle geändert werden. Das hat den Vorteil, dass die Zustandstabelle nahezu 1:1 in den Quelltext geschrieben werden kann und sie so sehr kompakt und übersichtlich ist. Die eigentliche FSM wird sehr klein und arbeitet sich durch die Tabelle durch. Zur weiteren Verbesserung der Lesbarkeit (siehe [[Strukturierte Programmierung auf Mikrocontrollern]]) nutzen wir einen Struct, welche den Zustand der State machine mit sinnvollen Variablennamen beschreibt. Bei dieser Methode muss man beachten, dass die Reihenfolge der Zustände in der enum Definition gleich sein muss mit der Reihenfolge der Zustände in der Tabelle, sonst funktioniert es nicht. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define GRUEN     2&lt;br /&gt;
#define GELB      4&lt;br /&gt;
#define ROTGELB   5&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
int Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
 &lt;br /&gt;
typedef enum { OSTWEST_GRUEN=0, OSTWEST_GELB, ALLE_ROT_1,&lt;br /&gt;
               NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_2,&lt;br /&gt;
               OSTWEST_ROTGELB }  state_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int Ampel1;&lt;br /&gt;
    int Ampel2;&lt;br /&gt;
    int I_Schleife;&lt;br /&gt;
    int Wartezeit;&lt;br /&gt;
    int Naechster;&lt;br /&gt;
} ampel_state_t;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
int zaehler=1;&lt;br /&gt;
 &lt;br /&gt;
// Tabelle fuer state machine&lt;br /&gt;
 &lt;br /&gt;
ampel_state_t state_table[8] = {&lt;br /&gt;
 &lt;br /&gt;
// AMPEL1 AMPEL2   Induktionsschleife ? &lt;br /&gt;
// |         |       |   Wartezeit in s&lt;br /&gt;
// |         |       |   |&lt;br /&gt;
// |         |       |   |   naechster Zustand     Name&lt;br /&gt;
//----------------------------------------------------------------------&lt;br /&gt;
{ROT     , GRUEN   , 1, 10,  OSTWEST_GELB},        // OSTWEST_GRUEN&lt;br /&gt;
{ROT     , GELB    , 0,  1,  ALLE_ROT_1},          // OSTWEST_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  NORDSUED_ROTGELB},    // ALLE_ROT_1&lt;br /&gt;
{ROTGELB , ROT     , 0,  1,  NORDSUED_GRUEN},      // NORDSUED_ROTGELB&lt;br /&gt;
{GRUEN   , ROT     , 0, 10,  NORDSUED_GELB},       // NORDSUED_GRUEN&lt;br /&gt;
{GELB    , ROT     , 0,  1,  ALLE_ROT_2},          // NORDSUED_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  OSTWEST_ROTGELB},     // ALLE_ROT_2&lt;br /&gt;
{ROT     , ROTGELB , 0,  1,  OSTWEST_GRUEN}};      // OSTWEST_ROTGELB&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
    Ampel1(state_table[state].Ampel1);&lt;br /&gt;
    Ampel2(state_table[state].Ampel2);&lt;br /&gt;
 &lt;br /&gt;
    if (zaehler&amp;gt;0) {&lt;br /&gt;
        zaehler--;    &lt;br /&gt;
    } else {&lt;br /&gt;
        if ( ((state_table[state].I_Schleife == 1) &amp;amp;&amp;amp; Induktionsschleife() ) ||&lt;br /&gt;
             (state_table[state].I_Schleife == 0) )&lt;br /&gt;
        {&lt;br /&gt;
            state =   state_table[state].Naechster;&lt;br /&gt;
            zaehler = state_table[state].Wartezeit;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierung einer objektorientierten Finite State Machine in C++==&lt;br /&gt;
&lt;br /&gt;
* Notation von Endlichen Automaten in UML&lt;br /&gt;
* Praktisches Beispiel, anhand dessen die Funktionsweise eines Toasters erklärt wird. Dazu wird die Notation in UML verwendet. &lt;br /&gt;
* Implementation des Beispiels in C++ auf einem AVR-Controller&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Möglichkeit bzw. das Beispiel sollte als Denkanstoss verstanden werden und nicht als Referenzimplementation. Es wurden bewusst bestimmte Feinheiten von endlichen Automaten verzichtet, um das Beispiel auf gut verständlichem Niveau zu halten. &lt;br /&gt;
&lt;br /&gt;
* Dokumentation im PDF Format [http://www.mikrocontroller.net/attachment/137066/ImplementierungEinerFiniteStateMachine_V1.1.pdf ImplementierungEinerFiniteStateMachine_V1.1.pdf]&lt;br /&gt;
* LaTeX Source der Dokumentation [http://www.mikrocontroller.net/attachment/137067/Dokumentation_Source_V1.1.zip Dokumentation_Source_V1.1.zip]&lt;br /&gt;
* Beispielcode für AVR-Studio 4 [http://www.mikrocontroller.net/attachment/135434/AVR_Beispiel_Source.zip AVR_Beispiel_Source.zip]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/248837#2556592 Forumsbeitrag]: Eine objektorientierte State Machine in C++&lt;br /&gt;
&lt;br /&gt;
== Grafische Modellierung einer Finite State Machine ==&lt;br /&gt;
Das Open Source Werkzeug Yakindu Statechart Tools (http://www.statecharts.org) ermöglicht es Zustandsautomaten grafisch zu modellieren, deren Verhalten zu simulieren und Code für verschiedene Sprachen (C/C++, Java) zu generieren.&lt;br /&gt;
Die grafischen Modellelemente entsprechen denen der UML2 und werden durch eine einfache und zweckmäßige Expression-Language ergänzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfaches Ampel Modell&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Modell einer einfachen Ampel wie oben beschrieben sieht in Yakindu SCT wie folgt aus: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1.jpg|center|framed|Einfaches Ampel Modell]]&lt;br /&gt;
&lt;br /&gt;
Wie erwartet hat die Ampel vier Zustände, die wiederum mit Übergangs-Pfeilen (Transitionen) verbunden sind. Jede Transition verfügt über einen Auslöser, in diesem Fall mit dem Namen &#039;&#039;tick&#039;&#039;    &lt;br /&gt;
Mit Hilfe der Yakindu DSL wird im linken Teil des Editors ein internes Event mit dem Name &amp;quot;tick&amp;quot; definiert, das entsprechend der Taktung des Zustandsautomaten &amp;quot;gefeuert&amp;quot; werden soll. Der Ausdruck &#039;&#039;every 1s / raise tick&#039;&#039; sorgt dafür, dass das Event &#039;&#039;tick&#039;&#039; jede Sekunde einmal gefeuert wird.&lt;br /&gt;
Da Yakindu SCT es erlaubt Zustandsautomaten zu simulieren, ist es jederzeit überprüfbar ob das modellierte Verhalten den Erwartungen entspricht. Über &#039;&#039;Run as... --&amp;gt; YAKINDU Statechart&#039;&#039; lässt sich in die &#039;&#039;Simulation View&#039;&#039; wechseln. Der jeweils aktive Zustand wird nun rot hinterlegt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1b.jpg|center|framed|Simulation View]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfache Kreuzung mit Zwei Ampel-Gruppen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im zweiten Beispiel soll eine einfache Ampelkreuzung modelliert werden. Es wird davon ausgegangen, dass die Ampeln in zwei Gruppen geschaltet werden. Ampel 1 und 3 bilden die nord_süd – Gruppe, während die übrigen Ampeln die ost-west – Gruppe bilden. Der Einfachheit halber werden Ampeln einer Gruppe immer gleich geschaltet. Wie oben darf eine Ampel-Gruppe nur dann den Zustand &#039;&#039;rot&#039;&#039; verlassen, wenn die jeweils andere Gruppe sich im Zustand &#039;&#039;rot&#039;&#039; befindet. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel2.jpg|800px|center|Ampelkreuzung]]&lt;br /&gt;
&lt;br /&gt;
Im Yakindu SCT Modell gibt es nun für jede Ampel-Gruppe eine eigene Region. Wird der Zustandsautomat betreten so wird nun parallel der Zustand &#039;&#039;rot&#039;&#039; in der &#039;&#039;nord_sued&#039;&#039; Region und der Zustand &#039;&#039;gruen&#039;&#039; in der &#039;&#039;ost_west&#039;&#039; Region aktiv. Wie bereits im ersten Beispiel wird der Zustandsautomat über das &#039;&#039;tick&#039;&#039; Ereignis angetrieben, das jede Sekunde einmal auftritt. &lt;br /&gt;
Um das gewünschte Ampel-Verhalten zu modellieren wird nun die Transition von &#039;&#039;rot&#039;&#039; zu &#039;&#039;rot-gelb&#039;&#039; mit einem &#039;&#039;Guard&#039;&#039;, also einer Bedingung geschützt. Zwar wird der Übergang weiterhin mit dem Ereignis &#039;&#039;tick&#039;&#039; angestoßen, allerdings wird der Übergang nur ausgeführt wenn die in eckigen Klammern formulierte Boolesche-Bedingung erfüllt ist. Die Funktion &#039;&#039;active()&#039;&#039; gehört zu den Bordmitteln von Yakindu SCT und prüft ob ein bestimmter Zustand aktiv ist. In diesem Beispiel kann in der Region &#039;&#039;nord_sued&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; nur verlassen werden, wenn in der Region &#039;&#039;ost-west&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; aktiv ist. Wie auch im vorhergegangenen Beispiel lässt sich das Verhalten simulieren, so das überprüft werden kann ob das Verhalten den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ampel mit Induktionsschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Verhalten der Ampelanlage aus Beispiel 2 soll um eine Induktionsschleife erweitert werden. Der Verkehr an der Ampelanlage fließt normalerweise in &#039;&#039;ost_west&#039;&#039; – Richtung, daher die Ampel in dieser Richtung immer den Zustand &#039;&#039;grün&#039;&#039; haben, es sei denn die Induktionsschleife in &#039;&#039;nord-süd&#039;&#039; - Richtung wird ausgelöst.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel3.jpg|800px|center|Ampelkreuzung mit Induktionsschleife]]&lt;br /&gt;
&lt;br /&gt;
Um dieses Verhalten in das SCT-Modell zu integrieren muss zunächst ein neues Ereignis definiert werden. Dieses Ereignis wird als Teil des &#039;&#039;Interface-Scopes&#039;&#039; definiert, da es außerhalb des Zustandsautomaten erzeugt werden soll. Ereignisse die Teil einer externen Schnittstelle sind werden mit einer Richtung (in / out) deklariert, die angibt ob das Ereignis den Zustandsautomat betritt, oder verlässt. &lt;br /&gt;
&lt;br /&gt;
Nach dem das neue Ereignis definiert ist,  muss nur noch der Auslöser für den Übergang von &#039;&#039;gruen&#039;&#039; zu &#039;&#039;gelb&#039;&#039; geändert werden. Statt wie bisher durch das &#039;&#039;tick&#039;&#039; Event, wird nun das &#039;&#039;induktionsSignal&#039;&#039; als Auslöser verwendet. In der Simulations-Ansicht kann das neue Ereignis manuell mit einem Klick ausgelöst werden, so dass das korrekte Verhalten wieder getestet werden kann.   &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_simView.jpg|center|framed|Induktionsschleife auslösen]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warteschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es soll die Grün-Phase verlängert werden, so dass erst nach dem 5. &#039;&#039;tick&#039;&#039; der Übergang in den &#039;&#039;gelb&#039;&#039; Zustand erfolgt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct beispiel4.jpg|800px|center|Ampelkreuzung mit Warteschleife]]&lt;br /&gt;
&lt;br /&gt;
Um eine Warteschleife zu realisieren wird dem &#039;&#039;Internal-Scope&#039;&#039; zuerst eine neue Variable hinzugefügt. Da während des Wartens der &#039;&#039;grün&#039;&#039; Zustand nicht verlassen wird, lässt sich das Herunterzählen der Wartezeit mittels eines zusammengesetzten Zustands darstellen. Wird der Zustand &#039;&#039;grün&#039;&#039; betreten, wird zunächst einen Eintritts-Aktion ausgeführt, die den Wert von &#039;&#039;wartezeit&#039;&#039; auf 5 setzt. Außerdem wird ebenfalls der Zustand &#039;&#039;Warten&#039;&#039; aktiv. Erfolgt nun ein &#039;&#039;tick&#039;&#039; wird ohne &#039;&#039;grün&#039;&#039; zu verlassen in &#039;&#039;WartezeitVerringern&#039;&#039; gewechselt und der Wert von &#039;&#039;wartezeit&#039;&#039; um 1 verringert. &lt;br /&gt;
Der Übergang zu &#039;&#039;gelb&#039;&#039; ist wieder durch einen Guard geschützt und kann nur erfolgen wenn die  Bedingung &#039;&#039;wartezeit == 0&#039;&#039; erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Code aus dem Modell generieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um nun Code aus dem Modell zu generieren muss zuerst eine GeneratorModel-Datei erzeugt werden, in der unter anderem die Ziel-Sprache angegeben wird.&lt;br /&gt;
Um den Zustandsautomaten abzubilden verwendet die konkrete Implementierung ein &#039;&#039;switch case&#039;&#039; Konstrukt, das dem oben Gezeigten ähnelt. Außerdem wurde ein &#039;&#039;code-only&#039;&#039; Ansatz verfolgt, so dass keine externen Bibliotheken oder Frameworks benötigt werden. Das komplette Eclipse Projekt kann [http://statecharts.org/Examples/ampel.zip hier] runtergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Realisation von FSMs in Hardware ==&lt;br /&gt;
=== Aufbau einer FSM in digitalen Chips ===&lt;br /&gt;
&lt;br /&gt;
Sollen sehr schnelle Steuerungen und Entscheider aufgebaut werden, wurden und werden digitale Bausteine mit Logikgattern verdrahtet, die steuerbare Zähler enthalten. Damit lassen sich effektive Taktgeschwindigkeiten im Bereich von mehreren MHz erreichen, die in Sicherheitsbereichen eingesetzt werden. Oft werden solche Schaltungen auch zur Überwachung von anderen Schaltungsteilen eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Früher wurden fast alle logischen Schaltungen auf diese Weise entworfen, z.B. auch die ersten Computer von IBM.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung von FSMs in programmierbarer Hardware ===&lt;br /&gt;
&lt;br /&gt;
Da heute digitale Hardware vielfach in Form programmierter PLD- und [[FPGA]]-Bausteine eingesetzt wird, verlagert sich der Entwurf der FSM mehr zu Softwareentwicklung hin. Dabei besteht je nach Vorliegen der funktionellen Beschreibung und eventueller Primärinformation die Möglichkeit, ein Abbild der digitalen Schaltung in VHDL zu formulieren und zu importieren, bzw. ein klassisches state diagram neu zu entwerfen oder die Zustandswechsel in Tabellenform zu importieren und das Erzeugerwerkzeug die FSM generieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Letztendlich kann in Hardware jede sequentielle Logikschaltung, welche [[FlipFlop]]s und Dekoder enthält als FSM betrachtet werden, egal ob es ein einfaches Schieberegister oder eine komplexe ALU einer CPU ist. Die einfachste, denkbare FSM ist ein Toggle-FlipFlop, welches mit jedem Takt seinen Ausgangszustand wechselt.&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsvergleich ==&lt;br /&gt;
In Software realisierte state machines erreichen unter C++ in Windows auch bei hoher Prozessauslastung selten niedrigere Reaktionszeiten als im Millisekundenbereich. Die damit in Echtzeit erfassbaren und prozessierbaren externen Ereignisse bewegen sich üblicherweise im Bereich von einigen 100Hz. Mit Microcontrollern und DSPs erreicht man mit Nicht-Multi-tasking-FSMs Abtastraten bis einige 100kHz. In VHDL realisierte state machines besitzen je nach FPGA-Familie, Art der Codierung und Zyklustiefe typische Taktfrequenzen von 10...100MHz.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.aqdi.com/state.htm Using State Machines In Your Designs] (C) 2003 Hank Wallace&lt;br /&gt;
* [http://qfsm.sourceforge.net/ Qfsm] - A graphical tool for designing finite state machines (GPL)&lt;br /&gt;
* [https://www.itemis.com/en/yakindu/statechart-tools/ YAKINDU Statechart Tools] Ein Werkzeug zum Modellieren und Simulieren von Statecharts sowie Code-Generatoren für Java, C und C++. &lt;br /&gt;
* [http://www.sinelabore.com www.sinelabore.com] Ein Werkzeug das aus UML State Machines C-Code speziell für eingebettete Systeme erzeugt.&lt;br /&gt;
* [http://smc.sourceforge.net SMC The State Machine Compiler]&lt;br /&gt;
* [http://block-net.de/Programmierung/cpp/fsm/fsm.html C/C++ event driven FSM] Open source Werkzeug zur Generierung von C++ FSM Code und UML Diagramm mittels Transitionstabelle. &lt;br /&gt;
* http://astade.tigris.org/ -&amp;gt; http://wiki.astade.de/dokuwiki/doku.php (https://www.mikrocontroller.net/search?query=astade)&lt;br /&gt;
* [http://stefanfrings.de/multitasking_arduino/index.html Multitasking mit/ohne Arduino] von Stefan Frings&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101302</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101302"/>
		<updated>2019-11-17T17:48:15Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Bei einem sogenannten [http://de.wikipedia.org/wiki/Finite_State_Machine Endlichen Zustandsautomaten] (engl. &#039;&#039;&#039;f&#039;&#039;&#039;inite &#039;&#039;&#039;s&#039;&#039;&#039;tate &#039;&#039;&#039;m&#039;&#039;&#039;achine, kurz FSM) handelt es sich um die Realisation eines Steuerungskonzeptes, welches eine abstrahierte Maschine zum Vorbild hat, die eine Reihe von Zuständen besitzt, durch die sich ihr Betriebsablauf definiert. Diese Maschine arbeitet, indem sie von einem Zustand in einen anderen Zustand übergeht und bei derartigen Zustandsübergängen und im Verharren von Zuständen bestimmte Aktionen ausführt. Dabei ergibt sich der Folgezustand aus dem momentanen Zustand und einem externen Ereignis, z. B. einem Tastendruck. Dabei ist die Maschine in verschiedenen Zuständen für ganz bestimmte Ereignisse sensibel.&lt;br /&gt;
&lt;br /&gt;
Die FSM selbst wird fast immer in irgendeiner Weise über einen Takt angetrieben, kann also nicht in beliebig kurzen Zeitspannen auf Ereignisse reagieren und Zustände wechseln. In jedem Takt wird anhand des vorliegenden Zustands und dem Status der Eingabekanäle entschieden, welcher Zustand als nächstes vorliegen soll und welche Aktionen auszuführen sind.&lt;br /&gt;
&lt;br /&gt;
Abstrahierte Formen dieser Maschine werden in vielen elektronischen Geräten eingesetzt, um Bedieneraktivitäten und andere Ereignisse im System zu verarbeiten und autark ablaufende Prozesse geeignet zu beeinflussen. Entsprechend formulierte FSMs können sowohl in Software als auch Hardware aufgebaut werden. &lt;br /&gt;
&lt;br /&gt;
Die Beschreibung einer FSM ist auf mehrere Arten möglich. Zum einen kann sie in Form einer Tabelle beschrieben werden, aber auch eine graphische Darstellung der Zustände und deren Abhängigkeiten in Form eines Zustandsdiagramms ist möglich.&lt;br /&gt;
&lt;br /&gt;
==Darstellung von Zustandsautomaten==&lt;br /&gt;
&lt;br /&gt;
Zustandsautomaten haben den großen Charme, dass es meistens leicht möglich ist, ihre Funktion durch eine Grafik zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es ist eine FSM zu entwerfen, die eine Rollosteuerung übernimmt. Es gibt einen Motor, der sich in 3 Zuständen befinden kann: stop, rauf drehend, runter drehend. Außerdem gibt es Endschalter, welche betätigt werden, wenn das Rollo die jeweilige Endposition erreicht hat. Und es gibt 2 Taster &amp;quot;Up&amp;quot; und &amp;quot;Down&amp;quot; durch welche der Benutzer den Bewegungswunsch an die FSM weitergibt. Irgendwie weiß jeder, wie so eine Rollosteuerung funktioniert, und so recht und schlecht kann das auch jeder in der einen oder anderen Form beschreiben. Aber kann man das ganze auch so &#039;beschreiben&#039;, dass man im Vorfeld, vor der Programmierung tatsächlich alle Eventualitäten erfasst und so darstellt, dass auch ein Nicht-Informatiker die Funktionsweise versteht? Genau an dieser Stelle kommt die graphische Darstellung ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Wie sieht nun eine derartige FSM aus? Jede Wolke im Bild sei ein Zustand, dem man einen Namen gibt. Die Pfeile zwischen den Wolken zeigen die Zustandsübergänge an, wobei am Pfeil vermerkt ist, unter welcher Bedingung dieser Übergang genommen werden kann (in Rot) und welche Aktionen dabei auszuführen sind (in Blau).&lt;br /&gt;
&lt;br /&gt;
[[Datei:StateRollo.jpg|center|framed|Zustandsautomat für eine Rollosteuerung]]&lt;br /&gt;
&lt;br /&gt;
Aus der Zeichnung ist ablesbar:&lt;br /&gt;
Befindet sich die Maschine im Zustand &amp;quot;unten&amp;quot; und wird die Taste &amp;quot;Up&amp;quot; gedrückt, dann folgt als Aktion, daß der Motor auf &amp;quot;rauf drehend&amp;quot; gestellt wird und gleichzeitig wechselt die Maschine in den Zustand &amp;quot;nach oben&amp;quot;. In diesem Zustand verbleibt die Maschine, während der Motor immer weiter dreht, bis der Endschalter meldet, dass das Rollo oben angekommen ist. Dies ist eine Möglichkeit wie die Maschine den Zustand &amp;quot;nach oben&amp;quot; verlassen kann. In diesem Fall wird dann der Motor abgeschaltet und die Maschine wechselt in den Zustand &amp;quot;oben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Man sieht hier schon, dass es mit so einer Grafik relativ einfach ist, sich von der korrekten Logik zu überzeugen. In einfachsten Fall legt man zur Simulation einfach einen Gegenstand in die betreffende Wolke, die den gerade aktiven Zustand symbolisiert. Danach geht man alle Möglichkeiten durch, wie diese Maschine von aussen (Taster, Schalter, etc) beeinflusst werden kann und sieht sich an, ob es dafür in der Grafik einen Pfeil gibt, der von der aktiven Wolke wegführt. Gibt es keinen, dann passiert auch nichts. Gibt es einen, dann verschiebt man den Gegenstand in die betreffende Wolke und führt (in Gedanken) die Aktion aus. Auf die Art kann man ganz leicht einige typische Benutzerszenarien durchspielen aber auch ausprobieren, ob man alle Eventualitäten berücksichtigt hat. Denn gerade diese Evantualitäten, an die man am Anfang gar nicht denkt, die sind es, die einem in weiterer Folge oft Probleme bereiten.&lt;br /&gt;
&lt;br /&gt;
Um bei der Rollosteuerung zu bleiben: Was soll denn passieren, wenn das Rollo gerade hochfährt und der Benutzer ein weiteres mal auf &amp;quot;Up&amp;quot; drückt? Oder wenn er auf &amp;quot;Down&amp;quot; drückt? In der Grafik ist ersichtlich, wie in diesem Fall zu verfahren ist. (Und Hand aufs Herz: Hätten Sie daran gedacht, dass diese Fälle zu berücksichtigen sind, als sie &#039;Rollosteuerung&#039; gelesen haben?)&lt;br /&gt;
&lt;br /&gt;
==Implementierungsvariationen==&lt;br /&gt;
&lt;br /&gt;
Der konkrete softwaremässige Aufbau einer FSM kann in weiten Grenzen variieren. Das grundlegende Konzept, Aktionen an Zustände zu knüpfen und logische Abläufe an die Abfolge von Zuständen zu binden, bleibt dabei in allen Fällen erhalten. Aber je nach Lust und Laune und dem Können des Programmierers gibt es viele unterschiedliche Möglichkeiten eine FSM zu implementieren. Ziel ist es dabei immer, die eigentliche Maschine, also das was in der Zustandstabelle ausgedrückt wird, so einfach und überschaubar wie möglich zu präsentieren. Sie implementiert die Logik und definiert was die Maschine eigentlich macht und warum sie es macht. Ein einfacher Ansatz ist die Verwendung des C-Konstukts switch, in der in jedem case-zweig die einzelnen Zustände kodiert werden. Es ist aber auch durchaus möglich eine universelle FSM zu bauen, bei denen eine generische Funktion die Tabelle in Arrayform bekommt und zusammen mit einigen globalen Variablen die Maschine implementiert. Oft wird auch eine Statemaschine dadurch gebaut, indem das zentrale switch-case Konstukt der Sprache [C] durch einen einzelnen [[Funktionszeiger in C | Funktionszeiger]] ersetzt wird und jeder Zustand nichts anderes als eine Funktion ist. Der Übergang von einem Zustand in einen anderen Zustand ist dann nichts anderes als das Zuweisen einer Funktion an diesen Funktionszeiger. Oder aber man kombiniert Tabelle und Funktionszeiger in ein gemeinsames Konzept.&lt;br /&gt;
&lt;br /&gt;
==Grundlegender Aufbau==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird eine FSM in Software verwirklicht, welche die Ampelsteuerung einer Kreuzung übernimmt.&lt;br /&gt;
[[Bild:Statemachine_Kreuzung.png|center|framed|Ampeln an einer Kreuzung]]&lt;br /&gt;
&lt;br /&gt;
Die Abfolge der Lichtzeichen einer einzelnen Ampel ist dabei&lt;br /&gt;
&amp;lt;br&amp;gt;[[Bild:Statemachine_Ampel.png|center|framed|Zustände einer einzelnen Ampel]]&lt;br /&gt;
&lt;br /&gt;
Die komplette Lichtfolge aller Ampeln in der Kreuzung stellt sich dann wie folgt dar: Es ist dabei ausreichend, nur Ampel 1 und Ampel 2 zu betrachten, da Ampel 3 bzw. Ampel 4 die jeweils gleichen Lichtsignale anzeigen. Dies muss nicht immer so sein! Auf einer Kreuzung kann es durchaus für eine Fahrtrichtung Zusatzampeln geben, die die Lichtfolge der Hauptampel modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustandsnummer ist in diesem Fall einfach die Taktung der FSM. Verfolgt man die Zustände von einem Zustand zum nächsten, dann kann man sich sehr leicht davon überzeugen, daß die Lichtfolge der beiden Ampeln tatsächlich der gewünschten Abfolge entspricht.&lt;br /&gt;
&lt;br /&gt;
Hat man die Funktionalität einer FSM erst mal soweit in Tabellenform festgelegt, dann ist es sehr einfach daraus ein Programm in einer Programmiersprache wie z.B. C abzuleiten, welches diese Statemachine implementiert.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man dabei folgenden Aufbau vornehmen:&lt;br /&gt;
* Es gibt eine globale Variable, die den aktuellen Zustand der Maschine repräsentiert. Die Zustände wurden in obiger Tabelle bereits durchnummeriert, so dass es sich anbietet, Zustände innerhalb der Maschine durch ebendiese Zahlen darzustellen.&lt;br /&gt;
* Die FSM wird als Funktion implementiert, die für jeden einzelnen Takt aufgerufen wird.&lt;br /&gt;
* Jeder Zustand wird innerhalb der Funktion durch einen case innerhalb einer  switch Anweisung dargestellt.&lt;br /&gt;
* Jeder Zustand kann vor verlassen der Funktion den aktuellen Zustand der FSM beim nächsten Aufruf der Funktion festlegen, indem er an die globale Variable die Nummer des nächsten Zustands zuweist.&lt;br /&gt;
* Jegliche Form von Warteschleifen innerhalb der FSM sind verboten. Wenn die FSM auf ein Ereignis warten müsste, dann ist dafür ein eigener Zustand vorzusehen, der auf das Eintreten des Ereignisses prüft und nur dann den nächsten Zustand auswählt, wenn das Ereignis tatsächlich eingetreten ist. Damit erreicht man [[Multitasking]].&lt;br /&gt;
* Es ist sinnvoll, den Ampelfarben Namen in Form eines #define oder enums zu geben, damit wird das Konstrukt deutlich leichter lesbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );  // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );  // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
&lt;br /&gt;
unsigned char state = 1;   // globale Variable, die den Status repräsentiert&lt;br /&gt;
&lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      state = 2;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = 3;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 4;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 4:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 5;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 5:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 6;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 6:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 7;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 7:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 8;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 8:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = 1;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    stateMachine();&lt;br /&gt;
    delay_ms( 1000 );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird diese Funktion im Sekundentakt aufgerufen, so werden die Funktionen Ampel1() bzw. Ampel2() mit der jeweils richtigen Lichtstellung in der richtigen Reihenfolge aufgerufen um die Lichtwechsel der Ampeln einer Kreuzung zu realisieren. Der Einfachheit halber wird in diesem Beispiel die Funktion delay_ms() verwendet. Praktisch wird man in den meisten Fällen besser einen [[Timer]] benutzen, um die Statemachine periodisch aufzurufen. Wie das geht und was das für Vorteile hat ist im Artikel [[Multitasking#Verbesserter Ansatz mit Timer | Multitasking]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Reaktionen auf äußere Ereignisse==&lt;br /&gt;
&lt;br /&gt;
Obige Statemaschine ist noch sehr primitiv. Angenommen an dieser Ampelkreuzung gibt es eine Induktionsschleife. Diese sei derartig geschaltet, dass die Hauptrichtung über Ampel2/Ampel4 ständig Grün zeigt und nur bei Annäherung eines Fahrzeugs auf der Strecke Ampel1/Ampel3 wird ein Lichtwechselzyklus durchgeführt, um diesem Fahrzeug die geordnete Durchfahrt zu ermöglichen. Die Statemaschine muss daher auf ein äußeres Ereignis reagieren können. Der Übergang von Zustand 1 in Zustand 2 ist von diesem Ereignis abhängig. Nur wenn es auftritt wird dieser Übergang durchgeführt, ansonsten verbleibt die Maschine im Zustand 1. Die Beschreibung der FSM wird also um einen weiteren Tabelleneintrag ergänzt, in dem festgehalten wird, wie mit dem zusätzlichen Eingang verfahren werden soll. In dieserm erweiterten Beispiel sollen die Zustände mit einem aussagekräftigen Namen versehen werden, denn Menschen sind sehr schlecht im Umgang mit abstrakten Zahlen, sie sind viel besser mit Wörtern vertraut. Die x in der Tabellenspalte &amp;quot;Induktionsschleife&amp;quot; besagen, daß dieses Eingangsignal für die Entscheidungen der Statemaschine keine Rolle spielt (engl. don&#039;t care).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!| Zustand ||| Name ||| Ampel 1 || | Ampel 2 ||  Induktionsschleife || | nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || OSTWEST_GRUEN      || rot     ||  grün      || ==1 ? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || OSTWEST_GELB       || rot     ||  gelb      || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || ALLE_ROT_1         || rot     ||  rot       || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || NORDSUED_ROTGELB   ||rot/gelb ||  rot       || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || NORDSUED_GRUEN     || grün    ||  rot       || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || NORDSUED_GELB      || gelb    ||  rot       || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || ALLE_ROT_2         || rot     ||  rot       || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || OSTWEST_ROTGELB    || rot     ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB, ALLE_ROT_2} state_t ;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLE_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLE_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Warteschleifen==&lt;br /&gt;
&lt;br /&gt;
Das Warten auf ein äußeres Ereignis kann mit dem Verzweigen oder auch nicht Verzweigen in einen anderen Zustand realisiert werden. In obiger Statemaschine soll z.B. die Grünphase der Ampel1 von einem Takt auf 5 Takte angehoben werden. Grundfalsch wäre es, dies jetzt mit einer while-Schleife im Zustand 5 zu realisieren. Warten wird immer über zusätzliche Zustände realisiert. Eine Statemaschine darf innerhalb eines Zustands niemals auf etwas warten, sondern muss so schnell als möglich die Kontrolle wieder abgeben. Geht man naiv an die Sache ran, dann könnte man die 5 Takte über die Einführung von zusätzlichen Zuständen leicht erreichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| Induktionsschleife ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || grün ||  rot  || x || 10&lt;br /&gt;
|-&lt;br /&gt;
| 10 || grün ||  rot  || x || 11&lt;br /&gt;
|-&lt;br /&gt;
| 11 || grün ||  rot  || x || 12&lt;br /&gt;
|-&lt;br /&gt;
| 12 || grün ||  rot  || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daß ein derartiges Vorgehen bei längeren Wartezeiten oder gar bei berechneter Wartezeitdauer nicht praktikabel ist, dürfte auf der Hand liegen. Besser ist daher die Einführung eines internen Zählers sowie nur eines einzigen, neuen Wartezustands. Beginnt die Wartezeit wird der Zähler auf einen Wert entsprechend der Wartezeit gestellt. Im neuen Zustand wird der Zähler um 1 verringert und nur dann, wenn der Zähler 0 erreicht hat, wird in den ursprünglichen Folgezustand gewechselt. Der Zähler kann also in ähnlicher Form wie die Induktionsschleife als Ereignislieferant aufgefasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:15em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Zustand ||width=&amp;quot;10%&amp;quot;| Ampel 1 ||width=&amp;quot;10%&amp;quot;| Ampel 2 ||width=&amp;quot;10%&amp;quot;| Induktionsschleife ||width=&amp;quot;10%&amp;quot;| Wartezeit ||width=&amp;quot;10%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1 ? || x || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x || x || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || =4 || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || x ||  x  || x || dec / ==0 ? || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB,&lt;br /&gt;
               ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB,&lt;br /&gt;
               ALLE_ROT_2, WARTE_NORDSUED}  state_t;&lt;br /&gt;
 &lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
unsigned char zaehler;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLES_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      zaehler = 4;&lt;br /&gt;
      state = WARTE_NORDSUED;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case WARTE_NORDSUED:&lt;br /&gt;
      zaehler = zaehler - 1;&lt;br /&gt;
      if( zaehler == 0 )&lt;br /&gt;
        state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Tabellenform ==&lt;br /&gt;
&lt;br /&gt;
Im letzten Beispiel wollen wir die Ampelsteuerung noch etwas realistischer gestalten. Denn die einzelnen Phasen sind unterschiedlich lang, der Zustand Gelb ist deutlich kürzer als der Zustand Grün. Wenn wir also in fast jedem Zustand eine bestimmte Anzahl Takte warten wollen, erscheint es nicht sinnvoll, dafür jedesmal einen neuen Zustand anzuspringen. Sinnvoller ist die Integration des Wartens direkt in den Zustand, so wie im vorherigen Beispiel der Zustand &amp;quot;WARTE_NORDSUED&amp;quot;. Dabei fallen jedoch zwei Sachen auf.&lt;br /&gt;
&lt;br /&gt;
* In jedem Zustand muss die Wartezeit des &#039;&#039;nächsten&#039;&#039; Zustands zugewiesen werden. Das ist etwas verwirrend.&lt;br /&gt;
* Fast alle Anweisungen sind gleich in den Zuständen, nur die Zahlen und der Wert für den nächsten Zustand ändern sich.&lt;br /&gt;
&lt;br /&gt;
Darum soll hier die FSM von einer großen switch Anweisung auf eine Tabelle geändert werden. Das hat den Vorteil, dass die Zustandstabelle nahezu 1:1 in den Quelltext geschrieben werden kann und sie so sehr kompakt und übersichtlich ist. Die eigentliche FSM wird sehr klein und arbeitet sich durch die Tabelle durch. Zur weiteren Verbesserung der Lesbarkeit (siehe [[Strukturierte Programmierung auf Mikrocontrollern]]) nutzen wir einen Struct, welche den Zustand der State machine mit sinnvollen Variablennamen beschreibt. Bei dieser Methode muss man beachten, dass die Reihenfolge der Zustände in der enum Definition gleich sein muss mit der Reihenfolge der Zustände in der Tabelle, sonst funktioniert es nicht. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define GRUEN     2&lt;br /&gt;
#define GELB      4&lt;br /&gt;
#define ROTGELB   5&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
int Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
 &lt;br /&gt;
typedef enum { OSTWEST_GRUEN=0, OSTWEST_GELB, ALLE_ROT_1,&lt;br /&gt;
               NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_2,&lt;br /&gt;
               OSTWEST_ROTGELB }  state_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int Ampel1;&lt;br /&gt;
    int Ampel2;&lt;br /&gt;
    int I_Schleife;&lt;br /&gt;
    int Wartezeit;&lt;br /&gt;
    int Naechster;&lt;br /&gt;
} ampel_state_t;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
int zaehler=1;&lt;br /&gt;
 &lt;br /&gt;
// Tabelle fuer state machine&lt;br /&gt;
 &lt;br /&gt;
ampel_state_t state_table[8] = {&lt;br /&gt;
 &lt;br /&gt;
// AMPEL1 AMPEL2   Induktionsschleife ? &lt;br /&gt;
// |         |       |   Wartezeit in s&lt;br /&gt;
// |         |       |   |&lt;br /&gt;
// |         |       |   |   naechster Zustand     Name&lt;br /&gt;
//----------------------------------------------------------------------&lt;br /&gt;
{ROT     , GRUEN   , 1, 10,  OSTWEST_GELB},        // OSTWEST_GRUEN&lt;br /&gt;
{ROT     , GELB    , 0,  1,  ALLE_ROT_1},          // OSTWEST_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  NORDSUED_ROTGELB},    // ALLE_ROT_1&lt;br /&gt;
{ROTGELB , ROT     , 0,  1,  NORDSUED_GRUEN},      // NORDSUED_ROTGELB&lt;br /&gt;
{GRUEN   , ROT     , 0, 10,  NORDSUED_GELB},       // NORDSUED_GRUEN&lt;br /&gt;
{GELB    , ROT     , 0,  1,  ALLE_ROT_2},          // NORDSUED_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  OSTWEST_ROTGELB},     // ALLE_ROT_2&lt;br /&gt;
{ROT     , ROTGELB , 0,  1,  OSTWEST_GRUEN}};      // OSTWEST_ROTGELB&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
    Ampel1(state_table[state].Ampel1);&lt;br /&gt;
    Ampel2(state_table[state].Ampel2);&lt;br /&gt;
 &lt;br /&gt;
    if (zaehler&amp;gt;0) {&lt;br /&gt;
        zaehler--;    &lt;br /&gt;
    } else {&lt;br /&gt;
        if ( ((state_table[state].I_Schleife == 1) &amp;amp;&amp;amp; Induktionsschleife() ) ||&lt;br /&gt;
             (state_table[state].I_Schleife == 0) )&lt;br /&gt;
        {&lt;br /&gt;
            state =   state_table[state].Naechster;&lt;br /&gt;
            zaehler = state_table[state].Wartezeit;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierung einer objektorientierten Finite State Machine in C++==&lt;br /&gt;
&lt;br /&gt;
* Notation von Endlichen Automaten in UML&lt;br /&gt;
* Praktisches Beispiel, anhand dessen die Funktionsweise eines Toasters erklärt wird. Dazu wird die Notation in UML verwendet. &lt;br /&gt;
* Implementation des Beispiels in C++ auf einem AVR-Controller&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Möglichkeit bzw. das Beispiel sollte als Denkanstoss verstanden werden und nicht als Referenzimplementation. Es wurden bewusst bestimmte Feinheiten von endlichen Automaten verzichtet, um das Beispiel auf gut verständlichem Niveau zu halten. &lt;br /&gt;
&lt;br /&gt;
* Dokumentation im PDF Format [http://www.mikrocontroller.net/attachment/137066/ImplementierungEinerFiniteStateMachine_V1.1.pdf ImplementierungEinerFiniteStateMachine_V1.1.pdf]&lt;br /&gt;
* LaTeX Source der Dokumentation [http://www.mikrocontroller.net/attachment/137067/Dokumentation_Source_V1.1.zip Dokumentation_Source_V1.1.zip]&lt;br /&gt;
* Beispielcode für AVR-Studio 4 [http://www.mikrocontroller.net/attachment/135434/AVR_Beispiel_Source.zip AVR_Beispiel_Source.zip]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/248837#2556592 Forumsbeitrag]: Eine objektorientierte State Machine in C++&lt;br /&gt;
&lt;br /&gt;
== Grafische Modellierung einer Finite State Machine ==&lt;br /&gt;
Das Open Source Werkzeug Yakindu Statechart Tools (http://www.statecharts.org) ermöglicht es Zustandsautomaten grafisch zu modellieren, deren Verhalten zu simulieren und Code für verschiedene Sprachen (C/C++, Java) zu generieren.&lt;br /&gt;
Die grafischen Modellelemente entsprechen denen der UML2 und werden durch eine einfache und zweckmäßige Expression-Language ergänzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfaches Ampel Modell&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Modell einer einfachen Ampel wie oben beschrieben sieht in Yakindu SCT wie folgt aus: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1.jpg|center|framed|Einfaches Ampel Modell]]&lt;br /&gt;
&lt;br /&gt;
Wie erwartet hat die Ampel vier Zustände, die wiederum mit Übergangs-Pfeilen (Transitionen) verbunden sind. Jede Transition verfügt über einen Auslöser, in diesem Fall mit dem Namen &#039;&#039;tick&#039;&#039;    &lt;br /&gt;
Mit Hilfe der Yakindu DSL wird im linken Teil des Editors ein internes Event mit dem Name &amp;quot;tick&amp;quot; definiert, das entsprechend der Taktung des Zustandsautomaten &amp;quot;gefeuert&amp;quot; werden soll. Der Ausdruck &#039;&#039;every 1s / raise tick&#039;&#039; sorgt dafür, dass das Event &#039;&#039;tick&#039;&#039; jede Sekunde einmal gefeuert wird.&lt;br /&gt;
Da Yakindu SCT es erlaubt Zustandsautomaten zu simulieren, ist es jederzeit überprüfbar ob das modellierte Verhalten den Erwartungen entspricht. Über &#039;&#039;Run as... --&amp;gt; YAKINDU Statechart&#039;&#039; lässt sich in die &#039;&#039;Simulation View&#039;&#039; wechseln. Der jeweils aktive Zustand wird nun rot hinterlegt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1b.jpg|center|framed|Simulation View]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfache Kreuzung mit Zwei Ampel-Gruppen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im zweiten Beispiel soll eine einfache Ampelkreuzung modelliert werden. Es wird davon ausgegangen, dass die Ampeln in zwei Gruppen geschaltet werden. Ampel 1 und 3 bilden die nord_süd – Gruppe, während die übrigen Ampeln die ost-west – Gruppe bilden. Der Einfachheit halber werden Ampeln einer Gruppe immer gleich geschaltet. Wie oben darf eine Ampel-Gruppe nur dann den Zustand &#039;&#039;rot&#039;&#039; verlassen, wenn die jeweils andere Gruppe sich im Zustand &#039;&#039;rot&#039;&#039; befindet. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel2.jpg|800px|center|Ampelkreuzung]]&lt;br /&gt;
&lt;br /&gt;
Im Yakindu SCT Modell gibt es nun für jede Ampel-Gruppe eine eigene Region. Wird der Zustandsautomat betreten so wird nun parallel der Zustand &#039;&#039;rot&#039;&#039; in der &#039;&#039;nord_sued&#039;&#039; Region und der Zustand &#039;&#039;gruen&#039;&#039; in der &#039;&#039;ost_west&#039;&#039; Region aktiv. Wie bereits im ersten Beispiel wird der Zustandsautomat über das &#039;&#039;tick&#039;&#039; Ereignis angetrieben, das jede Sekunde einmal auftritt. &lt;br /&gt;
Um das gewünschte Ampel-Verhalten zu modellieren wird nun die Transition von &#039;&#039;rot&#039;&#039; zu &#039;&#039;rot-gelb&#039;&#039; mit einem &#039;&#039;Guard&#039;&#039;, also einer Bedingung geschützt. Zwar wird der Übergang weiterhin mit dem Ereignis &#039;&#039;tick&#039;&#039; angestoßen, allerdings wird der Übergang nur ausgeführt wenn die in eckigen Klammern formulierte Boolesche-Bedingung erfüllt ist. Die Funktion &#039;&#039;active()&#039;&#039; gehört zu den Bordmitteln von Yakindu SCT und prüft ob ein bestimmter Zustand aktiv ist. In diesem Beispiel kann in der Region &#039;&#039;nord_sued&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; nur verlassen werden, wenn in der Region &#039;&#039;ost-west&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; aktiv ist. Wie auch im vorhergegangenen Beispiel lässt sich das Verhalten simulieren, so das überprüft werden kann ob das Verhalten den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ampel mit Induktionsschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Verhalten der Ampelanlage aus Beispiel 2 soll um eine Induktionsschleife erweitert werden. Der Verkehr an der Ampelanlage fließt normalerweise in &#039;&#039;ost_west&#039;&#039; – Richtung, daher die Ampel in dieser Richtung immer den Zustand &#039;&#039;grün&#039;&#039; haben, es sei denn die Induktionsschleife in &#039;&#039;nord-süd&#039;&#039; - Richtung wird ausgelöst.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel3.jpg|800px|center|Ampelkreuzung mit Induktionsschleife]]&lt;br /&gt;
&lt;br /&gt;
Um dieses Verhalten in das SCT-Modell zu integrieren muss zunächst ein neues Ereignis definiert werden. Dieses Ereignis wird als Teil des &#039;&#039;Interface-Scopes&#039;&#039; definiert, da es außerhalb des Zustandsautomaten erzeugt werden soll. Ereignisse die Teil einer externen Schnittstelle sind werden mit einer Richtung (in / out) deklariert, die angibt ob das Ereignis den Zustandsautomat betritt, oder verlässt. &lt;br /&gt;
&lt;br /&gt;
Nach dem das neue Ereignis definiert ist,  muss nur noch der Auslöser für den Übergang von &#039;&#039;gruen&#039;&#039; zu &#039;&#039;gelb&#039;&#039; geändert werden. Statt wie bisher durch das &#039;&#039;tick&#039;&#039; Event, wird nun das &#039;&#039;induktionsSignal&#039;&#039; als Auslöser verwendet. In der Simulations-Ansicht kann das neue Ereignis manuell mit einem Klick ausgelöst werden, so dass das korrekte Verhalten wieder getestet werden kann.   &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_simView.jpg|center|framed|Induktionsschleife auslösen]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warteschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es soll die Grün-Phase verlängert werden, so dass erst nach dem 5. &#039;&#039;tick&#039;&#039; der Übergang in den &#039;&#039;gelb&#039;&#039; Zustand erfolgt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct beispiel4.jpg|800px|center|Ampelkreuzung mit Warteschleife]]&lt;br /&gt;
&lt;br /&gt;
Um eine Warteschleife zu realisieren wird dem &#039;&#039;Internal-Scope&#039;&#039; zuerst eine neue Variable hinzugefügt. Da während des Wartens der &#039;&#039;grün&#039;&#039; Zustand nicht verlassen wird, lässt sich das Herunterzählen der Wartezeit mittels eines zusammengesetzten Zustands darstellen. Wird der Zustand &#039;&#039;grün&#039;&#039; betreten, wird zunächst einen Eintritts-Aktion ausgeführt, die den Wert von &#039;&#039;wartezeit&#039;&#039; auf 5 setzt. Außerdem wird ebenfalls der Zustand &#039;&#039;Warten&#039;&#039; aktiv. Erfolgt nun ein &#039;&#039;tick&#039;&#039; wird ohne &#039;&#039;grün&#039;&#039; zu verlassen in &#039;&#039;WartezeitVerringern&#039;&#039; gewechselt und der Wert von &#039;&#039;wartezeit&#039;&#039; um 1 verringert. &lt;br /&gt;
Der Übergang zu &#039;&#039;gelb&#039;&#039; ist wieder durch einen Guard geschützt und kann nur erfolgen wenn die  Bedingung &#039;&#039;wartezeit == 0&#039;&#039; erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Code aus dem Modell generieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um nun Code aus dem Modell zu generieren muss zuerst eine GeneratorModel-Datei erzeugt werden, in der unter anderem die Ziel-Sprache angegeben wird.&lt;br /&gt;
Um den Zustandsautomaten abzubilden verwendet die konkrete Implementierung ein &#039;&#039;switch case&#039;&#039; Konstrukt, das dem oben Gezeigten ähnelt. Außerdem wurde ein &#039;&#039;code-only&#039;&#039; Ansatz verfolgt, so dass keine externen Bibliotheken oder Frameworks benötigt werden. Das komplette Eclipse Projekt kann [http://statecharts.org/Examples/ampel.zip hier] runtergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Realisation von FSMs in Hardware ==&lt;br /&gt;
=== Aufbau einer FSM in digitalen Chips ===&lt;br /&gt;
&lt;br /&gt;
Sollen sehr schnelle Steuerungen und Entscheider aufgebaut werden, wurden und werden digitale Bausteine mit Logikgattern verdrahtet, die steuerbare Zähler enthalten. Damit lassen sich effektive Taktgeschwindigkeiten im Bereich von mehreren MHz erreichen, die in Sicherheitsbereichen eingesetzt werden. Oft werden solche Schaltungen auch zur Überwachung von anderen Schaltungsteilen eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Früher wurden fast alle logischen Schaltungen auf diese Weise entworfen, z.B. auch die ersten Computer von IBM.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung von FSMs in programmierbarer Hardware ===&lt;br /&gt;
&lt;br /&gt;
Da heute digitale Hardware vielfach in Form programmierter PLD- und [[FPGA]]-Bausteine eingesetzt wird, verlagert sich der Entwurf der FSM mehr zu Softwareentwicklung hin. Dabei besteht je nach Vorliegen der funktionellen Beschreibung und eventueller Primärinformation die Möglichkeit, ein Abbild der digitalen Schaltung in VHDL zu formulieren und zu importieren, bzw. ein klassisches state diagram neu zu entwerfen oder die Zustandswechsel in Tabellenform zu importieren und das Erzeugerwerkzeug die FSM generieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Letztendlich kann in Hardware jede sequentielle Logikschaltung, welche [[FlipFlop]]s und Dekoder enthält als FSM betrachtet werden, egal ob es ein einfaches Schieberegister oder eine komplexe ALU einer CPU ist. Die einfachste, denkbare FSM ist ein Toggle-FlipFlop, welches mit jedem Takt seinen Ausgangszustand wechselt.&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsvergleich ==&lt;br /&gt;
In Software realisierte state machines erreichen unter C++ in Windows auch bei hoher Prozessauslastung selten niedrigere Reaktionszeiten als im Millisekundenbereich. Die damit in Echtzeit erfassbaren und prozessierbaren externen Ereignisse bewegen sich üblicherweise im Bereich von einigen 100Hz. Mit Microcontrollern und DSPs erreicht man mit Nicht-Multi-tasking-FSMs Abtastraten bis einige 100kHz. In VHDL realisierte state machines besitzen je nach FPGA-Familie, Art der Codierung und Zyklustiefe typische Taktfrequenzen von 10...100MHz.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.aqdi.com/state.htm Using State Machines In Your Designs] (C) 2003 Hank Wallace&lt;br /&gt;
* [http://qfsm.sourceforge.net/ Qfsm] - A graphical tool for designing finite state machines (GPL)&lt;br /&gt;
* [https://www.itemis.com/en/yakindu/statechart-tools/ YAKINDU Statechart Tools] Ein Werkzeug zum Modellieren und Simulieren von Statecharts sowie Code-Generatoren für Java, C und C++. &lt;br /&gt;
* [http://www.sinelabore.com www.sinelabore.com] Ein Werkzeug das aus UML State Machines C-Code speziell für eingebettete Systeme erzeugt.&lt;br /&gt;
* [http://smc.sourceforge.net SMC The State Machine Compiler]&lt;br /&gt;
* [http://block-net.de/Programmierung/cpp/fsm/fsm.html C/C++ event driven FSM] Open source Werkzeug zur Generierung von C++ FSM Code und UML Diagramm mittels Transitionstabelle. &lt;br /&gt;
* http://astade.tigris.org/ -&amp;gt; http://wiki.astade.de/dokuwiki/doku.php (https://www.mikrocontroller.net/search?query=astade)&lt;br /&gt;
* [http://stefanfrings.de/multitasking_arduino/index.html Zustandsautomaten mit ohne Arduino] von Stefan Frings&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101301</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101301"/>
		<updated>2019-11-17T17:47:20Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Bei einem sogenannten [http://de.wikipedia.org/wiki/Finite_State_Machine Endlichen Zustandsautomaten] (engl. &#039;&#039;&#039;f&#039;&#039;&#039;inite &#039;&#039;&#039;s&#039;&#039;&#039;tate &#039;&#039;&#039;m&#039;&#039;&#039;achine, kurz FSM) handelt es sich um die Realisation eines Steuerungskonzeptes, welches eine abstrahierte Maschine zum Vorbild hat, die eine Reihe von Zuständen besitzt, durch die sich ihr Betriebsablauf definiert. Diese Maschine arbeitet, indem sie von einem Zustand in einen anderen Zustand übergeht und bei derartigen Zustandsübergängen und im Verharren von Zuständen bestimmte Aktionen ausführt. Dabei ergibt sich der Folgezustand aus dem momentanen Zustand und einem externen Ereignis, z. B. einem Tastendruck. Dabei ist die Maschine in verschiedenen Zuständen für ganz bestimmte Ereignisse sensibel.&lt;br /&gt;
&lt;br /&gt;
Die FSM selbst wird fast immer in irgendeiner Weise über einen Takt angetrieben, kann also nicht in beliebig kurzen Zeitspannen auf Ereignisse reagieren und Zustände wechseln. In jedem Takt wird anhand des vorliegenden Zustands und dem Status der Eingabekanäle entschieden, welcher Zustand als nächstes vorliegen soll und welche Aktionen auszuführen sind.&lt;br /&gt;
&lt;br /&gt;
Abstrahierte Formen dieser Maschine werden in vielen elektronischen Geräten eingesetzt, um Bedieneraktivitäten und andere Ereignisse im System zu verarbeiten und autark ablaufende Prozesse geeignet zu beeinflussen. Entsprechend formulierte FSMs können sowohl in Software als auch Hardware aufgebaut werden. &lt;br /&gt;
&lt;br /&gt;
Die Beschreibung einer FSM ist auf mehrere Arten möglich. Zum einen kann sie in Form einer Tabelle beschrieben werden, aber auch eine graphische Darstellung der Zustände und deren Abhängigkeiten in Form eines Zustandsdiagramms ist möglich.&lt;br /&gt;
&lt;br /&gt;
==Darstellung von Zustandsautomaten==&lt;br /&gt;
&lt;br /&gt;
Zustandsautomaten haben den großen Charme, dass es meistens leicht möglich ist, ihre Funktion durch eine Grafik zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es ist eine FSM zu entwerfen, die eine Rollosteuerung übernimmt. Es gibt einen Motor, der sich in 3 Zuständen befinden kann: stop, rauf drehend, runter drehend. Außerdem gibt es Endschalter, welche betätigt werden, wenn das Rollo die jeweilige Endposition erreicht hat. Und es gibt 2 Taster &amp;quot;Up&amp;quot; und &amp;quot;Down&amp;quot; durch welche der Benutzer den Bewegungswunsch an die FSM weitergibt. Irgendwie weiß jeder, wie so eine Rollosteuerung funktioniert, und so recht und schlecht kann das auch jeder in der einen oder anderen Form beschreiben. Aber kann man das ganze auch so &#039;beschreiben&#039;, dass man im Vorfeld, vor der Programmierung tatsächlich alle Eventualitäten erfasst und so darstellt, dass auch ein Nicht-Informatiker die Funktionsweise versteht? Genau an dieser Stelle kommt die graphische Darstellung ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Wie sieht nun eine derartige FSM aus? Jede Wolke im Bild sei ein Zustand, dem man einen Namen gibt. Die Pfeile zwischen den Wolken zeigen die Zustandsübergänge an, wobei am Pfeil vermerkt ist, unter welcher Bedingung dieser Übergang genommen werden kann (in Rot) und welche Aktionen dabei auszuführen sind (in Blau).&lt;br /&gt;
&lt;br /&gt;
[[Datei:StateRollo.jpg|center|framed|Zustandsautomat für eine Rollosteuerung]]&lt;br /&gt;
&lt;br /&gt;
Aus der Zeichnung ist ablesbar:&lt;br /&gt;
Befindet sich die Maschine im Zustand &amp;quot;unten&amp;quot; und wird die Taste &amp;quot;Up&amp;quot; gedrückt, dann folgt als Aktion, daß der Motor auf &amp;quot;rauf drehend&amp;quot; gestellt wird und gleichzeitig wechselt die Maschine in den Zustand &amp;quot;nach oben&amp;quot;. In diesem Zustand verbleibt die Maschine, während der Motor immer weiter dreht, bis der Endschalter meldet, dass das Rollo oben angekommen ist. Dies ist eine Möglichkeit wie die Maschine den Zustand &amp;quot;nach oben&amp;quot; verlassen kann. In diesem Fall wird dann der Motor abgeschaltet und die Maschine wechselt in den Zustand &amp;quot;oben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Man sieht hier schon, dass es mit so einer Grafik relativ einfach ist, sich von der korrekten Logik zu überzeugen. In einfachsten Fall legt man zur Simulation einfach einen Gegenstand in die betreffende Wolke, die den gerade aktiven Zustand symbolisiert. Danach geht man alle Möglichkeiten durch, wie diese Maschine von aussen (Taster, Schalter, etc) beeinflusst werden kann und sieht sich an, ob es dafür in der Grafik einen Pfeil gibt, der von der aktiven Wolke wegführt. Gibt es keinen, dann passiert auch nichts. Gibt es einen, dann verschiebt man den Gegenstand in die betreffende Wolke und führt (in Gedanken) die Aktion aus. Auf die Art kann man ganz leicht einige typische Benutzerszenarien durchspielen aber auch ausprobieren, ob man alle Eventualitäten berücksichtigt hat. Denn gerade diese Evantualitäten, an die man am Anfang gar nicht denkt, die sind es, die einem in weiterer Folge oft Probleme bereiten.&lt;br /&gt;
&lt;br /&gt;
Um bei der Rollosteuerung zu bleiben: Was soll denn passieren, wenn das Rollo gerade hochfährt und der Benutzer ein weiteres mal auf &amp;quot;Up&amp;quot; drückt? Oder wenn er auf &amp;quot;Down&amp;quot; drückt? In der Grafik ist ersichtlich, wie in diesem Fall zu verfahren ist. (Und Hand aufs Herz: Hätten Sie daran gedacht, dass diese Fälle zu berücksichtigen sind, als sie &#039;Rollosteuerung&#039; gelesen haben?)&lt;br /&gt;
&lt;br /&gt;
==Implementierungsvariationen==&lt;br /&gt;
&lt;br /&gt;
Der konkrete softwaremässige Aufbau einer FSM kann in weiten Grenzen variieren. Das grundlegende Konzept, Aktionen an Zustände zu knüpfen und logische Abläufe an die Abfolge von Zuständen zu binden, bleibt dabei in allen Fällen erhalten. Aber je nach Lust und Laune und dem Können des Programmierers gibt es viele unterschiedliche Möglichkeiten eine FSM zu implementieren. Ziel ist es dabei immer, die eigentliche Maschine, also das was in der Zustandstabelle ausgedrückt wird, so einfach und überschaubar wie möglich zu präsentieren. Sie implementiert die Logik und definiert was die Maschine eigentlich macht und warum sie es macht. Ein einfacher Ansatz ist die Verwendung des C-Konstukts switch, in der in jedem case-zweig die einzelnen Zustände kodiert werden. Es ist aber auch durchaus möglich eine universelle FSM zu bauen, bei denen eine generische Funktion die Tabelle in Arrayform bekommt und zusammen mit einigen globalen Variablen die Maschine implementiert. Oft wird auch eine Statemaschine dadurch gebaut, indem das zentrale switch-case Konstukt der Sprache [C] durch einen einzelnen [[Funktionszeiger in C | Funktionszeiger]] ersetzt wird und jeder Zustand nichts anderes als eine Funktion ist. Der Übergang von einem Zustand in einen anderen Zustand ist dann nichts anderes als das Zuweisen einer Funktion an diesen Funktionszeiger. Oder aber man kombiniert Tabelle und Funktionszeiger in ein gemeinsames Konzept.&lt;br /&gt;
&lt;br /&gt;
==Grundlegender Aufbau==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird eine FSM in Software verwirklicht, welche die Ampelsteuerung einer Kreuzung übernimmt.&lt;br /&gt;
[[Bild:Statemachine_Kreuzung.png|center|framed|Ampeln an einer Kreuzung]]&lt;br /&gt;
&lt;br /&gt;
Die Abfolge der Lichtzeichen einer einzelnen Ampel ist dabei&lt;br /&gt;
&amp;lt;br&amp;gt;[[Bild:Statemachine_Ampel.png|center|framed|Zustände einer einzelnen Ampel]]&lt;br /&gt;
&lt;br /&gt;
Die komplette Lichtfolge aller Ampeln in der Kreuzung stellt sich dann wie folgt dar: Es ist dabei ausreichend, nur Ampel 1 und Ampel 2 zu betrachten, da Ampel 3 bzw. Ampel 4 die jeweils gleichen Lichtsignale anzeigen. Dies muss nicht immer so sein! Auf einer Kreuzung kann es durchaus für eine Fahrtrichtung Zusatzampeln geben, die die Lichtfolge der Hauptampel modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustandsnummer ist in diesem Fall einfach die Taktung der FSM. Verfolgt man die Zustände von einem Zustand zum nächsten, dann kann man sich sehr leicht davon überzeugen, daß die Lichtfolge der beiden Ampeln tatsächlich der gewünschten Abfolge entspricht.&lt;br /&gt;
&lt;br /&gt;
Hat man die Funktionalität einer FSM erst mal soweit in Tabellenform festgelegt, dann ist es sehr einfach daraus ein Programm in einer Programmiersprache wie z.B. C abzuleiten, welches diese Statemachine implementiert.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man dabei folgenden Aufbau vornehmen:&lt;br /&gt;
* Es gibt eine globale Variable, die den aktuellen Zustand der Maschine repräsentiert. Die Zustände wurden in obiger Tabelle bereits durchnummeriert, so dass es sich anbietet, Zustände innerhalb der Maschine durch ebendiese Zahlen darzustellen.&lt;br /&gt;
* Die FSM wird als Funktion implementiert, die für jeden einzelnen Takt aufgerufen wird.&lt;br /&gt;
* Jeder Zustand wird innerhalb der Funktion durch einen case innerhalb einer  switch Anweisung dargestellt.&lt;br /&gt;
* Jeder Zustand kann vor verlassen der Funktion den aktuellen Zustand der FSM beim nächsten Aufruf der Funktion festlegen, indem er an die globale Variable die Nummer des nächsten Zustands zuweist.&lt;br /&gt;
* Jegliche Form von Warteschleifen innerhalb der FSM sind verboten. Wenn die FSM auf ein Ereignis warten müsste, dann ist dafür ein eigener Zustand vorzusehen, der auf das Eintreten des Ereignisses prüft und nur dann den nächsten Zustand auswählt, wenn das Ereignis tatsächlich eingetreten ist. Damit erreicht man [[Multitasking]].&lt;br /&gt;
* Es ist sinnvoll, den Ampelfarben Namen in Form eines #define oder enums zu geben, damit wird das Konstrukt deutlich leichter lesbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );  // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );  // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
&lt;br /&gt;
unsigned char state = 1;   // globale Variable, die den Status repräsentiert&lt;br /&gt;
&lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      state = 2;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = 3;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 4;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 4:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 5;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 5:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 6;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 6:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 7;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 7:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 8;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 8:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = 1;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    stateMachine();&lt;br /&gt;
    delay_ms( 1000 );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird diese Funktion im Sekundentakt aufgerufen, so werden die Funktionen Ampel1() bzw. Ampel2() mit der jeweils richtigen Lichtstellung in der richtigen Reihenfolge aufgerufen um die Lichtwechsel der Ampeln einer Kreuzung zu realisieren. Der Einfachheit halber wird in diesem Beispiel die Funktion delay_ms() verwendet. Praktisch wird man in den meisten Fällen besser einen [[Timer]] benutzen, um die Statemachine periodisch aufzurufen. Wie das geht und was das für Vorteile hat ist im Artikel [[Multitasking#Verbesserter Ansatz mit Timer | Multitasking]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Reaktionen auf äußere Ereignisse==&lt;br /&gt;
&lt;br /&gt;
Obige Statemaschine ist noch sehr primitiv. Angenommen an dieser Ampelkreuzung gibt es eine Induktionsschleife. Diese sei derartig geschaltet, dass die Hauptrichtung über Ampel2/Ampel4 ständig Grün zeigt und nur bei Annäherung eines Fahrzeugs auf der Strecke Ampel1/Ampel3 wird ein Lichtwechselzyklus durchgeführt, um diesem Fahrzeug die geordnete Durchfahrt zu ermöglichen. Die Statemaschine muss daher auf ein äußeres Ereignis reagieren können. Der Übergang von Zustand 1 in Zustand 2 ist von diesem Ereignis abhängig. Nur wenn es auftritt wird dieser Übergang durchgeführt, ansonsten verbleibt die Maschine im Zustand 1. Die Beschreibung der FSM wird also um einen weiteren Tabelleneintrag ergänzt, in dem festgehalten wird, wie mit dem zusätzlichen Eingang verfahren werden soll. In dieserm erweiterten Beispiel sollen die Zustände mit einem aussagekräftigen Namen versehen werden, denn Menschen sind sehr schlecht im Umgang mit abstrakten Zahlen, sie sind viel besser mit Wörtern vertraut. Die x in der Tabellenspalte &amp;quot;Induktionsschleife&amp;quot; besagen, daß dieses Eingangsignal für die Entscheidungen der Statemaschine keine Rolle spielt (engl. don&#039;t care).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!| Zustand ||| Name ||| Ampel 1 || | Ampel 2 ||  Induktionsschleife || | nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || OSTWEST_GRUEN      || rot     ||  grün      || ==1 ? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || OSTWEST_GELB       || rot     ||  gelb      || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || ALLE_ROT_1         || rot     ||  rot       || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || NORDSUED_ROTGELB   ||rot/gelb ||  rot       || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || NORDSUED_GRUEN     || grün    ||  rot       || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || NORDSUED_GELB      || gelb    ||  rot       || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || ALLE_ROT_2         || rot     ||  rot       || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || OSTWEST_ROTGELB    || rot     ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB, ALLE_ROT_2} state_t ;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLE_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLE_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Warteschleifen==&lt;br /&gt;
&lt;br /&gt;
Das Warten auf ein äußeres Ereignis kann mit dem Verzweigen oder auch nicht Verzweigen in einen anderen Zustand realisiert werden. In obiger Statemaschine soll z.B. die Grünphase der Ampel1 von einem Takt auf 5 Takte angehoben werden. Grundfalsch wäre es, dies jetzt mit einer while-Schleife im Zustand 5 zu realisieren. Warten wird immer über zusätzliche Zustände realisiert. Eine Statemaschine darf innerhalb eines Zustands niemals auf etwas warten, sondern muss so schnell als möglich die Kontrolle wieder abgeben. Geht man naiv an die Sache ran, dann könnte man die 5 Takte über die Einführung von zusätzlichen Zuständen leicht erreichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| Induktionsschleife ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || grün ||  rot  || x || 10&lt;br /&gt;
|-&lt;br /&gt;
| 10 || grün ||  rot  || x || 11&lt;br /&gt;
|-&lt;br /&gt;
| 11 || grün ||  rot  || x || 12&lt;br /&gt;
|-&lt;br /&gt;
| 12 || grün ||  rot  || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daß ein derartiges Vorgehen bei längeren Wartezeiten oder gar bei berechneter Wartezeitdauer nicht praktikabel ist, dürfte auf der Hand liegen. Besser ist daher die Einführung eines internen Zählers sowie nur eines einzigen, neuen Wartezustands. Beginnt die Wartezeit wird der Zähler auf einen Wert entsprechend der Wartezeit gestellt. Im neuen Zustand wird der Zähler um 1 verringert und nur dann, wenn der Zähler 0 erreicht hat, wird in den ursprünglichen Folgezustand gewechselt. Der Zähler kann also in ähnlicher Form wie die Induktionsschleife als Ereignislieferant aufgefasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:15em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Zustand ||width=&amp;quot;10%&amp;quot;| Ampel 1 ||width=&amp;quot;10%&amp;quot;| Ampel 2 ||width=&amp;quot;10%&amp;quot;| Induktionsschleife ||width=&amp;quot;10%&amp;quot;| Wartezeit ||width=&amp;quot;10%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1 ? || x || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x || x || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || =4 || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || x ||  x  || x || dec / ==0 ? || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB,&lt;br /&gt;
               ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB,&lt;br /&gt;
               ALLE_ROT_2, WARTE_NORDSUED}  state_t;&lt;br /&gt;
 &lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
unsigned char zaehler;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLES_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      zaehler = 4;&lt;br /&gt;
      state = WARTE_NORDSUED;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case WARTE_NORDSUED:&lt;br /&gt;
      zaehler = zaehler - 1;&lt;br /&gt;
      if( zaehler == 0 )&lt;br /&gt;
        state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Tabellenform ==&lt;br /&gt;
&lt;br /&gt;
Im letzten Beispiel wollen wir die Ampelsteuerung noch etwas realistischer gestalten. Denn die einzelnen Phasen sind unterschiedlich lang, der Zustand Gelb ist deutlich kürzer als der Zustand Grün. Wenn wir also in fast jedem Zustand eine bestimmte Anzahl Takte warten wollen, erscheint es nicht sinnvoll, dafür jedesmal einen neuen Zustand anzuspringen. Sinnvoller ist die Integration des Wartens direkt in den Zustand, so wie im vorherigen Beispiel der Zustand &amp;quot;WARTE_NORDSUED&amp;quot;. Dabei fallen jedoch zwei Sachen auf.&lt;br /&gt;
&lt;br /&gt;
* In jedem Zustand muss die Wartezeit des &#039;&#039;nächsten&#039;&#039; Zustands zugewiesen werden. Das ist etwas verwirrend.&lt;br /&gt;
* Fast alle Anweisungen sind gleich in den Zuständen, nur die Zahlen und der Wert für den nächsten Zustand ändern sich.&lt;br /&gt;
&lt;br /&gt;
Darum soll hier die FSM von einer großen switch Anweisung auf eine Tabelle geändert werden. Das hat den Vorteil, dass die Zustandstabelle nahezu 1:1 in den Quelltext geschrieben werden kann und sie so sehr kompakt und übersichtlich ist. Die eigentliche FSM wird sehr klein und arbeitet sich durch die Tabelle durch. Zur weiteren Verbesserung der Lesbarkeit (siehe [[Strukturierte Programmierung auf Mikrocontrollern]]) nutzen wir einen Struct, welche den Zustand der State machine mit sinnvollen Variablennamen beschreibt. Bei dieser Methode muss man beachten, dass die Reihenfolge der Zustände in der enum Definition gleich sein muss mit der Reihenfolge der Zustände in der Tabelle, sonst funktioniert es nicht. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define GRUEN     2&lt;br /&gt;
#define GELB      4&lt;br /&gt;
#define ROTGELB   5&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
int Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
 &lt;br /&gt;
typedef enum { OSTWEST_GRUEN=0, OSTWEST_GELB, ALLE_ROT_1,&lt;br /&gt;
               NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_2,&lt;br /&gt;
               OSTWEST_ROTGELB }  state_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int Ampel1;&lt;br /&gt;
    int Ampel2;&lt;br /&gt;
    int I_Schleife;&lt;br /&gt;
    int Wartezeit;&lt;br /&gt;
    int Naechster;&lt;br /&gt;
} ampel_state_t;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
int zaehler=1;&lt;br /&gt;
 &lt;br /&gt;
// Tabelle fuer state machine&lt;br /&gt;
 &lt;br /&gt;
ampel_state_t state_table[8] = {&lt;br /&gt;
 &lt;br /&gt;
// AMPEL1 AMPEL2   Induktionsschleife ? &lt;br /&gt;
// |         |       |   Wartezeit in s&lt;br /&gt;
// |         |       |   |&lt;br /&gt;
// |         |       |   |   naechster Zustand     Name&lt;br /&gt;
//----------------------------------------------------------------------&lt;br /&gt;
{ROT     , GRUEN   , 1, 10,  OSTWEST_GELB},        // OSTWEST_GRUEN&lt;br /&gt;
{ROT     , GELB    , 0,  1,  ALLE_ROT_1},          // OSTWEST_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  NORDSUED_ROTGELB},    // ALLE_ROT_1&lt;br /&gt;
{ROTGELB , ROT     , 0,  1,  NORDSUED_GRUEN},      // NORDSUED_ROTGELB&lt;br /&gt;
{GRUEN   , ROT     , 0, 10,  NORDSUED_GELB},       // NORDSUED_GRUEN&lt;br /&gt;
{GELB    , ROT     , 0,  1,  ALLE_ROT_2},          // NORDSUED_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  OSTWEST_ROTGELB},     // ALLE_ROT_2&lt;br /&gt;
{ROT     , ROTGELB , 0,  1,  OSTWEST_GRUEN}};      // OSTWEST_ROTGELB&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
    Ampel1(state_table[state].Ampel1);&lt;br /&gt;
    Ampel2(state_table[state].Ampel2);&lt;br /&gt;
 &lt;br /&gt;
    if (zaehler&amp;gt;0) {&lt;br /&gt;
        zaehler--;    &lt;br /&gt;
    } else {&lt;br /&gt;
        if ( ((state_table[state].I_Schleife == 1) &amp;amp;&amp;amp; Induktionsschleife() ) ||&lt;br /&gt;
             (state_table[state].I_Schleife == 0) )&lt;br /&gt;
        {&lt;br /&gt;
            state =   state_table[state].Naechster;&lt;br /&gt;
            zaehler = state_table[state].Wartezeit;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierung einer objektorientierten Finite State Machine in C++==&lt;br /&gt;
&lt;br /&gt;
* Notation von Endlichen Automaten in UML&lt;br /&gt;
* Praktisches Beispiel, anhand dessen die Funktionsweise eines Toasters erklärt wird. Dazu wird die Notation in UML verwendet. &lt;br /&gt;
* Implementation des Beispiels in C++ auf einem AVR-Controller&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Möglichkeit bzw. das Beispiel sollte als Denkanstoss verstanden werden und nicht als Referenzimplementation. Es wurden bewusst bestimmte Feinheiten von endlichen Automaten verzichtet, um das Beispiel auf gut verständlichem Niveau zu halten. &lt;br /&gt;
&lt;br /&gt;
* Dokumentation im PDF Format [http://www.mikrocontroller.net/attachment/137066/ImplementierungEinerFiniteStateMachine_V1.1.pdf ImplementierungEinerFiniteStateMachine_V1.1.pdf]&lt;br /&gt;
* LaTeX Source der Dokumentation [http://www.mikrocontroller.net/attachment/137067/Dokumentation_Source_V1.1.zip Dokumentation_Source_V1.1.zip]&lt;br /&gt;
* Beispielcode für AVR-Studio 4 [http://www.mikrocontroller.net/attachment/135434/AVR_Beispiel_Source.zip AVR_Beispiel_Source.zip]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/248837#2556592 Forumsbeitrag]: Eine objektorientierte State Machine in C++&lt;br /&gt;
&lt;br /&gt;
== Grafische Modellierung einer Finite State Machine ==&lt;br /&gt;
Das Open Source Werkzeug Yakindu Statechart Tools (http://www.statecharts.org) ermöglicht es Zustandsautomaten grafisch zu modellieren, deren Verhalten zu simulieren und Code für verschiedene Sprachen (C/C++, Java) zu generieren.&lt;br /&gt;
Die grafischen Modellelemente entsprechen denen der UML2 und werden durch eine einfache und zweckmäßige Expression-Language ergänzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfaches Ampel Modell&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Modell einer einfachen Ampel wie oben beschrieben sieht in Yakindu SCT wie folgt aus: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1.jpg|center|framed|Einfaches Ampel Modell]]&lt;br /&gt;
&lt;br /&gt;
Wie erwartet hat die Ampel vier Zustände, die wiederum mit Übergangs-Pfeilen (Transitionen) verbunden sind. Jede Transition verfügt über einen Auslöser, in diesem Fall mit dem Namen &#039;&#039;tick&#039;&#039;    &lt;br /&gt;
Mit Hilfe der Yakindu DSL wird im linken Teil des Editors ein internes Event mit dem Name &amp;quot;tick&amp;quot; definiert, das entsprechend der Taktung des Zustandsautomaten &amp;quot;gefeuert&amp;quot; werden soll. Der Ausdruck &#039;&#039;every 1s / raise tick&#039;&#039; sorgt dafür, dass das Event &#039;&#039;tick&#039;&#039; jede Sekunde einmal gefeuert wird.&lt;br /&gt;
Da Yakindu SCT es erlaubt Zustandsautomaten zu simulieren, ist es jederzeit überprüfbar ob das modellierte Verhalten den Erwartungen entspricht. Über &#039;&#039;Run as... --&amp;gt; YAKINDU Statechart&#039;&#039; lässt sich in die &#039;&#039;Simulation View&#039;&#039; wechseln. Der jeweils aktive Zustand wird nun rot hinterlegt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1b.jpg|center|framed|Simulation View]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfache Kreuzung mit Zwei Ampel-Gruppen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im zweiten Beispiel soll eine einfache Ampelkreuzung modelliert werden. Es wird davon ausgegangen, dass die Ampeln in zwei Gruppen geschaltet werden. Ampel 1 und 3 bilden die nord_süd – Gruppe, während die übrigen Ampeln die ost-west – Gruppe bilden. Der Einfachheit halber werden Ampeln einer Gruppe immer gleich geschaltet. Wie oben darf eine Ampel-Gruppe nur dann den Zustand &#039;&#039;rot&#039;&#039; verlassen, wenn die jeweils andere Gruppe sich im Zustand &#039;&#039;rot&#039;&#039; befindet. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel2.jpg|800px|center|Ampelkreuzung]]&lt;br /&gt;
&lt;br /&gt;
Im Yakindu SCT Modell gibt es nun für jede Ampel-Gruppe eine eigene Region. Wird der Zustandsautomat betreten so wird nun parallel der Zustand &#039;&#039;rot&#039;&#039; in der &#039;&#039;nord_sued&#039;&#039; Region und der Zustand &#039;&#039;gruen&#039;&#039; in der &#039;&#039;ost_west&#039;&#039; Region aktiv. Wie bereits im ersten Beispiel wird der Zustandsautomat über das &#039;&#039;tick&#039;&#039; Ereignis angetrieben, das jede Sekunde einmal auftritt. &lt;br /&gt;
Um das gewünschte Ampel-Verhalten zu modellieren wird nun die Transition von &#039;&#039;rot&#039;&#039; zu &#039;&#039;rot-gelb&#039;&#039; mit einem &#039;&#039;Guard&#039;&#039;, also einer Bedingung geschützt. Zwar wird der Übergang weiterhin mit dem Ereignis &#039;&#039;tick&#039;&#039; angestoßen, allerdings wird der Übergang nur ausgeführt wenn die in eckigen Klammern formulierte Boolesche-Bedingung erfüllt ist. Die Funktion &#039;&#039;active()&#039;&#039; gehört zu den Bordmitteln von Yakindu SCT und prüft ob ein bestimmter Zustand aktiv ist. In diesem Beispiel kann in der Region &#039;&#039;nord_sued&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; nur verlassen werden, wenn in der Region &#039;&#039;ost-west&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; aktiv ist. Wie auch im vorhergegangenen Beispiel lässt sich das Verhalten simulieren, so das überprüft werden kann ob das Verhalten den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ampel mit Induktionsschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Verhalten der Ampelanlage aus Beispiel 2 soll um eine Induktionsschleife erweitert werden. Der Verkehr an der Ampelanlage fließt normalerweise in &#039;&#039;ost_west&#039;&#039; – Richtung, daher die Ampel in dieser Richtung immer den Zustand &#039;&#039;grün&#039;&#039; haben, es sei denn die Induktionsschleife in &#039;&#039;nord-süd&#039;&#039; - Richtung wird ausgelöst.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel3.jpg|800px|center|Ampelkreuzung mit Induktionsschleife]]&lt;br /&gt;
&lt;br /&gt;
Um dieses Verhalten in das SCT-Modell zu integrieren muss zunächst ein neues Ereignis definiert werden. Dieses Ereignis wird als Teil des &#039;&#039;Interface-Scopes&#039;&#039; definiert, da es außerhalb des Zustandsautomaten erzeugt werden soll. Ereignisse die Teil einer externen Schnittstelle sind werden mit einer Richtung (in / out) deklariert, die angibt ob das Ereignis den Zustandsautomat betritt, oder verlässt. &lt;br /&gt;
&lt;br /&gt;
Nach dem das neue Ereignis definiert ist,  muss nur noch der Auslöser für den Übergang von &#039;&#039;gruen&#039;&#039; zu &#039;&#039;gelb&#039;&#039; geändert werden. Statt wie bisher durch das &#039;&#039;tick&#039;&#039; Event, wird nun das &#039;&#039;induktionsSignal&#039;&#039; als Auslöser verwendet. In der Simulations-Ansicht kann das neue Ereignis manuell mit einem Klick ausgelöst werden, so dass das korrekte Verhalten wieder getestet werden kann.   &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_simView.jpg|center|framed|Induktionsschleife auslösen]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warteschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es soll die Grün-Phase verlängert werden, so dass erst nach dem 5. &#039;&#039;tick&#039;&#039; der Übergang in den &#039;&#039;gelb&#039;&#039; Zustand erfolgt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct beispiel4.jpg|800px|center|Ampelkreuzung mit Warteschleife]]&lt;br /&gt;
&lt;br /&gt;
Um eine Warteschleife zu realisieren wird dem &#039;&#039;Internal-Scope&#039;&#039; zuerst eine neue Variable hinzugefügt. Da während des Wartens der &#039;&#039;grün&#039;&#039; Zustand nicht verlassen wird, lässt sich das Herunterzählen der Wartezeit mittels eines zusammengesetzten Zustands darstellen. Wird der Zustand &#039;&#039;grün&#039;&#039; betreten, wird zunächst einen Eintritts-Aktion ausgeführt, die den Wert von &#039;&#039;wartezeit&#039;&#039; auf 5 setzt. Außerdem wird ebenfalls der Zustand &#039;&#039;Warten&#039;&#039; aktiv. Erfolgt nun ein &#039;&#039;tick&#039;&#039; wird ohne &#039;&#039;grün&#039;&#039; zu verlassen in &#039;&#039;WartezeitVerringern&#039;&#039; gewechselt und der Wert von &#039;&#039;wartezeit&#039;&#039; um 1 verringert. &lt;br /&gt;
Der Übergang zu &#039;&#039;gelb&#039;&#039; ist wieder durch einen Guard geschützt und kann nur erfolgen wenn die  Bedingung &#039;&#039;wartezeit == 0&#039;&#039; erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Code aus dem Modell generieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um nun Code aus dem Modell zu generieren muss zuerst eine GeneratorModel-Datei erzeugt werden, in der unter anderem die Ziel-Sprache angegeben wird.&lt;br /&gt;
Um den Zustandsautomaten abzubilden verwendet die konkrete Implementierung ein &#039;&#039;switch case&#039;&#039; Konstrukt, das dem oben Gezeigten ähnelt. Außerdem wurde ein &#039;&#039;code-only&#039;&#039; Ansatz verfolgt, so dass keine externen Bibliotheken oder Frameworks benötigt werden. Das komplette Eclipse Projekt kann [http://statecharts.org/Examples/ampel.zip hier] runtergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Realisation von FSMs in Hardware ==&lt;br /&gt;
=== Aufbau einer FSM in digitalen Chips ===&lt;br /&gt;
&lt;br /&gt;
Sollen sehr schnelle Steuerungen und Entscheider aufgebaut werden, wurden und werden digitale Bausteine mit Logikgattern verdrahtet, die steuerbare Zähler enthalten. Damit lassen sich effektive Taktgeschwindigkeiten im Bereich von mehreren MHz erreichen, die in Sicherheitsbereichen eingesetzt werden. Oft werden solche Schaltungen auch zur Überwachung von anderen Schaltungsteilen eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Früher wurden fast alle logischen Schaltungen auf diese Weise entworfen, z.B. auch die ersten Computer von IBM.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung von FSMs in programmierbarer Hardware ===&lt;br /&gt;
&lt;br /&gt;
Da heute digitale Hardware vielfach in Form programmierter PLD- und [[FPGA]]-Bausteine eingesetzt wird, verlagert sich der Entwurf der FSM mehr zu Softwareentwicklung hin. Dabei besteht je nach Vorliegen der funktionellen Beschreibung und eventueller Primärinformation die Möglichkeit, ein Abbild der digitalen Schaltung in VHDL zu formulieren und zu importieren, bzw. ein klassisches state diagram neu zu entwerfen oder die Zustandswechsel in Tabellenform zu importieren und das Erzeugerwerkzeug die FSM generieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Letztendlich kann in Hardware jede sequentielle Logikschaltung, welche [[FlipFlop]]s und Dekoder enthält als FSM betrachtet werden, egal ob es ein einfaches Schieberegister oder eine komplexe ALU einer CPU ist. Die einfachste, denkbare FSM ist ein Toggle-FlipFlop, welches mit jedem Takt seinen Ausgangszustand wechselt.&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsvergleich ==&lt;br /&gt;
In Software realisierte state machines erreichen unter C++ in Windows auch bei hoher Prozessauslastung selten niedrigere Reaktionszeiten als im Millisekundenbereich. Die damit in Echtzeit erfassbaren und prozessierbaren externen Ereignisse bewegen sich üblicherweise im Bereich von einigen 100Hz. Mit Microcontrollern und DSPs erreicht man mit Nicht-Multi-tasking-FSMs Abtastraten bis einige 100kHz. In VHDL realisierte state machines besitzen je nach FPGA-Familie, Art der Codierung und Zyklustiefe typische Taktfrequenzen von 10...100MHz.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.aqdi.com/state.htm Using State Machines In Your Designs] (C) 2003 Hank Wallace&lt;br /&gt;
* [http://qfsm.sourceforge.net/ Qfsm] - A graphical tool for designing finite state machines (GPL)&lt;br /&gt;
* [https://www.itemis.com/en/yakindu/statechart-tools/ YAKINDU Statechart Tools] Ein Werkzeug zum Modellieren und Simulieren von Statecharts sowie Code-Generatoren für Java, C und C++. &lt;br /&gt;
* [http://www.sinelabore.com www.sinelabore.com] Ein Werkzeug das aus UML State Machines C-Code speziell für eingebettete Systeme erzeugt.&lt;br /&gt;
* [http://smc.sourceforge.net SMC The State Machine Compiler]&lt;br /&gt;
* [http://block-net.de/Programmierung/cpp/fsm/fsm.html C/C++ event driven FSM] Open source Werkzeug zur Generierung von C++ FSM Code und UML Diagramm mittels Transitionstabelle. &lt;br /&gt;
* http://astade.tigris.org/ -&amp;gt; http://wiki.astade.de/dokuwiki/doku.php (https://www.mikrocontroller.net/search?query=astade)&lt;br /&gt;
* [http://stefanfrings.de/multitasking_arduino/index.html Zustandsautomaten mit Arduino] und ohne Arduino&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101300</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=101300"/>
		<updated>2019-11-17T17:46:15Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Bei einem sogenannten [http://de.wikipedia.org/wiki/Finite_State_Machine Endlichen Zustandsautomaten] (engl. &#039;&#039;&#039;f&#039;&#039;&#039;inite &#039;&#039;&#039;s&#039;&#039;&#039;tate &#039;&#039;&#039;m&#039;&#039;&#039;achine, kurz FSM) handelt es sich um die Realisation eines Steuerungskonzeptes, welches eine abstrahierte Maschine zum Vorbild hat, die eine Reihe von Zuständen besitzt, durch die sich ihr Betriebsablauf definiert. Diese Maschine arbeitet, indem sie von einem Zustand in einen anderen Zustand übergeht und bei derartigen Zustandsübergängen und im Verharren von Zuständen bestimmte Aktionen ausführt. Dabei ergibt sich der Folgezustand aus dem momentanen Zustand und einem externen Ereignis, z. B. einem Tastendruck. Dabei ist die Maschine in verschiedenen Zuständen für ganz bestimmte Ereignisse sensibel.&lt;br /&gt;
&lt;br /&gt;
Die FSM selbst wird fast immer in irgendeiner Weise über einen Takt angetrieben, kann also nicht in beliebig kurzen Zeitspannen auf Ereignisse reagieren und Zustände wechseln. In jedem Takt wird anhand des vorliegenden Zustands und dem Status der Eingabekanäle entschieden, welcher Zustand als nächstes vorliegen soll und welche Aktionen auszuführen sind.&lt;br /&gt;
&lt;br /&gt;
Abstrahierte Formen dieser Maschine werden in vielen elektronischen Geräten eingesetzt, um Bedieneraktivitäten und andere Ereignisse im System zu verarbeiten und autark ablaufende Prozesse geeignet zu beeinflussen. Entsprechend formulierte FSMs können sowohl in Software als auch Hardware aufgebaut werden. &lt;br /&gt;
&lt;br /&gt;
Die Beschreibung einer FSM ist auf mehrere Arten möglich. Zum einen kann sie in Form einer Tabelle beschrieben werden, aber auch eine graphische Darstellung der Zustände und deren Abhängigkeiten in Form eines Zustandsdiagramms ist möglich.&lt;br /&gt;
&lt;br /&gt;
==Darstellung von Zustandsautomaten==&lt;br /&gt;
&lt;br /&gt;
Zustandsautomaten haben den großen Charme, dass es meistens leicht möglich ist, ihre Funktion durch eine Grafik zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es ist eine FSM zu entwerfen, die eine Rollosteuerung übernimmt. Es gibt einen Motor, der sich in 3 Zuständen befinden kann: stop, rauf drehend, runter drehend. Außerdem gibt es Endschalter, welche betätigt werden, wenn das Rollo die jeweilige Endposition erreicht hat. Und es gibt 2 Taster &amp;quot;Up&amp;quot; und &amp;quot;Down&amp;quot; durch welche der Benutzer den Bewegungswunsch an die FSM weitergibt. Irgendwie weiß jeder, wie so eine Rollosteuerung funktioniert, und so recht und schlecht kann das auch jeder in der einen oder anderen Form beschreiben. Aber kann man das ganze auch so &#039;beschreiben&#039;, dass man im Vorfeld, vor der Programmierung tatsächlich alle Eventualitäten erfasst und so darstellt, dass auch ein Nicht-Informatiker die Funktionsweise versteht? Genau an dieser Stelle kommt die graphische Darstellung ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Wie sieht nun eine derartige FSM aus? Jede Wolke im Bild sei ein Zustand, dem man einen Namen gibt. Die Pfeile zwischen den Wolken zeigen die Zustandsübergänge an, wobei am Pfeil vermerkt ist, unter welcher Bedingung dieser Übergang genommen werden kann (in Rot) und welche Aktionen dabei auszuführen sind (in Blau).&lt;br /&gt;
&lt;br /&gt;
[[Datei:StateRollo.jpg|center|framed|Zustandsautomat für eine Rollosteuerung]]&lt;br /&gt;
&lt;br /&gt;
Aus der Zeichnung ist ablesbar:&lt;br /&gt;
Befindet sich die Maschine im Zustand &amp;quot;unten&amp;quot; und wird die Taste &amp;quot;Up&amp;quot; gedrückt, dann folgt als Aktion, daß der Motor auf &amp;quot;rauf drehend&amp;quot; gestellt wird und gleichzeitig wechselt die Maschine in den Zustand &amp;quot;nach oben&amp;quot;. In diesem Zustand verbleibt die Maschine, während der Motor immer weiter dreht, bis der Endschalter meldet, dass das Rollo oben angekommen ist. Dies ist eine Möglichkeit wie die Maschine den Zustand &amp;quot;nach oben&amp;quot; verlassen kann. In diesem Fall wird dann der Motor abgeschaltet und die Maschine wechselt in den Zustand &amp;quot;oben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Man sieht hier schon, dass es mit so einer Grafik relativ einfach ist, sich von der korrekten Logik zu überzeugen. In einfachsten Fall legt man zur Simulation einfach einen Gegenstand in die betreffende Wolke, die den gerade aktiven Zustand symbolisiert. Danach geht man alle Möglichkeiten durch, wie diese Maschine von aussen (Taster, Schalter, etc) beeinflusst werden kann und sieht sich an, ob es dafür in der Grafik einen Pfeil gibt, der von der aktiven Wolke wegführt. Gibt es keinen, dann passiert auch nichts. Gibt es einen, dann verschiebt man den Gegenstand in die betreffende Wolke und führt (in Gedanken) die Aktion aus. Auf die Art kann man ganz leicht einige typische Benutzerszenarien durchspielen aber auch ausprobieren, ob man alle Eventualitäten berücksichtigt hat. Denn gerade diese Evantualitäten, an die man am Anfang gar nicht denkt, die sind es, die einem in weiterer Folge oft Probleme bereiten.&lt;br /&gt;
&lt;br /&gt;
Um bei der Rollosteuerung zu bleiben: Was soll denn passieren, wenn das Rollo gerade hochfährt und der Benutzer ein weiteres mal auf &amp;quot;Up&amp;quot; drückt? Oder wenn er auf &amp;quot;Down&amp;quot; drückt? In der Grafik ist ersichtlich, wie in diesem Fall zu verfahren ist. (Und Hand aufs Herz: Hätten Sie daran gedacht, dass diese Fälle zu berücksichtigen sind, als sie &#039;Rollosteuerung&#039; gelesen haben?)&lt;br /&gt;
&lt;br /&gt;
==Implementierungsvariationen==&lt;br /&gt;
&lt;br /&gt;
Der konkrete softwaremässige Aufbau einer FSM kann in weiten Grenzen variieren. Das grundlegende Konzept, Aktionen an Zustände zu knüpfen und logische Abläufe an die Abfolge von Zuständen zu binden, bleibt dabei in allen Fällen erhalten. Aber je nach Lust und Laune und dem Können des Programmierers gibt es viele unterschiedliche Möglichkeiten eine FSM zu implementieren. Ziel ist es dabei immer, die eigentliche Maschine, also das was in der Zustandstabelle ausgedrückt wird, so einfach und überschaubar wie möglich zu präsentieren. Sie implementiert die Logik und definiert was die Maschine eigentlich macht und warum sie es macht. Ein einfacher Ansatz ist die Verwendung des C-Konstukts switch, in der in jedem case-zweig die einzelnen Zustände kodiert werden. Es ist aber auch durchaus möglich eine universelle FSM zu bauen, bei denen eine generische Funktion die Tabelle in Arrayform bekommt und zusammen mit einigen globalen Variablen die Maschine implementiert. Oft wird auch eine Statemaschine dadurch gebaut, indem das zentrale switch-case Konstukt der Sprache [C] durch einen einzelnen [[Funktionszeiger in C | Funktionszeiger]] ersetzt wird und jeder Zustand nichts anderes als eine Funktion ist. Der Übergang von einem Zustand in einen anderen Zustand ist dann nichts anderes als das Zuweisen einer Funktion an diesen Funktionszeiger. Oder aber man kombiniert Tabelle und Funktionszeiger in ein gemeinsames Konzept.&lt;br /&gt;
&lt;br /&gt;
==Grundlegender Aufbau==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird eine FSM in Software verwirklicht, welche die Ampelsteuerung einer Kreuzung übernimmt.&lt;br /&gt;
[[Bild:Statemachine_Kreuzung.png|center|framed|Ampeln an einer Kreuzung]]&lt;br /&gt;
&lt;br /&gt;
Die Abfolge der Lichtzeichen einer einzelnen Ampel ist dabei&lt;br /&gt;
&amp;lt;br&amp;gt;[[Bild:Statemachine_Ampel.png|center|framed|Zustände einer einzelnen Ampel]]&lt;br /&gt;
&lt;br /&gt;
Die komplette Lichtfolge aller Ampeln in der Kreuzung stellt sich dann wie folgt dar: Es ist dabei ausreichend, nur Ampel 1 und Ampel 2 zu betrachten, da Ampel 3 bzw. Ampel 4 die jeweils gleichen Lichtsignale anzeigen. Dies muss nicht immer so sein! Auf einer Kreuzung kann es durchaus für eine Fahrtrichtung Zusatzampeln geben, die die Lichtfolge der Hauptampel modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustandsnummer ist in diesem Fall einfach die Taktung der FSM. Verfolgt man die Zustände von einem Zustand zum nächsten, dann kann man sich sehr leicht davon überzeugen, daß die Lichtfolge der beiden Ampeln tatsächlich der gewünschten Abfolge entspricht.&lt;br /&gt;
&lt;br /&gt;
Hat man die Funktionalität einer FSM erst mal soweit in Tabellenform festgelegt, dann ist es sehr einfach daraus ein Programm in einer Programmiersprache wie z.B. C abzuleiten, welches diese Statemachine implementiert.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man dabei folgenden Aufbau vornehmen:&lt;br /&gt;
* Es gibt eine globale Variable, die den aktuellen Zustand der Maschine repräsentiert. Die Zustände wurden in obiger Tabelle bereits durchnummeriert, so dass es sich anbietet, Zustände innerhalb der Maschine durch ebendiese Zahlen darzustellen.&lt;br /&gt;
* Die FSM wird als Funktion implementiert, die für jeden einzelnen Takt aufgerufen wird.&lt;br /&gt;
* Jeder Zustand wird innerhalb der Funktion durch einen case innerhalb einer  switch Anweisung dargestellt.&lt;br /&gt;
* Jeder Zustand kann vor verlassen der Funktion den aktuellen Zustand der FSM beim nächsten Aufruf der Funktion festlegen, indem er an die globale Variable die Nummer des nächsten Zustands zuweist.&lt;br /&gt;
* Jegliche Form von Warteschleifen innerhalb der FSM sind verboten. Wenn die FSM auf ein Ereignis warten müsste, dann ist dafür ein eigener Zustand vorzusehen, der auf das Eintreten des Ereignisses prüft und nur dann den nächsten Zustand auswählt, wenn das Ereignis tatsächlich eingetreten ist. Damit erreicht man [[Multitasking]].&lt;br /&gt;
* Es ist sinnvoll, den Ampelfarben Namen in Form eines #define oder enums zu geben, damit wird das Konstrukt deutlich leichter lesbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );  // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );  // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
&lt;br /&gt;
unsigned char state = 1;   // globale Variable, die den Status repräsentiert&lt;br /&gt;
&lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      state = 2;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = 3;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 4;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 4:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 5;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 5:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 6;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 6:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 7;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 7:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 8;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 8:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = 1;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    stateMachine();&lt;br /&gt;
    delay_ms( 1000 );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird diese Funktion im Sekundentakt aufgerufen, so werden die Funktionen Ampel1() bzw. Ampel2() mit der jeweils richtigen Lichtstellung in der richtigen Reihenfolge aufgerufen um die Lichtwechsel der Ampeln einer Kreuzung zu realisieren. Der Einfachheit halber wird in diesem Beispiel die Funktion delay_ms() verwendet. Praktisch wird man in den meisten Fällen besser einen [[Timer]] benutzen, um die Statemachine periodisch aufzurufen. Wie das geht und was das für Vorteile hat ist im Artikel [[Multitasking#Verbesserter Ansatz mit Timer | Multitasking]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Reaktionen auf äußere Ereignisse==&lt;br /&gt;
&lt;br /&gt;
Obige Statemaschine ist noch sehr primitiv. Angenommen an dieser Ampelkreuzung gibt es eine Induktionsschleife. Diese sei derartig geschaltet, dass die Hauptrichtung über Ampel2/Ampel4 ständig Grün zeigt und nur bei Annäherung eines Fahrzeugs auf der Strecke Ampel1/Ampel3 wird ein Lichtwechselzyklus durchgeführt, um diesem Fahrzeug die geordnete Durchfahrt zu ermöglichen. Die Statemaschine muss daher auf ein äußeres Ereignis reagieren können. Der Übergang von Zustand 1 in Zustand 2 ist von diesem Ereignis abhängig. Nur wenn es auftritt wird dieser Übergang durchgeführt, ansonsten verbleibt die Maschine im Zustand 1. Die Beschreibung der FSM wird also um einen weiteren Tabelleneintrag ergänzt, in dem festgehalten wird, wie mit dem zusätzlichen Eingang verfahren werden soll. In dieserm erweiterten Beispiel sollen die Zustände mit einem aussagekräftigen Namen versehen werden, denn Menschen sind sehr schlecht im Umgang mit abstrakten Zahlen, sie sind viel besser mit Wörtern vertraut. Die x in der Tabellenspalte &amp;quot;Induktionsschleife&amp;quot; besagen, daß dieses Eingangsignal für die Entscheidungen der Statemaschine keine Rolle spielt (engl. don&#039;t care).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!| Zustand ||| Name ||| Ampel 1 || | Ampel 2 ||  Induktionsschleife || | nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || OSTWEST_GRUEN      || rot     ||  grün      || ==1 ? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || OSTWEST_GELB       || rot     ||  gelb      || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || ALLE_ROT_1         || rot     ||  rot       || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || NORDSUED_ROTGELB   ||rot/gelb ||  rot       || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || NORDSUED_GRUEN     || grün    ||  rot       || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || NORDSUED_GELB      || gelb    ||  rot       || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || ALLE_ROT_2         || rot     ||  rot       || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || OSTWEST_ROTGELB    || rot     ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB, ALLE_ROT_2} state_t ;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLE_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLE_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Warteschleifen==&lt;br /&gt;
&lt;br /&gt;
Das Warten auf ein äußeres Ereignis kann mit dem Verzweigen oder auch nicht Verzweigen in einen anderen Zustand realisiert werden. In obiger Statemaschine soll z.B. die Grünphase der Ampel1 von einem Takt auf 5 Takte angehoben werden. Grundfalsch wäre es, dies jetzt mit einer while-Schleife im Zustand 5 zu realisieren. Warten wird immer über zusätzliche Zustände realisiert. Eine Statemaschine darf innerhalb eines Zustands niemals auf etwas warten, sondern muss so schnell als möglich die Kontrolle wieder abgeben. Geht man naiv an die Sache ran, dann könnte man die 5 Takte über die Einführung von zusätzlichen Zuständen leicht erreichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| Induktionsschleife ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || grün ||  rot  || x || 10&lt;br /&gt;
|-&lt;br /&gt;
| 10 || grün ||  rot  || x || 11&lt;br /&gt;
|-&lt;br /&gt;
| 11 || grün ||  rot  || x || 12&lt;br /&gt;
|-&lt;br /&gt;
| 12 || grün ||  rot  || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daß ein derartiges Vorgehen bei längeren Wartezeiten oder gar bei berechneter Wartezeitdauer nicht praktikabel ist, dürfte auf der Hand liegen. Besser ist daher die Einführung eines internen Zählers sowie nur eines einzigen, neuen Wartezustands. Beginnt die Wartezeit wird der Zähler auf einen Wert entsprechend der Wartezeit gestellt. Im neuen Zustand wird der Zähler um 1 verringert und nur dann, wenn der Zähler 0 erreicht hat, wird in den ursprünglichen Folgezustand gewechselt. Der Zähler kann also in ähnlicher Form wie die Induktionsschleife als Ereignislieferant aufgefasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:15em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Zustand ||width=&amp;quot;10%&amp;quot;| Ampel 1 ||width=&amp;quot;10%&amp;quot;| Ampel 2 ||width=&amp;quot;10%&amp;quot;| Induktionsschleife ||width=&amp;quot;10%&amp;quot;| Wartezeit ||width=&amp;quot;10%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1 ? || x || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x || x || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || =4 || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || x ||  x  || x || dec / ==0 ? || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB,&lt;br /&gt;
               ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB,&lt;br /&gt;
               ALLE_ROT_2, WARTE_NORDSUED}  state_t;&lt;br /&gt;
 &lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
unsigned char zaehler;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLES_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      zaehler = 4;&lt;br /&gt;
      state = WARTE_NORDSUED;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case WARTE_NORDSUED:&lt;br /&gt;
      zaehler = zaehler - 1;&lt;br /&gt;
      if( zaehler == 0 )&lt;br /&gt;
        state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Tabellenform ==&lt;br /&gt;
&lt;br /&gt;
Im letzten Beispiel wollen wir die Ampelsteuerung noch etwas realistischer gestalten. Denn die einzelnen Phasen sind unterschiedlich lang, der Zustand Gelb ist deutlich kürzer als der Zustand Grün. Wenn wir also in fast jedem Zustand eine bestimmte Anzahl Takte warten wollen, erscheint es nicht sinnvoll, dafür jedesmal einen neuen Zustand anzuspringen. Sinnvoller ist die Integration des Wartens direkt in den Zustand, so wie im vorherigen Beispiel der Zustand &amp;quot;WARTE_NORDSUED&amp;quot;. Dabei fallen jedoch zwei Sachen auf.&lt;br /&gt;
&lt;br /&gt;
* In jedem Zustand muss die Wartezeit des &#039;&#039;nächsten&#039;&#039; Zustands zugewiesen werden. Das ist etwas verwirrend.&lt;br /&gt;
* Fast alle Anweisungen sind gleich in den Zuständen, nur die Zahlen und der Wert für den nächsten Zustand ändern sich.&lt;br /&gt;
&lt;br /&gt;
Darum soll hier die FSM von einer großen switch Anweisung auf eine Tabelle geändert werden. Das hat den Vorteil, dass die Zustandstabelle nahezu 1:1 in den Quelltext geschrieben werden kann und sie so sehr kompakt und übersichtlich ist. Die eigentliche FSM wird sehr klein und arbeitet sich durch die Tabelle durch. Zur weiteren Verbesserung der Lesbarkeit (siehe [[Strukturierte Programmierung auf Mikrocontrollern]]) nutzen wir einen Struct, welche den Zustand der State machine mit sinnvollen Variablennamen beschreibt. Bei dieser Methode muss man beachten, dass die Reihenfolge der Zustände in der enum Definition gleich sein muss mit der Reihenfolge der Zustände in der Tabelle, sonst funktioniert es nicht. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define GRUEN     2&lt;br /&gt;
#define GELB      4&lt;br /&gt;
#define ROTGELB   5&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
int Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
 &lt;br /&gt;
typedef enum { OSTWEST_GRUEN=0, OSTWEST_GELB, ALLE_ROT_1,&lt;br /&gt;
               NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_2,&lt;br /&gt;
               OSTWEST_ROTGELB }  state_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int Ampel1;&lt;br /&gt;
    int Ampel2;&lt;br /&gt;
    int I_Schleife;&lt;br /&gt;
    int Wartezeit;&lt;br /&gt;
    int Naechster;&lt;br /&gt;
} ampel_state_t;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
int zaehler=1;&lt;br /&gt;
 &lt;br /&gt;
// Tabelle fuer state machine&lt;br /&gt;
 &lt;br /&gt;
ampel_state_t state_table[8] = {&lt;br /&gt;
 &lt;br /&gt;
// AMPEL1 AMPEL2   Induktionsschleife ? &lt;br /&gt;
// |         |       |   Wartezeit in s&lt;br /&gt;
// |         |       |   |&lt;br /&gt;
// |         |       |   |   naechster Zustand     Name&lt;br /&gt;
//----------------------------------------------------------------------&lt;br /&gt;
{ROT     , GRUEN   , 1, 10,  OSTWEST_GELB},        // OSTWEST_GRUEN&lt;br /&gt;
{ROT     , GELB    , 0,  1,  ALLE_ROT_1},          // OSTWEST_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  NORDSUED_ROTGELB},    // ALLE_ROT_1&lt;br /&gt;
{ROTGELB , ROT     , 0,  1,  NORDSUED_GRUEN},      // NORDSUED_ROTGELB&lt;br /&gt;
{GRUEN   , ROT     , 0, 10,  NORDSUED_GELB},       // NORDSUED_GRUEN&lt;br /&gt;
{GELB    , ROT     , 0,  1,  ALLE_ROT_2},          // NORDSUED_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  OSTWEST_ROTGELB},     // ALLE_ROT_2&lt;br /&gt;
{ROT     , ROTGELB , 0,  1,  OSTWEST_GRUEN}};      // OSTWEST_ROTGELB&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
    Ampel1(state_table[state].Ampel1);&lt;br /&gt;
    Ampel2(state_table[state].Ampel2);&lt;br /&gt;
 &lt;br /&gt;
    if (zaehler&amp;gt;0) {&lt;br /&gt;
        zaehler--;    &lt;br /&gt;
    } else {&lt;br /&gt;
        if ( ((state_table[state].I_Schleife == 1) &amp;amp;&amp;amp; Induktionsschleife() ) ||&lt;br /&gt;
             (state_table[state].I_Schleife == 0) )&lt;br /&gt;
        {&lt;br /&gt;
            state =   state_table[state].Naechster;&lt;br /&gt;
            zaehler = state_table[state].Wartezeit;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierung einer objektorientierten Finite State Machine in C++==&lt;br /&gt;
&lt;br /&gt;
* Notation von Endlichen Automaten in UML&lt;br /&gt;
* Praktisches Beispiel, anhand dessen die Funktionsweise eines Toasters erklärt wird. Dazu wird die Notation in UML verwendet. &lt;br /&gt;
* Implementation des Beispiels in C++ auf einem AVR-Controller&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Möglichkeit bzw. das Beispiel sollte als Denkanstoss verstanden werden und nicht als Referenzimplementation. Es wurden bewusst bestimmte Feinheiten von endlichen Automaten verzichtet, um das Beispiel auf gut verständlichem Niveau zu halten. &lt;br /&gt;
&lt;br /&gt;
* Dokumentation im PDF Format [http://www.mikrocontroller.net/attachment/137066/ImplementierungEinerFiniteStateMachine_V1.1.pdf ImplementierungEinerFiniteStateMachine_V1.1.pdf]&lt;br /&gt;
* LaTeX Source der Dokumentation [http://www.mikrocontroller.net/attachment/137067/Dokumentation_Source_V1.1.zip Dokumentation_Source_V1.1.zip]&lt;br /&gt;
* Beispielcode für AVR-Studio 4 [http://www.mikrocontroller.net/attachment/135434/AVR_Beispiel_Source.zip AVR_Beispiel_Source.zip]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/248837#2556592 Forumsbeitrag]: Eine objektorientierte State Machine in C++&lt;br /&gt;
&lt;br /&gt;
== Grafische Modellierung einer Finite State Machine ==&lt;br /&gt;
Das Open Source Werkzeug Yakindu Statechart Tools (http://www.statecharts.org) ermöglicht es Zustandsautomaten grafisch zu modellieren, deren Verhalten zu simulieren und Code für verschiedene Sprachen (C/C++, Java) zu generieren.&lt;br /&gt;
Die grafischen Modellelemente entsprechen denen der UML2 und werden durch eine einfache und zweckmäßige Expression-Language ergänzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfaches Ampel Modell&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Modell einer einfachen Ampel wie oben beschrieben sieht in Yakindu SCT wie folgt aus: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1.jpg|center|framed|Einfaches Ampel Modell]]&lt;br /&gt;
&lt;br /&gt;
Wie erwartet hat die Ampel vier Zustände, die wiederum mit Übergangs-Pfeilen (Transitionen) verbunden sind. Jede Transition verfügt über einen Auslöser, in diesem Fall mit dem Namen &#039;&#039;tick&#039;&#039;    &lt;br /&gt;
Mit Hilfe der Yakindu DSL wird im linken Teil des Editors ein internes Event mit dem Name &amp;quot;tick&amp;quot; definiert, das entsprechend der Taktung des Zustandsautomaten &amp;quot;gefeuert&amp;quot; werden soll. Der Ausdruck &#039;&#039;every 1s / raise tick&#039;&#039; sorgt dafür, dass das Event &#039;&#039;tick&#039;&#039; jede Sekunde einmal gefeuert wird.&lt;br /&gt;
Da Yakindu SCT es erlaubt Zustandsautomaten zu simulieren, ist es jederzeit überprüfbar ob das modellierte Verhalten den Erwartungen entspricht. Über &#039;&#039;Run as... --&amp;gt; YAKINDU Statechart&#039;&#039; lässt sich in die &#039;&#039;Simulation View&#039;&#039; wechseln. Der jeweils aktive Zustand wird nun rot hinterlegt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1b.jpg|center|framed|Simulation View]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfache Kreuzung mit Zwei Ampel-Gruppen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im zweiten Beispiel soll eine einfache Ampelkreuzung modelliert werden. Es wird davon ausgegangen, dass die Ampeln in zwei Gruppen geschaltet werden. Ampel 1 und 3 bilden die nord_süd – Gruppe, während die übrigen Ampeln die ost-west – Gruppe bilden. Der Einfachheit halber werden Ampeln einer Gruppe immer gleich geschaltet. Wie oben darf eine Ampel-Gruppe nur dann den Zustand &#039;&#039;rot&#039;&#039; verlassen, wenn die jeweils andere Gruppe sich im Zustand &#039;&#039;rot&#039;&#039; befindet. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel2.jpg|800px|center|Ampelkreuzung]]&lt;br /&gt;
&lt;br /&gt;
Im Yakindu SCT Modell gibt es nun für jede Ampel-Gruppe eine eigene Region. Wird der Zustandsautomat betreten so wird nun parallel der Zustand &#039;&#039;rot&#039;&#039; in der &#039;&#039;nord_sued&#039;&#039; Region und der Zustand &#039;&#039;gruen&#039;&#039; in der &#039;&#039;ost_west&#039;&#039; Region aktiv. Wie bereits im ersten Beispiel wird der Zustandsautomat über das &#039;&#039;tick&#039;&#039; Ereignis angetrieben, das jede Sekunde einmal auftritt. &lt;br /&gt;
Um das gewünschte Ampel-Verhalten zu modellieren wird nun die Transition von &#039;&#039;rot&#039;&#039; zu &#039;&#039;rot-gelb&#039;&#039; mit einem &#039;&#039;Guard&#039;&#039;, also einer Bedingung geschützt. Zwar wird der Übergang weiterhin mit dem Ereignis &#039;&#039;tick&#039;&#039; angestoßen, allerdings wird der Übergang nur ausgeführt wenn die in eckigen Klammern formulierte Boolesche-Bedingung erfüllt ist. Die Funktion &#039;&#039;active()&#039;&#039; gehört zu den Bordmitteln von Yakindu SCT und prüft ob ein bestimmter Zustand aktiv ist. In diesem Beispiel kann in der Region &#039;&#039;nord_sued&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; nur verlassen werden, wenn in der Region &#039;&#039;ost-west&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; aktiv ist. Wie auch im vorhergegangenen Beispiel lässt sich das Verhalten simulieren, so das überprüft werden kann ob das Verhalten den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ampel mit Induktionsschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Verhalten der Ampelanlage aus Beispiel 2 soll um eine Induktionsschleife erweitert werden. Der Verkehr an der Ampelanlage fließt normalerweise in &#039;&#039;ost_west&#039;&#039; – Richtung, daher die Ampel in dieser Richtung immer den Zustand &#039;&#039;grün&#039;&#039; haben, es sei denn die Induktionsschleife in &#039;&#039;nord-süd&#039;&#039; - Richtung wird ausgelöst.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel3.jpg|800px|center|Ampelkreuzung mit Induktionsschleife]]&lt;br /&gt;
&lt;br /&gt;
Um dieses Verhalten in das SCT-Modell zu integrieren muss zunächst ein neues Ereignis definiert werden. Dieses Ereignis wird als Teil des &#039;&#039;Interface-Scopes&#039;&#039; definiert, da es außerhalb des Zustandsautomaten erzeugt werden soll. Ereignisse die Teil einer externen Schnittstelle sind werden mit einer Richtung (in / out) deklariert, die angibt ob das Ereignis den Zustandsautomat betritt, oder verlässt. &lt;br /&gt;
&lt;br /&gt;
Nach dem das neue Ereignis definiert ist,  muss nur noch der Auslöser für den Übergang von &#039;&#039;gruen&#039;&#039; zu &#039;&#039;gelb&#039;&#039; geändert werden. Statt wie bisher durch das &#039;&#039;tick&#039;&#039; Event, wird nun das &#039;&#039;induktionsSignal&#039;&#039; als Auslöser verwendet. In der Simulations-Ansicht kann das neue Ereignis manuell mit einem Klick ausgelöst werden, so dass das korrekte Verhalten wieder getestet werden kann.   &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_simView.jpg|center|framed|Induktionsschleife auslösen]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warteschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es soll die Grün-Phase verlängert werden, so dass erst nach dem 5. &#039;&#039;tick&#039;&#039; der Übergang in den &#039;&#039;gelb&#039;&#039; Zustand erfolgt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct beispiel4.jpg|800px|center|Ampelkreuzung mit Warteschleife]]&lt;br /&gt;
&lt;br /&gt;
Um eine Warteschleife zu realisieren wird dem &#039;&#039;Internal-Scope&#039;&#039; zuerst eine neue Variable hinzugefügt. Da während des Wartens der &#039;&#039;grün&#039;&#039; Zustand nicht verlassen wird, lässt sich das Herunterzählen der Wartezeit mittels eines zusammengesetzten Zustands darstellen. Wird der Zustand &#039;&#039;grün&#039;&#039; betreten, wird zunächst einen Eintritts-Aktion ausgeführt, die den Wert von &#039;&#039;wartezeit&#039;&#039; auf 5 setzt. Außerdem wird ebenfalls der Zustand &#039;&#039;Warten&#039;&#039; aktiv. Erfolgt nun ein &#039;&#039;tick&#039;&#039; wird ohne &#039;&#039;grün&#039;&#039; zu verlassen in &#039;&#039;WartezeitVerringern&#039;&#039; gewechselt und der Wert von &#039;&#039;wartezeit&#039;&#039; um 1 verringert. &lt;br /&gt;
Der Übergang zu &#039;&#039;gelb&#039;&#039; ist wieder durch einen Guard geschützt und kann nur erfolgen wenn die  Bedingung &#039;&#039;wartezeit == 0&#039;&#039; erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Code aus dem Modell generieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um nun Code aus dem Modell zu generieren muss zuerst eine GeneratorModel-Datei erzeugt werden, in der unter anderem die Ziel-Sprache angegeben wird.&lt;br /&gt;
Um den Zustandsautomaten abzubilden verwendet die konkrete Implementierung ein &#039;&#039;switch case&#039;&#039; Konstrukt, das dem oben Gezeigten ähnelt. Außerdem wurde ein &#039;&#039;code-only&#039;&#039; Ansatz verfolgt, so dass keine externen Bibliotheken oder Frameworks benötigt werden. Das komplette Eclipse Projekt kann [http://statecharts.org/Examples/ampel.zip hier] runtergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Realisation von FSMs in Hardware ==&lt;br /&gt;
=== Aufbau einer FSM in digitalen Chips ===&lt;br /&gt;
&lt;br /&gt;
Sollen sehr schnelle Steuerungen und Entscheider aufgebaut werden, wurden und werden digitale Bausteine mit Logikgattern verdrahtet, die steuerbare Zähler enthalten. Damit lassen sich effektive Taktgeschwindigkeiten im Bereich von mehreren MHz erreichen, die in Sicherheitsbereichen eingesetzt werden. Oft werden solche Schaltungen auch zur Überwachung von anderen Schaltungsteilen eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Früher wurden fast alle logischen Schaltungen auf diese Weise entworfen, z.B. auch die ersten Computer von IBM.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung von FSMs in programmierbarer Hardware ===&lt;br /&gt;
&lt;br /&gt;
Da heute digitale Hardware vielfach in Form programmierter PLD- und [[FPGA]]-Bausteine eingesetzt wird, verlagert sich der Entwurf der FSM mehr zu Softwareentwicklung hin. Dabei besteht je nach Vorliegen der funktionellen Beschreibung und eventueller Primärinformation die Möglichkeit, ein Abbild der digitalen Schaltung in VHDL zu formulieren und zu importieren, bzw. ein klassisches state diagram neu zu entwerfen oder die Zustandswechsel in Tabellenform zu importieren und das Erzeugerwerkzeug die FSM generieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Letztendlich kann in Hardware jede sequentielle Logikschaltung, welche [[FlipFlop]]s und Dekoder enthält als FSM betrachtet werden, egal ob es ein einfaches Schieberegister oder eine komplexe ALU einer CPU ist. Die einfachste, denkbare FSM ist ein Toggle-FlipFlop, welches mit jedem Takt seinen Ausgangszustand wechselt.&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsvergleich ==&lt;br /&gt;
In Software realisierte state machines erreichen unter C++ in Windows auch bei hoher Prozessauslastung selten niedrigere Reaktionszeiten als im Millisekundenbereich. Die damit in Echtzeit erfassbaren und prozessierbaren externen Ereignisse bewegen sich üblicherweise im Bereich von einigen 100Hz. Mit Microcontrollern und DSPs erreicht man mit Nicht-Multi-tasking-FSMs Abtastraten bis einige 100kHz. In VHDL realisierte state machines besitzen je nach FPGA-Familie, Art der Codierung und Zyklustiefe typische Taktfrequenzen von 10...100MHz.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.aqdi.com/state.htm Using State Machines In Your Designs] (C) 2003 Hank Wallace&lt;br /&gt;
* [http://qfsm.sourceforge.net/ Qfsm] - A graphical tool for designing finite state machines (GPL)&lt;br /&gt;
* [https://www.itemis.com/en/yakindu/statechart-tools/ YAKINDU Statechart Tools] Ein Werkzeug zum Modellieren und Simulieren von Statecharts sowie Code-Generatoren für Java, C und C++. &lt;br /&gt;
* [http://www.sinelabore.com www.sinelabore.com] Ein Werkzeug das aus UML State Machines C-Code speziell für eingebettete Systeme erzeugt.&lt;br /&gt;
* [http://smc.sourceforge.net SMC The State Machine Compiler]&lt;br /&gt;
* [http://block-net.de/Programmierung/cpp/fsm/fsm.html C/C++ event driven FSM] Open source Werkzeug zur Generierung von C++ FSM Code und UML Diagramm mittels Transitionstabelle. &lt;br /&gt;
* http://astade.tigris.org/ -&amp;gt; http://wiki.astade.de/dokuwiki/doku.php (https://www.mikrocontroller.net/search?query=astade)&lt;br /&gt;
+ [http://stefanfrings.de/multitasking_arduino/index.html] Zustandsautomaten mit und ohne Arduino&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=100655</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=100655"/>
		<updated>2019-06-09T09:58:12Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Titel eines Links aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board (mit z.B. einem AVR oder STM32 Prozessor) und einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Nucleo64 Boards&amp;lt;ref name=&amp;quot;NUCLEO64&amp;quot;&amp;gt;[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64&amp;lt;/ref&amp;gt; und Stm32 Discovery Boards&amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt; [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848]Stm32 Discovery&amp;lt;/ref&amp;gt; ab 15€&amp;lt;br&amp;gt;(incl. Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Uno clone ab 9€ || align=&amp;quot;center&amp;quot;| Microchip Demoboard&amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610] Microchip Demoboard&amp;lt;/ref&amp;gt; ab 18€&amp;lt;br&amp;gt;(Für 16 und 32bit auch mit integriertem Debugger)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | MSP430 Demoboard &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |Blue-Pill Board &amp;lt;ref name=&amp;quot;BLUEPILL&amp;quot;&amp;gt;[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board&amp;lt;/ref&amp;gt; ab 1,50€, S64DIL-405 &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405&amp;lt;/ref&amp;gt; mit STM32F405 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Nano clone ab 2€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PIC Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 1..15€&amp;lt;br&amp;gt;nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ST-Link clone 2,50€&amp;lt;br&amp;gt;ST-Link original 48€&amp;lt;br&amp;gt;Segger J-LINK EDU &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt; [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU&amp;lt;/ref&amp;gt; 50€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Atmel AVR Dragon 40€&amp;lt;br&amp;gt;Atmel ICE ohne Gehäuse ab 99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PICkit 3 clone 8€&amp;lt;br&amp;gt;Microchip PICkit 3 original 90€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* Anleitung: [[STM32 CooCox Installation]]&lt;br /&gt;
* Anleitung: [[STM32 Eclipse Installation]]&lt;br /&gt;
* Anleitung: [http://stefanfrings.de/stm32/index.html STM32 Anleitungen und ein kleines Buch für den Einstieg] &lt;br /&gt;
* Diskussion: [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=100654</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=100654"/>
		<updated>2019-06-09T09:57:06Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Rechtschreibfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board (mit z.B. einem AVR oder STM32 Prozessor) und einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Nucleo64 Boards&amp;lt;ref name=&amp;quot;NUCLEO64&amp;quot;&amp;gt;[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64&amp;lt;/ref&amp;gt; und Stm32 Discovery Boards&amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt; [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848]Stm32 Discovery&amp;lt;/ref&amp;gt; ab 15€&amp;lt;br&amp;gt;(incl. Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Uno clone ab 9€ || align=&amp;quot;center&amp;quot;| Microchip Demoboard&amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610] Microchip Demoboard&amp;lt;/ref&amp;gt; ab 18€&amp;lt;br&amp;gt;(Für 16 und 32bit auch mit integriertem Debugger)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | MSP430 Demoboard &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |Blue-Pill Board &amp;lt;ref name=&amp;quot;BLUEPILL&amp;quot;&amp;gt;[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board&amp;lt;/ref&amp;gt; ab 1,50€, S64DIL-405 &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405&amp;lt;/ref&amp;gt; mit STM32F405 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Nano clone ab 2€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PIC Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 1..15€&amp;lt;br&amp;gt;nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ST-Link clone 2,50€&amp;lt;br&amp;gt;ST-Link original 48€&amp;lt;br&amp;gt;Segger J-LINK EDU &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt; [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU&amp;lt;/ref&amp;gt; 50€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Atmel AVR Dragon 40€&amp;lt;br&amp;gt;Atmel ICE ohne Gehäuse ab 99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PICkit 3 clone 8€&amp;lt;br&amp;gt;Microchip PICkit 3 original 90€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* Anleitung: [[STM32 CooCox Installation]]&lt;br /&gt;
* Anleitung: [[STM32 Eclipse Installation]]&lt;br /&gt;
* Anleitung: [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1/F3 Serie und ein kleines Buch für den Einstieg] &lt;br /&gt;
* Diskussion: [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100397</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100397"/>
		<updated>2019-03-08T21:47:52Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks, Foren, Communities, Tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/en/microcontrollers/stm32h7-series.html STM32H7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** Bis 400MHz (856 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library (SPL) ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Die Standard Peripheral Library ist inzwischen veraltet, ST empfiehlt, sie nicht mehr zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Cube HAL ===&lt;br /&gt;
&lt;br /&gt;
Hat seit 2012 die SPL abgelöst.&lt;br /&gt;
&lt;br /&gt;
* https://www.st.com/en/embedded-software/stm32cube-mcu-packages.html&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [https://gnu-mcu-eclipse.github.io/ GNU ARM Plug-in](Linux, Windows)&lt;br /&gt;
** [https://atollic.com/truestudio/ TrueStudio for STM32] basiert auf Eclipse&lt;br /&gt;
** [http://www.openstm32.org/Downloading+the+System+Workbench+for+STM32+installer System Workbench for STM32] basiert auf Eclipse&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#Fertige_GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
** [https://github.com/blacksphere/blackmagic/wiki Black Magic Probe] simuliert einen seriellen Port der direkt von gdb verwendet werden kann. ST-Links können, so man sich Programmierzugang zu dem STM32F103 des Stlinks beschaffen kann, auch mit BMP umgeflasht werden. Das [https://github.com/blacksphere/blackmagic Blackmagic Programm] in der libftdi Version kann über JTAG und je nach interner Beschaltung auch mit SWD mit MPSSE fähigen FTDI Jtag Adaptern verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist eine vollständige Entwicklungsplattform für diverse ARM-Controller auf Basis eines RTOS mit Hardware-Abstraktion und webbasierter Online-sowie Offline-IDE. Ähnlich dem Arduino-Konzept können mit mbed einfachere Aufgaben schnell umgesetzt werden. mbed basiert auf C++ und unterstützt verschiedene Compiler. Projekte können auch exportiert und für andere IDEs heruntergeladen werden. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com Atollic TrueStudio] wurde seit der Übernahme durch ST auf STM32 Mikrocontroller reduziert und ist jetzt kostenlos verfügbar. Basiert auf Eclipse, OpenOCD und [[ARM GCC]]. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4, die aber mittlerweile nicht mehr weiterentwickelt wird. Basiert auf dem [[ARM GCC]] und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf [[ARM GCC]] aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler ([[ARM GCC]]), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks. Artikel: [[STM32 - Einstieg mit Em::Blocks]]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
* [[USB-Tutorial mit STM32]] enthält ein vollständiges Beispielprojekt&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [https://www.hitex.com/fileadmin/documents/tools/dev_tools/dt_protected/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (falls der Link nicht mehr funktioniert, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/ libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html STM32F1/F3 Anleitung]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger&lt;br /&gt;
* [[USB-Tutorial mit STM32]]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=100392</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=100392"/>
		<updated>2019-03-08T09:38:19Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board (mit z.B. einem AVR oder STM32 Prozessor) und einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Nucleo64 Boards&amp;lt;ref name=&amp;quot;NUCLEO64&amp;quot;&amp;gt;[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64&amp;lt;/ref&amp;gt; und Stm32 Discovery Boards&amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt; [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848]Stm32 Discovery&amp;lt;/ref&amp;gt; ab 15€&amp;lt;br&amp;gt;(incl. Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Uno clone ab 9€ || align=&amp;quot;center&amp;quot;| Microchip Demoboard&amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610] Microchip Demoboard&amp;lt;/ref&amp;gt; ab 18€&amp;lt;br&amp;gt;(Für 16 und 32bit auch mit integriertem Debugger)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | MSP430 Demoboard &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |Blue-Pill Board &amp;lt;ref name=&amp;quot;BLUEPILL&amp;quot;&amp;gt;[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board&amp;lt;/ref&amp;gt; ab 1,50€, S64DIL-405 &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405&amp;lt;/ref&amp;gt; mit STM32F405 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Nano clone ab 2€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PIC Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 1..15€&amp;lt;br&amp;gt;nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ST-Link clone 2,50€&amp;lt;br&amp;gt;ST-Link original 48€&amp;lt;br&amp;gt;Segger J-LINK EDU &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt; [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU&amp;lt;/ref&amp;gt; 50€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Atmel AVR Dragon 40€&amp;lt;br&amp;gt;Atmel ICE ohne Gehäuse ab 99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PICkit 3 clone 8€&amp;lt;br&amp;gt;Microchip PICkit 3 original 90€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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 Board von ST enthalten bereits einen ST-Link Adapter. Bei den Nucleo Boards ist er sogar abtrennbar und einzeln nutzbar.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* Anleitung: [[STM32 CooCox Installation]]&lt;br /&gt;
* Anleitung: [[STM32 Eclipse Installation]]&lt;br /&gt;
* Anleitung: [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1/F3 Serie und ein kleines Buch für den Einstieg] &lt;br /&gt;
* Diskussion: [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multitasking&amp;diff=100353</id>
		<title>Multitasking</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multitasking&amp;diff=100353"/>
		<updated>2019-02-25T14:27:59Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Multitasking bedeutet ein quasi paralleles Ausführen von mehreren Prozessen auf einem Prozessor.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Da eine echte parallele Ausführung von mehreren Prozessen (Programmen, Funktionen) auf einer einzelnen CPU (genauer: einem CPU-Kern) nicht möglich ist, wird ein &amp;quot;Trick&amp;quot; angewendet. Er besteht darin, einzelne Prozesse jeweils nur für kurze Zeit (ungefähr 1...50 ms) zu bearbeiten und danach auf einen anderen Prozess umzuschalten. Man spricht auch von einer verschachtelten Bearbeitung (engl. interleaving).&lt;br /&gt;
&lt;br /&gt;
Das Herz jedes Multitasking-Systems ist der Scheduler. Dies ist ein Programm, das nach bestimmten Algorithmen überprüft, welcher Prozess als nächstes die CPU (also Rechenzeit) zugeteilt bekommt. Es gibt verschiedene Schedulingstrategien:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;First come first served&amp;quot;: Prozesse bekommen Rechenzeit zugeteilt in der Reihenfolge, in der sie rechenbereit werden.&lt;br /&gt;
* &amp;quot;Shortest job first&amp;quot;: Der Prozess mit der kürzesten Rechenzeit wird als erstes bearbeitet. Dazu muss die Rechenzeit natürlich im Voraus bekannt sein.&lt;br /&gt;
* &amp;quot;Shortest remaining time next&amp;quot;: Der Prozess mit der kürzesten &#039;&#039;verbleibenden&#039;&#039; Rechenzeit wird jeweils als nächstes bearbeitet. Auch hier muss diese Zeit bekannt sein.&lt;br /&gt;
* Round robin: Alle Prozesse bekommen gleich viel Zeit zugeteilt. Der Scheduler lässt jeden Prozess für dieselbe Dauer rechnen und übergibt die CPU dann an den nächsten Prozess.&lt;br /&gt;
* Priority Scheduling: Die Prozesse sind nicht gleichwertig (wie beim Round-Robin-Verfahren), sondern haben Prioritäten. Der Scheduler sorgt dafür, dass höher priorisierte Prozesse bevorzugt behandelt werden.&lt;br /&gt;
&lt;br /&gt;
Soweit die &amp;quot;reine Lehre&amp;quot;. Scheduler in freier Wildbahn implementieren oftmals komplizierte Hybriden der genannten Techniken. Jene der &amp;quot;echten&amp;quot; Betriebsysteme (Windows, Linux, MacOS, *BSD) sind im Prinzip prioritäten-basierte Round-Robin-Scheduler. Generell hat ein Betriebssystem zwei Möglichkeiten, Multitasking zu realisieren: kooperativ oder präemptiv.&lt;br /&gt;
&lt;br /&gt;
== Kooperatives Multitasking ==&lt;br /&gt;
&lt;br /&gt;
Beim kooperativen Multitasking gibt der Scheduler die Kontrolle komplett an den Prozess ab. Als Konsequenz davon ist das Betriebssystem darauf angewiesen, dass der Prozess seinerseits die Kontrolle &amp;quot;freiwillig&amp;quot; wieder zurückgibt. Geschieht das nicht, wird der Scheduler nicht wieder aufgerufen und damit auch kein anderer Prozess mehr ausgeführt - das System &amp;quot;hängt&amp;quot;. Das Betriebssystem ist also auf die [http://de.wikipedia.org/wiki/Kooperation Kooperation] der Prozesse angewiesen. Bekannte Beispiele für Betriebssysteme mit kooperativem Multitasking sind Windows 3.x und MacOS vor Version 10.&lt;br /&gt;
&lt;br /&gt;
Dennoch ist kooperatives Multitasking keineswegs überholt oder schlecht. Gerade im Bereich der Mikrocontroller und Echtzeitanwendungen gibt es viele gute Argumente dafür: Kooperatives Multitasking ist deterministischer, also besser zeitlich und logisch vorhersagbar. Es ist besser simulierbar, d. h. für ein gegebenes System ist leichter nachweisbar, dass es funktioniert. Da es sich um geschlossene Systeme handelt, tritt das Problem, dass &amp;quot;irgendein&amp;quot; Prozess das System anhält, nicht auf. Es laufen ja im Gegensatz zum PC nicht &amp;quot;irgendwelche&amp;quot; Prozesse, sondern nur die, deren Korrektheit (im Idealfall) verifiziert und validiert wurde.&lt;br /&gt;
&lt;br /&gt;
=== Ein einfaches Beispiel für den AVR ===&lt;br /&gt;
&lt;br /&gt;
Hier soll ein einfaches Beispiel den Weg in die Programmierung von parallel bearbeiteten Aufgaben zeigen.&lt;br /&gt;
&lt;br /&gt;
Wichtigster Grundsatz ist die Herangehensweise! Viele Programmieranfänger haben damit Schwierigkeiten, was unter anderem an den schlecht vermittelten Grundlagen liegt. Oft sieht man Funktionen zum Warten in Form von&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
while(1) {&lt;br /&gt;
    PORTD ^= (1&amp;lt;&amp;lt;PD0);&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
um beispielsweise eine [[LED]] blinken zu lassen. Will man dann noch andere Dinge erledigen, wundert sich der Programmierer, warum der Mikrocontroller so langsam reagiert, trotz 16 MHz Taktfrequenz.&lt;br /&gt;
&lt;br /&gt;
==== Einfacher Ansatz ====&lt;br /&gt;
&lt;br /&gt;
Stellen wir uns vor, wir wollen drei Dinge gleichzeitig tun.&lt;br /&gt;
&lt;br /&gt;
* Eine Taste abfragen&lt;br /&gt;
* Eine LED blinken lassen, in Abhängigkeit der gedrückten Taste&lt;br /&gt;
* Daten vom UART empfangen und zum PC zurücksenden&lt;br /&gt;
&lt;br /&gt;
Ein einfacher Ansatz für die drei Dinge sieht etwa so aus. Die Beispiele wurden mit [[WinAVR]] Version 20081006 in der Optimierungsstufe -Os kompiliert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
Multitasking Demo, erster Versuch&lt;br /&gt;
&lt;br /&gt;
ATmega32 @ 3,6864 MHz&lt;br /&gt;
&lt;br /&gt;
LED + 1KOhm Vorwiderstand an PB0&lt;br /&gt;
Taster nach GND an PA0&lt;br /&gt;
UART an RXD und TXD&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
// Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!&lt;br /&gt;
#define BAUD 9600L          &lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;avr/io.h&amp;quot;&lt;br /&gt;
#include &amp;quot;util/delay.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
// Berechnungen&lt;br /&gt;
// clever runden&lt;br /&gt;
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  &lt;br /&gt;
// Reale Baudrate&lt;br /&gt;
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     &lt;br /&gt;
// Fehler in Promille &lt;br /&gt;
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) &lt;br /&gt;
 &lt;br /&gt;
#if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))&lt;br /&gt;
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! &lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
uint8_t taste_lesen(void) {&lt;br /&gt;
    if (PINA &amp;amp; (1&amp;lt;&amp;lt;PA0))&lt;br /&gt;
        return 1;&lt;br /&gt;
    else &lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void led_blinken(uint8_t taste) {&lt;br /&gt;
&lt;br /&gt;
    PORTB ^= (1&amp;lt;&amp;lt;PB0);&lt;br /&gt;
    if (taste) &lt;br /&gt;
        _delay_ms(1000);    // 1 s warten&lt;br /&gt;
    else&lt;br /&gt;
        _delay_ms(100);     // 0,1 s warten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_lesen(void) {&lt;br /&gt;
    uint8_t tmp;&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)));            // Warte auf empfangenes Zeichen vom UART&lt;br /&gt;
    tmp = UDR;&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)));           // Warte auf freien Sendepuffer vom UART&lt;br /&gt;
    UDR = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    int8_t taste;&lt;br /&gt;
&lt;br /&gt;
    // IOs initialisieren&lt;br /&gt;
    &lt;br /&gt;
    PORTA = 1;              // Pull Up für PA0&lt;br /&gt;
    DDRB  = 1;              // PB0 ist Ausgang&lt;br /&gt;
&lt;br /&gt;
    // UART initialisieren&lt;br /&gt;
    &lt;br /&gt;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
    UCSRB = (1&amp;lt;&amp;lt;RXEN) | (1&amp;lt;&amp;lt;TXEN);&lt;br /&gt;
    &lt;br /&gt;
    // Endlose Hauptschleife&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        taste = taste_lesen();&lt;br /&gt;
        led_blinken(taste);&lt;br /&gt;
        uart_lesen();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man das Programm nun laufen lässt, wird man feststellen dass&lt;br /&gt;
&lt;br /&gt;
* das Hyperterminal sehr langsam reagiert und bisweilen Zeichen verschluckt&lt;br /&gt;
* die LED auf Tastendrücke nur dann reagiert, wenn man per Hyperterminal Zeichen eingibt&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz ist also untauglich. Egal wie schnell unser AVR auch ist, er reagiert sehr langsam.&lt;br /&gt;
&lt;br /&gt;
==== Verbesserter Ansatz ====&lt;br /&gt;
&lt;br /&gt;
Will man mehrere Dinge gleichzeitig bearbeiten, muss man die Aufgaben in kleinste Häppchen zerteilen. Diese kleinsten Häppchen werden dann verschachtelt abgearbeitet, also ein Häppchen von Aufgabe A, ein Häppchen von Aufgabe B, ein Häppchen von Aufgabe C.&lt;br /&gt;
&lt;br /&gt;
Das Auslesen der Taste geht immer sehr schnell, kein Ansatz zum optimieren. Das Blinken der LED dauer entweder 1s oder 100ms, eine Ewigkeit für einen Mikrocontroller! Hier muss man was ändern. Am schlimmsten ist die UART-Nutzung. Der AVR wartet solange, bis ein Zeichen empfangen wurde! Das kann ewig dauern! Unser Programm steht! Das darf nicht sein!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
Multitasking Demo, zweiter Versuch&lt;br /&gt;
&lt;br /&gt;
ATmega32 @ 3,6468 MHz&lt;br /&gt;
&lt;br /&gt;
LED + 1KOhm Vorwiderstand an PB0&lt;br /&gt;
Taster nach GND an PA0&lt;br /&gt;
UART an RXD und TXD&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
// Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!&lt;br /&gt;
#define BAUD 9600L          &lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;avr/io.h&amp;quot;&lt;br /&gt;
#include &amp;quot;util/delay.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
// Berechnungen&lt;br /&gt;
// clever runden&lt;br /&gt;
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  &lt;br /&gt;
// Reale Baudrate&lt;br /&gt;
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     &lt;br /&gt;
// Fehler in Promille &lt;br /&gt;
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) &lt;br /&gt;
 &lt;br /&gt;
#if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))&lt;br /&gt;
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! &lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
uint8_t taste_lesen(void) {&lt;br /&gt;
    if (PINA &amp;amp; (1&amp;lt;&amp;lt;PA0))&lt;br /&gt;
        return 1;&lt;br /&gt;
    else &lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void led_blinken(uint8_t taste) {&lt;br /&gt;
    static uint16_t zaehler=0;&lt;br /&gt;
&lt;br /&gt;
    if (taste) {&lt;br /&gt;
        if (zaehler&amp;gt;=999) {&lt;br /&gt;
            PORTB ^= (1&amp;lt;&amp;lt;PB0);&lt;br /&gt;
            zaehler=0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        if (zaehler&amp;gt;=99) {&lt;br /&gt;
            PORTB ^= (1&amp;lt;&amp;lt;PB0);&lt;br /&gt;
            zaehler=0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    zaehler++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_lesen(void) {&lt;br /&gt;
    uint8_t tmp;&lt;br /&gt;
    if((UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC))) {                // empfangenes Zeichen abholbereit im UART ?&lt;br /&gt;
        tmp = UDR;&lt;br /&gt;
        while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)));       // Warte auf freien Sendepuffer vom UART&lt;br /&gt;
        UDR = tmp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    int8_t taste;&lt;br /&gt;
&lt;br /&gt;
    // IOs initialisieren&lt;br /&gt;
    &lt;br /&gt;
    PORTA = 1;              // Pull Up für PA0&lt;br /&gt;
    DDRB  = 1;              // PB0 ist Ausgang&lt;br /&gt;
&lt;br /&gt;
    // UART initialisieren&lt;br /&gt;
    &lt;br /&gt;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
    UCSRB = (1&amp;lt;&amp;lt;RXEN) | (1&amp;lt;&amp;lt;TXEN);&lt;br /&gt;
    &lt;br /&gt;
    // Endlose Hauptschleife&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        taste = taste_lesen();&lt;br /&gt;
        led_blinken(taste);&lt;br /&gt;
        uart_lesen();&lt;br /&gt;
        _delay_ms(1);       // 1 ms warten&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Programm reagiert &#039;&#039;&#039;ganz&#039;&#039;&#039; anders! Schnell wie der Wind und vollkommen unabhängig von anderen, parallel laufenden Prozessen. Warum ist das so?&lt;br /&gt;
&lt;br /&gt;
Die einzelnen kleinen Häppchen sind verdaulicher als die großen. Die maximale Durchlaufzeit der einzelnen Funktionen ist drastisch reduziert. Anstatt in der LED-Ausgabe einmal 1000 ms zu warten wird nun 1000 mal 1 ms gewartet. Zwischendurch werden aber 1000 mal die anderen Prozesse bearbeitet. Echte Demokratie sozusagen. Noch viel besser ist die Handhabung des UARTs. Anstatt eine Ewigkeit auf ein ankommendes Zeichen zu warten, wird nur dann etwas bearbeitet, wenn auch wirklich etwas zur Bearbeitung vorliegt. Klingt eigentlich logisch. Also nur dann, wenn schon ein Zeichen empfangen wurde wird es auch bearbeitet, ansonsten geht es zurück zur Hauptschleife. Das ist praktisch der ganze &amp;quot;Trick&amp;quot; eines kooperativen Multitaskings. Auch wenn die Verwendung von _delay_ms(1) noch ein kleiner Schönheitsfehler ist, den die Profis lieber mit einem [[Timer]] erledigen, so wird das Prinzip klar.&lt;br /&gt;
&lt;br /&gt;
*Prozesse eines kooperativen Multitaskingsystems warten nicht (lies: niemals) auf das Eintreten von Ereignissen, sondern bearbeiten nur bereits eingetretene Ereignisse.&lt;br /&gt;
*Größere Aufgaben werden in kleine Teilaufgaben zerlegt, welche nur durch mehrfaches Aufrufen der Funktion abgearbeitet werden. Das erreicht man meist am besten mit einer [[statemachine |State machine]].&lt;br /&gt;
*Prozesse eines kooperativen Multitaskings haben eine garantierte, maximale Durchlaufzeit, welche möglichst klein ist.&lt;br /&gt;
&lt;br /&gt;
Damit ähneln die Prozesse einem [[Interrupt]], auch wenn sie als ganz normale Funktionen außerhalb eines Interrupts ausgeführt werden. An diesem Beispiel erkennt man die Vor- und Nachteile des kooperativen Multitaskings:&lt;br /&gt;
&lt;br /&gt;
Vorteile&lt;br /&gt;
* einfacher Scheduler mit geringster CPU Belastung&lt;br /&gt;
* Deterministische Arbeitsweise, damit einfach prüfbar und strenges Timing möglich&lt;br /&gt;
&lt;br /&gt;
Nachteile&lt;br /&gt;
* eine andere Programmierweise zur Zerlegung größerer Aufgaben in kleine Teilaufgaben muss manuell vorgenommen werden&lt;br /&gt;
&lt;br /&gt;
==== Verbesserter Ansatz mit Timer ====&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss die noch bessere Version mit Timer. Diese hat mehrere Vorteile.&lt;br /&gt;
&lt;br /&gt;
* Das Zeitraster der Hauptschleife ist exakt, unabhängig von der Laufzeit der Aufgaben, weil der Timer unabhängig eine feste Interruptfrequenz generiert. Im vorherigen Beispiel war das Zeitraster die Summe aus Laufzeit aller Funktionen/Tasks und dem _delay_ms(1).&lt;br /&gt;
* CPU-Rechenleistung wird zu 100% in der Abarbeitung der Task verwendet und nicht für nutzlose Warteschleifen verschwendet.&lt;br /&gt;
* Es kann leicht im realen System geprüft werden, ob die Laufzeit der Tasks klein genug ist, um den Anforderungen des Timers zu genügen.&lt;br /&gt;
&lt;br /&gt;
Diese Überprüfung kann an zwei Stellen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
* Am Ende der Hauptschleife nach Abarbeitung aller Ausgaben. Wenn hier die Variable flag_1ms schon wieder aktiv ist, dauerte die Abarbeitung länger als 1ms. Wenn man ein sehr strenges Timing sicherstellen möchte, ist das ein Fehler, der erkannt und signalisiert werden kann.&lt;br /&gt;
* In der ISR. Wenn hier die Variable immer noch aktiv ist, wurde sie von der Hauptschleife noch nicht erkannt und zurück gesetzt. Das ist definitiv ein Fehler, denn jetzt würde ohne Fehlererkennung ein Timerdurchlauf von der Hauptschleife verschluckt werden. Diese Prüfung ist etwas nachgiebiger, weil zwischenzeitlich ein Durchlauf der Hauptschleife mehr als 1ms, jedoch nicht länger als 2ms dauern darf. Siehe auch den Abschnitt [[Interrupt#Zeitverhalten_eines_Timerinterrupts]]. Sinnvollerweise nutzt man nur eine der beiden Prüfungen, nicht beide zusammen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
Multitasking Demo, dritter Versuch&lt;br /&gt;
&lt;br /&gt;
ATmega32 @ 3,6468 MHz&lt;br /&gt;
&lt;br /&gt;
LED + 1KOhm Vorwiderstand an PB0 und PB1&lt;br /&gt;
Taster nach GND an PA0&lt;br /&gt;
UART an RXD und TXD&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
// Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!&lt;br /&gt;
#define BAUD 9600L          &lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;avr/io.h&amp;quot;&lt;br /&gt;
#include &amp;quot;util/delay.h&amp;quot;&lt;br /&gt;
#include &amp;quot;avr/interrupt.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
// Berechnungen&lt;br /&gt;
// clever runden&lt;br /&gt;
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  &lt;br /&gt;
// Reale Baudrate&lt;br /&gt;
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     &lt;br /&gt;
// Fehler in Promille &lt;br /&gt;
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) &lt;br /&gt;
 &lt;br /&gt;
#if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))&lt;br /&gt;
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! &lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
uint8_t taste_lesen(void) {&lt;br /&gt;
    if (PINA &amp;amp; (1&amp;lt;&amp;lt;PA0))&lt;br /&gt;
        return 1;&lt;br /&gt;
    else &lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void led_blinken(uint8_t taste) {&lt;br /&gt;
    static uint16_t zaehler=0;&lt;br /&gt;
&lt;br /&gt;
    if (taste) {&lt;br /&gt;
        if (zaehler&amp;gt;=999) {&lt;br /&gt;
            PORTB ^= (1&amp;lt;&amp;lt;PB0);&lt;br /&gt;
            zaehler=0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        if (zaehler&amp;gt;=99) {&lt;br /&gt;
            PORTB ^= (1&amp;lt;&amp;lt;PB0);&lt;br /&gt;
            zaehler=0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    zaehler++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_lesen(void) {&lt;br /&gt;
    uint8_t tmp;&lt;br /&gt;
    if((UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC))) {                // empfangenes Zeichen abholbereit im UART ?&lt;br /&gt;
        tmp = UDR;&lt;br /&gt;
        while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)));       // Warte auf freien Sendepuffer vom UART&lt;br /&gt;
        UDR = tmp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t flag_1ms;&lt;br /&gt;
 &lt;br /&gt;
int main(void) {&lt;br /&gt;
    int8_t taste;&lt;br /&gt;
&lt;br /&gt;
    // IOs initialisieren&lt;br /&gt;
    &lt;br /&gt;
    PORTA = 1;              // Pull Up für PA0&lt;br /&gt;
    DDRB  = 3;              // PB0/1 sind Ausgang&lt;br /&gt;
&lt;br /&gt;
    // UART initialisieren&lt;br /&gt;
    &lt;br /&gt;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
    UCSRB = (1&amp;lt;&amp;lt;RXEN) | (1&amp;lt;&amp;lt;TXEN);&lt;br /&gt;
&lt;br /&gt;
    // Timer 0 initialisieren, CTC, Presacler 64&lt;br /&gt;
&lt;br /&gt;
    TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;CS01) | (1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
    OCR0  = 56;      // 1ms&lt;br /&gt;
    TIMSK |= (1&amp;lt;&amp;lt;OCIE0);&lt;br /&gt;
&lt;br /&gt;
    // Interrupts global freigeben&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    // Endlose Hauptschleife&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        if (flag_1ms) {&lt;br /&gt;
            flag_1ms=0;&lt;br /&gt;
            taste = taste_lesen();&lt;br /&gt;
            led_blinken(taste);&lt;br /&gt;
            uart_lesen();&lt;br /&gt;
            if (flag_1ms) {&lt;br /&gt;
                // Laufzeit der Tasks &amp;gt;1ms, Fehlersignalisierung&lt;br /&gt;
                // PB1 auf HIGH, Programm stoppen&lt;br /&gt;
                PORTB |= (1&amp;lt;&amp;lt;PB1);&lt;br /&gt;
                while(1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Interruptserviceroutine für Timer 0&lt;br /&gt;
// hier 1ms&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_COMP_vect) {&lt;br /&gt;
    if (flag_1ms) {&lt;br /&gt;
        // Laufzeit der Tasks &amp;gt;2ms, Fehlersignalisierung&lt;br /&gt;
        // PB1 auf HIGH, Programm stoppen&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;PB1);&lt;br /&gt;
        while(1);&lt;br /&gt;
    }&lt;br /&gt;
    flag_1ms = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Message passing Framework ====&lt;br /&gt;
&lt;br /&gt;
Im vorangegangenen Abschnitt wurde erklärt, wie man die einzelnen Tasks in kleine &amp;quot;Häppchen&amp;quot; zerlegen kann und diese alle innerhalb der Main Loop aufruft.&lt;br /&gt;
Dieses kooperative System hat aber noch einige Nachteile:&lt;br /&gt;
&lt;br /&gt;
* Alle Häppchen werden gleich oft aufgerufen und nicht nur bei Bedarf&lt;br /&gt;
* Für die Timeouts gibt es noch keine befriedigende Lösung&lt;br /&gt;
&lt;br /&gt;
Wenn man diese beiden Nachteile auch noch beseitigen möchte, wird das ganze noch ein klein wenig komplizierter. Da man das Grundprinzip aber für viele Mikrocontroller-Projekte immer wieder verwenden kann, lohnt es sich und man kann die Entwicklung für diese Art des Multitasking in einem Framework zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
Ein Framework, das sind einige Dateien, die den Rahmen (Frame=Rahmen) für ein Programm bilden und den Teil enthalten, den man immer wieder braucht.&lt;br /&gt;
&lt;br /&gt;
===== Message =====&lt;br /&gt;
&lt;br /&gt;
Die Basis des Frameworks bildet die &amp;quot;Message&amp;quot;. Immer wenn wir für einen unserer &amp;quot;Tasks&amp;quot; etwas zu tun haben, schicken wir eine &amp;quot;Message&amp;quot;. Die &amp;quot;Messages&amp;quot; werden in eine Warteschlange einsortiert und der Reihe nach abgearbeitet. Dadurch kommt ein Task der viel zu tun hat (viele Messages bekommt) öfter dran, als ein &amp;quot;Task&amp;quot; der nicht so viel zu tun hat. Außerdem kann eine Message noch Daten enthalten (z. B. ein empfangenes Zeichen). So können die einzelnen Tasks sogar Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
===== Message Receiver =====&lt;br /&gt;
&lt;br /&gt;
Unsere &amp;quot;Tasks&amp;quot; werden immer dann aufgerufen, wenn Arbeit für sie da ist. Das wissen wir, weil sie eine Message empfangen sollen. Deshalb heißen die &amp;quot;Tasks&amp;quot; ab jetzt &amp;quot;Message Receiver&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Timeout =====&lt;br /&gt;
&lt;br /&gt;
In diesem System wird jeder Message Receiver aufgerufen, wenn jemand Arbeit für ihn hat und er deshalb eine Message bekommt. Was aber, wenn keine Message kommt, oder ein Message Receiver selbst aktiv werden soll?&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund braucht es die Timeouts. Mit Hilfe &amp;lt;u&amp;gt;eines&amp;lt;/u&amp;gt; Hardware Timers wird eine &amp;quot;Systemzeit&amp;quot; programmiert. Jeder Message Receiver kann die Zeit angeben, wann er wieder aufgerufen werden muss. Das Framework verwaltet alle Timer und sendet den Message Receivern eine &amp;quot;Timeout&amp;quot; message, wenn ihre Zeit gekommen ist.&lt;br /&gt;
&lt;br /&gt;
===== Beispiel =====&lt;br /&gt;
Hier der Sourcecode eines solchen Framework [[Datei:ACF.zip]]&lt;br /&gt;
Das Framework implementiert die Message Warteschlange und die Timer Warteschlange. Die Prozessor spezifischen Dinge sind in der Datei &amp;quot;ACF_Hal.c&amp;quot; zusammengefasst und für Linux Desktop und atMega128 implementiert.&lt;br /&gt;
In dieser Datei kann man das ganze auch auf andere Prozessoren anpassen.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;quot;main&amp;quot; sieht dann z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;ACF.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
    ACF_init();&lt;br /&gt;
    ACF_loop();&lt;br /&gt;
    return 0; // we will never arrive here&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tracing =====&lt;br /&gt;
Es gibt noch einen weiteren Grund, sich ein &amp;quot;Framework&amp;quot; zu erarbeiten, oder ein fertiges Framework zu verwenden. Da der Ablauf der Software und der Aufruf aller Teile vom Framework bestimmt wird, kann das Framework auch einen sehr detaillierten Trace über das Verhalten des Codes anfertigen. Das Framework aus vorstehendem Beispiel enthält bereits entsprechenden Code.&lt;br /&gt;
&lt;br /&gt;
Solche Traces von laufendem Code können gerade dann sehr hilfreich sein, wenn viele Dinge gleichzeitig ablaufen (und das war schließlich der Sinn des ganzen).&lt;br /&gt;
&lt;br /&gt;
Nachstehendes Bild zeigt den Trace eines Reglers, der mit dem Framework realisiert wurde.&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/74409/ablauf.png Sequenzdiagramm]&lt;br /&gt;
&lt;br /&gt;
== Präemptives Multitasking ==&lt;br /&gt;
&lt;br /&gt;
Beim präemptiven Multitasking gibt das OS die Kontrolle zu keinem Zeitpunkt auf. Ein Prozess, der gerade die CPU nutzt, kann jederzeit wieder vom Betriebssystem unterbrochen werden. Daher muss bei der Entwicklung für ein präemptives System immer damit gerechnet werden, dass ein Prozess &#039;&#039;&#039;jederzeit&#039;&#039;&#039; unterbrochen werden kann. Das kann z.&amp;amp;nbsp;B. zu Problemen beim Zugriff auf limitierte Betriebsmittel führen. Beispiel:&lt;br /&gt;
&lt;br /&gt;
* Prozess A sucht freien Speicher und findet einen freien Block&lt;br /&gt;
* Prozess B wird vom Scheduler gestartet und sucht ebenfalls einen Speicherblock. Der gefundene Block wird von Prozess B reserviert und benutzt&lt;br /&gt;
* Der Scheduler teilt wieder Prozess A die CPU zu. Prozess A wird fortgeführt, d.h. er reserviert jetzt den im letzten Systemcall gefundenen Speicherblock&lt;br /&gt;
Jetzt haben also beide Prozesse den gleichen Speicherblock reserviert. Entweder arbeiten jetzt beide Prozesse mit dem gleichen Speicher, und überschreiben daher gegenseitig die Daten, oder das Betriebsystem hat etwas gemerkt und zieht die Notbremse. In jedem Fall passieren schreckliche Dinge. Sowas nennt man eine Race-Condition.&lt;br /&gt;
&lt;br /&gt;
Die Lösung nennt sich Semaphore: Dieser Mechanismus wird vom Betriebsystem bereitgestellt und erlaubt es einem Prozess eine bestimmte Ressource zu sperren. Wenn also Prozess A aus obigem Beispiel Speicher haben möchte, setzt er vor Beginn der sogenannten &amp;quot;Kritischen Sektion&amp;quot; einen Semaphor für &amp;quot;Speicher reservieren&amp;quot;. Dieser Semaphor wird erst wieder aufgehoben, sobald Prozess A den Speicher für sich reserviert hat. Wenn der Prozess B zwischendurch gestartet wird und ebenfalls versucht den Semaphor zu setzen, wird er solange warten müssen, bis Prozess A den Semaphor wieder freigibt. Speziell für derartige Locking Mechanismen bieten die meisten Prozessoren sogenannte TAS-Befehle (Test And Set), die in einem Prozessorbefehl eine Variable testen und je nach Ergebnis setzen können. Das ist nötig um das Setzen von Semaphoren unteilbar (atomar) zu machen. Könnte der Scheduler das Setzen eines Semaphors unterbrechen, wäre ja der ganze Aufwand umsonst.&lt;br /&gt;
&lt;br /&gt;
Präemptive Multitasking Systeme sind sehr flexibel und kommen mit einer Vielzahl an Tasks klar. Amok laufende Prozesse können das System bei korrekter Implementierung nicht blockieren. Damit aber das System crash-sicher ist, muss es Systemresourcen geben, die nur der Scheduler verteilen kann (z.&amp;amp;nbsp;B. kein anderer Prozess darf in den Speicherbereich des Schedulers schreiben; kein anderer Prozess darf den Timerinterrupt des Schedulers ändern). Diese Möglichkeiten sind in Mikrocontrollern normalerweise gar nicht vorhanden, wodurch dieser Vorteil des Präemptiven MT weniger ins Gewicht fällt. Beispiele für Systeme mit präemptivem Multitasking sind Linux, *BSD  und Windows XP.&lt;br /&gt;
&lt;br /&gt;
Vorteile&lt;br /&gt;
* sehr flexibel in der Verwaltung von dynamisch ausgeführten Prozessen&lt;br /&gt;
* einzelne Prozesse können einfach linear programmiert werden, ohne die Aufgabe in kleine Teile zerlegen zu müssen&lt;br /&gt;
&lt;br /&gt;
Nachteile&lt;br /&gt;
* Der Scheduler ist aufwändiger und benötigt mehr CPU-Zeit&lt;br /&gt;
* Höherer Resourcenbedarf zu Verwaltung des Systems und Bereitstellung der Semaphore etc.&lt;br /&gt;
* nicht streng deterministisch, somit kann kein festes Timing garantiert werden&lt;br /&gt;
* nicht explizit debug- und prüfbar, da die Prozesse nicht fest gekoppelt sind&lt;br /&gt;
&lt;br /&gt;
== Multithreading ==&lt;br /&gt;
&lt;br /&gt;
Multithreading ist eine meist softwarebasierende Möglichkeit moderner Betriebssysteme, innerhalb eines Prozesses mehrere Tasks (threads) parallel auszuführen. Der Vorteil dieser weiteren Unterteilung ist, dass sich die Threads eines Tasks den Speicherbereich teilen können und eine Aufteilung in logische nebeneinander laufende Teile möglich ist. Je nach Betriebssystem kann der Übergang von Multithreading zu Multiprocessing fliessend bis starr sein. &lt;br /&gt;
&lt;br /&gt;
Das Hyperthreading eines Intel Pentium 4 folgt dem Konzept des Multithreadings auf Hardwarebasis und teilt den CPU-Kern zeitlich in zwei logische Prozessoren ein.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung auf Prozessoren ==&lt;br /&gt;
Unabhängig davon, ob Multitasking oder -threading auf einem Prozessor konkret unterstützt wird, lässt es sich immer in Form von Software realisieren. Dies wird in modernen Systemen durch das OS geleistet, das standardisierte Funktionen und Strukturen zur Verfügung stellt. Besonders C++ bietet ein stark abstrahiertes Programmiermodell und Methoden-Set an, um effektiv untereinander kompatible Programmmodule erstellen zu können. Nutzt man diese nicht, wie z.B. bei der Programmierung in C, müssen Strukturen manuell erzeugt und gehandhabt werden, was aufwändiger ist, aber auch geringeren overhead bewirkt. Das Programm ist dann fast immer erheblich kleiner, in den meisten Fällen strukturell einfacher, bezüglich komplizierter Änderungen jedoch auch unflexibler und träger. &lt;br /&gt;
&lt;br /&gt;
Bei Mikrocontrollern findet man je nach Komplexität und Struktur der Appliation praktisch alle denkbaren Kombinationen:&lt;br /&gt;
&lt;br /&gt;
=== System mit real-time OS und Entwicklung in C++ ===&lt;br /&gt;
* Programmentwicklung stark an abstrakte Interfaces und Standards gebunden&lt;br /&gt;
* Starke Abhängigkeit an das OS im Bezug auf RT-Funktionalität&lt;br /&gt;
* Innerhalb gleicher OS-Landschaft gut portierbar&lt;br /&gt;
* Sehr geringe Abhängigkeit vom Prozessortyp&lt;br /&gt;
* Multitasking muss über OS-Schicht ausprogrammiert werden&lt;br /&gt;
* Multithreading muss/kann durch Programmierleistung optimiert werden&lt;br /&gt;
* Laufzeiteffizienz ist niedrig durch relativ hohen Anteil des OS-Bedarfs&lt;br /&gt;
* Datendurchsatz regelt sich selbst und ist gleichmäßig am relativen Maximum&lt;br /&gt;
* Programmiereffizienz ist niedrig durch sehr viel Arbeit an Formalismen&lt;br /&gt;
* Planungsaufwand ist noch überschaubar&lt;br /&gt;
* Planungseffizienz ist relativ hoch durch viele Standards&lt;br /&gt;
* Erweiterung um komplexe Module einfach möglich, Timing regelt sich selber&lt;br /&gt;
&lt;br /&gt;
=== System mit real-time OS und Entwicklung in C ===&lt;br /&gt;
* Programmentwicklung stark an Interfaces und weniger an Standards&lt;br /&gt;
* Starke Abängigkeit an das OS im Bezug auf RT-Funktionalität&lt;br /&gt;
* Innerhalb aber auch ausserhalb gleicher OS-Landschaft gut portierbar&lt;br /&gt;
* Geringe Abhängig von dem Prozessortyp&lt;br /&gt;
* Multitasking muss über OS-Schicht und eigene Strukturen programmiert werden&lt;br /&gt;
* Multithreading muss/kann durch Programmierleistung optimiert werden&lt;br /&gt;
* Laufzeiteffizienz ist höher durch geringeren Anteil des OS-Bedarfs&lt;br /&gt;
* Datendurchsatz regelt sich selbst und ist gleichmässig am relativen Maximum&lt;br /&gt;
* Programmiereffizienz ist höher durch weniger Arbeit mit Formalien&lt;br /&gt;
* Planungsaufwand ist etwas höher, je nach Applikation&lt;br /&gt;
* Planungseffizienz ist relaiv niedriger durch weniger Standards&lt;br /&gt;
* Erweiterung mit akzeptablem Aufwand möglich, Timing muss beachtet werden&lt;br /&gt;
&lt;br /&gt;
=== System ohne real-time OS und Entwicklung in C ===&lt;br /&gt;
* Programmentwicklung stark an Interfaces und kaum an Standards gebunden&lt;br /&gt;
* Ausprägung und Gestaltung der RT-Funktionalität absolut frei&lt;br /&gt;
* nur ausserhalb von OS-Landschaft portierbar, dafür prinziepiell sehr gut&lt;br /&gt;
* Stärkere Abhängig von dem Prozessortyp, kann die Portierbarkeit einschränken&lt;br /&gt;
* Multitasking muss auschlieslich durch eigene Strukturen programmiert werden&lt;br /&gt;
* Multithreading muss durch umständliche Programmierung ermöglicht werden werden&lt;br /&gt;
* Laufzeiteffizienz kann sehr hoch sein, ist aber stark von der Progr. abhängig&lt;br /&gt;
* Datendurchsatz muss selbst ins Maximum gesteuert werden, das aber höher liegt&lt;br /&gt;
* Programmiereffizienz ist hoch, dank Wegfall von Konventionen&lt;br /&gt;
* Planungsaufwand ist stark Applikations abhängig, gfs sehr viel grösser&lt;br /&gt;
* Planungseffizienz ist gering, da RT Konzept selber optmiert werden muss&lt;br /&gt;
* Erweiterung nur möglich, wenn Timing weitestgehend überarbeitet wird&lt;br /&gt;
&lt;br /&gt;
=== System ohne real-time OS und Entwicklung in ASM ===&lt;br /&gt;
* Programmentw. nur an physische Interfaces gebunden und frei von Standards&lt;br /&gt;
* Ausprägung und Gestaltung der RT-Funktionalität absolut frei&lt;br /&gt;
* nur innerhalb der Prozessorlandschaft gut portierbar&lt;br /&gt;
* Volle Abhängig vom Prozessortyp, Portierbarkeit auf andere aufwändig&lt;br /&gt;
* Multitasking muss auschlieslich durch eigene Strukturen programmiert werden&lt;br /&gt;
* Multithreading muss durch umständliche Programmierung ermöglicht werden werden&lt;br /&gt;
* Laufzeiteffizienz sehr hoch, jedoch stark von Programmierung abhängig&lt;br /&gt;
* Datendurchsatz muss selbst ins Maximum gesteuert werden, das aber höher liegt&lt;br /&gt;
* Programmiereffizienz ist hoch, dank Wegfall von Konventionen&lt;br /&gt;
* Planungsaufwand ist stark applikationsabhängig, ggfs. sehr viel grösser&lt;br /&gt;
* Planungseffizienz sehr gering, RT Konzept nur für einfache System machbar&lt;br /&gt;
* Erweiterung nur möglich, wenn Timing komplett überarbeitet wird&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [[Scheduler mit Erweiterung zum Mini-Betriebssystem]]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pr%E4emptives_Multitasking Präemptives Multitasking] bei [http://de.wikipedia.org Wikipedia]&lt;br /&gt;
* [http://www.femtoos.org/ Femto OS], ein ultrakompaktes Mulitaskingbetriebssystem für kleine Mikrocontroller&lt;br /&gt;
*[http://www.freertos.org/ FreeRTOS], ein freies Echtzeitbetriebssystem für Mikrocontroller&lt;br /&gt;
* [http://w3.ualg.pt/~rmarcel/Get%20by%20Without%20an%20RTOS.pdf Get by Without an RTOS] Ein schönes Beispiel wie man ohne ein RTOS auch Multitasking hinbekommt. &lt;br /&gt;
* [[TNKernel]], freier Multitasking-Kernel. &lt;br /&gt;
* [http://embeddedgurus.com/state-space/2010/04/i-hate-rtoses/ i-hate-rtoses] Blog zum Thema RTOS&lt;br /&gt;
* [http://stefanfrings.de/multitasking_arduino/index.html Multitasking mit Arduino] Beispiel für Umsetzung mit Zustandsautomat in C&lt;br /&gt;
[[Kategorie:Betriebssysteme]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100279</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100279"/>
		<updated>2019-02-11T17:08:56Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Tippfehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/en/microcontrollers/stm32h7-series.html STM32H7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** Bis 400MHz (856 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library (SPL) ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Die Standard Peripheral Library ist inzwischen veraltet, ST empfiehlt, sie nicht mehr zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Cube HAL ===&lt;br /&gt;
&lt;br /&gt;
Hat seit 2012 die SPL abgelöst.&lt;br /&gt;
&lt;br /&gt;
* https://www.st.com/en/embedded-software/stm32cube-mcu-packages.html&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [https://gnu-mcu-eclipse.github.io/ GNU ARM Plug-in](Linux, Windows)&lt;br /&gt;
** [https://atollic.com/truestudio/ TrueStudio for STM32] basiert auf Eclipse&lt;br /&gt;
** [http://www.openstm32.org/Downloading+the+System+Workbench+for+STM32+installer System Workbench for STM32] basiert auf Eclipse&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#Fertige_GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
** [https://github.com/blacksphere/blackmagic/wiki Black Magic Probe] simuliert einen seriellen Port der direkt von gdb verwendet werden kann. ST-Links können, so man sich Programmierzugang zu dem STM32F103 des Stlinks beschaffen kann, auch mit BMP umgeflasht werden. Das [https://github.com/blacksphere/blackmagic Blackmagic Programm] in der libftdi Version kann über JTAG und je nach interner Beschaltung auch mit SWD mit MPSSE fähigen FTDI Jtag Adaptern verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist eine vollständige Entwicklungsplattform für diverse ARM-Controller auf Basis eines RTOS mit Hardware-Abstraktion und webbasierter Online-sowie Offline-IDE. Ähnlich dem Arduino-Konzept können mit mbed einfachere Aufgaben schnell umgesetzt werden. mbed basiert auf C++ und unterstützt verschiedene Compiler. Projekte können auch exportiert und für andere IDEs heruntergeladen werden. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com Atollic TrueStudio] wurde seit der Übernahme durch ST auf STM32 Mikrocontroller reduziert und ist jetzt kostenlos verfügbar. Basiert auf Eclipse, OpenOCD und [[ARM GCC]]. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4, die aber mittlerweile nicht mehr weiterentwickelt wird. Basiert auf dem [[ARM GCC]] und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf [[ARM GCC]] aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler ([[ARM GCC]]), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks. Artikel: [[STM32 - Einstieg mit Em::Blocks]]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
* [[USB-Tutorial mit STM32]] enthält ein vollständiges Beispielprojekt&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [https://www.hitex.com/fileadmin/documents/tools/dev_tools/dt_protected/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (falls der Link nicht mehr funktioniert, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/ libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger&lt;br /&gt;
* [[USB-Tutorial mit STM32]]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100278</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100278"/>
		<updated>2019-02-11T17:08:24Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Zwei IDEs hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/en/microcontrollers/stm32h7-series.html STM32H7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** Bis 400MHz (856 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library (SPL) ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Die Standard Peripheral Library ist inzwischen veraltet, ST empfiehlt, sie nicht mehr zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Cube HAL ===&lt;br /&gt;
&lt;br /&gt;
Hat seit 2012 die SPL abgelöst.&lt;br /&gt;
&lt;br /&gt;
* https://www.st.com/en/embedded-software/stm32cube-mcu-packages.html&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [https://gnu-mcu-eclipse.github.io/ GNU ARM Plug-in](Linux, Windows)&lt;br /&gt;
** [[https://atollic.com/truestudio/ TrueStudio for STM32]] basiert auf Eclipse&lt;br /&gt;
** [[http://www.openstm32.org/Downloading+the+System+Workbench+for+STM32+installer System Workbench for STM32]] basiert auf Eclipse&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#Fertige_GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
** [https://github.com/blacksphere/blackmagic/wiki Black Magic Probe] simuliert einen seriellen Port der direkt von gdb verwendet werden kann. ST-Links können, so man sich Programmierzugang zu dem STM32F103 des Stlinks beschaffen kann, auch mit BMP umgeflasht werden. Das [https://github.com/blacksphere/blackmagic Blackmagic Programm] in der libftdi Version kann über JTAG und je nach interner Beschaltung auch mit SWD mit MPSSE fähigen FTDI Jtag Adaptern verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist eine vollständige Entwicklungsplattform für diverse ARM-Controller auf Basis eines RTOS mit Hardware-Abstraktion und webbasierter Online-sowie Offline-IDE. Ähnlich dem Arduino-Konzept können mit mbed einfachere Aufgaben schnell umgesetzt werden. mbed basiert auf C++ und unterstützt verschiedene Compiler. Projekte können auch exportiert und für andere IDEs heruntergeladen werden. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com Atollic TrueStudio] wurde seit der Übernahme durch ST auf STM32 Mikrocontroller reduziert und ist jetzt kostenlos verfügbar. Basiert auf Eclipse, OpenOCD und [[ARM GCC]]. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4, die aber mittlerweile nicht mehr weiterentwickelt wird. Basiert auf dem [[ARM GCC]] und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf [[ARM GCC]] aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler ([[ARM GCC]]), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks. Artikel: [[STM32 - Einstieg mit Em::Blocks]]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
* [[USB-Tutorial mit STM32]] enthält ein vollständiges Beispielprojekt&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [https://www.hitex.com/fileadmin/documents/tools/dev_tools/dt_protected/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (falls der Link nicht mehr funktioniert, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/ libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger&lt;br /&gt;
* [[USB-Tutorial mit STM32]]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100277</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100277"/>
		<updated>2019-02-11T17:05:54Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* ‎STM32Cube / HAL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/en/microcontrollers/stm32h7-series.html STM32H7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** Bis 400MHz (856 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library (SPL) ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Die Standard Peripheral Library ist inzwischen veraltet, ST empfiehlt, sie nicht mehr zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Cube HAL ===&lt;br /&gt;
&lt;br /&gt;
Hat seit 2012 die SPL abgelöst.&lt;br /&gt;
&lt;br /&gt;
* https://www.st.com/en/embedded-software/stm32cube-mcu-packages.html&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [https://gnu-mcu-eclipse.github.io/ GNU ARM Plug-in](Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#Fertige_GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
** [https://github.com/blacksphere/blackmagic/wiki Black Magic Probe] simuliert einen seriellen Port der direkt von gdb verwendet werden kann. ST-Links können, so man sich Programmierzugang zu dem STM32F103 des Stlinks beschaffen kann, auch mit BMP umgeflasht werden. Das [https://github.com/blacksphere/blackmagic Blackmagic Programm] in der libftdi Version kann über JTAG und je nach interner Beschaltung auch mit SWD mit MPSSE fähigen FTDI Jtag Adaptern verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist eine vollständige Entwicklungsplattform für diverse ARM-Controller auf Basis eines RTOS mit Hardware-Abstraktion und webbasierter Online-sowie Offline-IDE. Ähnlich dem Arduino-Konzept können mit mbed einfachere Aufgaben schnell umgesetzt werden. mbed basiert auf C++ und unterstützt verschiedene Compiler. Projekte können auch exportiert und für andere IDEs heruntergeladen werden. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com Atollic TrueStudio] wurde seit der Übernahme durch ST auf STM32 Mikrocontroller reduziert und ist jetzt kostenlos verfügbar. Basiert auf Eclipse, OpenOCD und [[ARM GCC]]. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4, die aber mittlerweile nicht mehr weiterentwickelt wird. Basiert auf dem [[ARM GCC]] und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf [[ARM GCC]] aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler ([[ARM GCC]]), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks. Artikel: [[STM32 - Einstieg mit Em::Blocks]]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
* [[USB-Tutorial mit STM32]] enthält ein vollständiges Beispielprojekt&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [https://www.hitex.com/fileadmin/documents/tools/dev_tools/dt_protected/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (falls der Link nicht mehr funktioniert, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/ libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger&lt;br /&gt;
* [[USB-Tutorial mit STM32]]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100276</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=100276"/>
		<updated>2019-02-11T17:04:14Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* ‎STM32 Standard Peripheral Library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/en/microcontrollers/stm32h7-series.html STM32H7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** Bis 400MHz (856 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library (SPL) ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Die Standard Peripheral Library ist inzwischen veraltet, ST empfiehlt, sie nicht mehr zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [https://gnu-mcu-eclipse.github.io/ GNU ARM Plug-in](Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#Fertige_GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
** [https://github.com/blacksphere/blackmagic/wiki Black Magic Probe] simuliert einen seriellen Port der direkt von gdb verwendet werden kann. ST-Links können, so man sich Programmierzugang zu dem STM32F103 des Stlinks beschaffen kann, auch mit BMP umgeflasht werden. Das [https://github.com/blacksphere/blackmagic Blackmagic Programm] in der libftdi Version kann über JTAG und je nach interner Beschaltung auch mit SWD mit MPSSE fähigen FTDI Jtag Adaptern verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist eine vollständige Entwicklungsplattform für diverse ARM-Controller auf Basis eines RTOS mit Hardware-Abstraktion und webbasierter Online-sowie Offline-IDE. Ähnlich dem Arduino-Konzept können mit mbed einfachere Aufgaben schnell umgesetzt werden. mbed basiert auf C++ und unterstützt verschiedene Compiler. Projekte können auch exportiert und für andere IDEs heruntergeladen werden. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com Atollic TrueStudio] wurde seit der Übernahme durch ST auf STM32 Mikrocontroller reduziert und ist jetzt kostenlos verfügbar. Basiert auf Eclipse, OpenOCD und [[ARM GCC]]. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4, die aber mittlerweile nicht mehr weiterentwickelt wird. Basiert auf dem [[ARM GCC]] und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf [[ARM GCC]] aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler ([[ARM GCC]]), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks. Artikel: [[STM32 - Einstieg mit Em::Blocks]]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
* [[USB-Tutorial mit STM32]] enthält ein vollständiges Beispielprojekt&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [https://www.hitex.com/fileadmin/documents/tools/dev_tools/dt_protected/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (falls der Link nicht mehr funktioniert, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/ libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger&lt;br /&gt;
* [[USB-Tutorial mit STM32]]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Absolute_Beginner&amp;diff=99418</id>
		<title>Absolute Beginner</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Absolute_Beginner&amp;diff=99418"/>
		<updated>2018-06-23T08:21:54Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Werkzeug */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Grundlagen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Gestern tat es einen Schlag,&amp;lt;br/&amp;gt;&lt;br /&gt;
wovon ich hier berichten mag.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drosselspulen, Widerstände,&amp;lt;br/&amp;gt;&lt;br /&gt;
alles fällt mir in die Hände.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da bau ich eine Schaltung auf.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ein Kühlblech kommt da auch noch drauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
An Einstellreglern rumgedreht,&amp;lt;br/&amp;gt;&lt;br /&gt;
bis dann plötzlich nichts mehr geht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Elkos hab ich nicht gebraucht,&amp;lt;br/&amp;gt;&lt;br /&gt;
Widerstände abgeraucht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jetzt ist die Bude voller Qualm,&amp;lt;br/&amp;gt;&lt;br /&gt;
zum Himmel schick ich einen Psalm.&amp;lt;br/&amp;gt;&lt;br /&gt;
Transistoren an den Ohren.&amp;lt;br/&amp;gt;&lt;br /&gt;
Dioden an den Hoden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Kabel am Nabel.&amp;lt;br/&amp;gt;&lt;br /&gt;
Phase an der Nase!&amp;lt;br/&amp;gt;&lt;br /&gt;
Herzkammer flimmert; kann nur noch fluchen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Muß mir ein neues Hobby suchen!&amp;lt;br/&amp;gt;&lt;br /&gt;
MfG Paul&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Damit dieses von Paul so plastisch dargestellte Anfängerszenario gar nicht erst eintritt, werden auf dieser Artikelseite von http://www.mikrocontroller.net einige Dinge aufgeführt, die unbedingt notwendig sind, wenn man sich mit Elektronikbasteleien auseinandersetzt. Die Seite richtet sich bewusst an den absoluten Anfänger um so interessierten Leuten den Einstieg in die Welt der Elektronik und damit auch zum Programmieren von Mikrocontrollern möglichst einfach zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Natürlich ist das Programmieren von Mikrocontrollern auch ohne Elektronikkenntnisse machbar, aber die Aussenanbindung eines Mikrocontrollers zu verstehen ist häufig sinnvoll, so z.&amp;amp;nbsp;B. wenn man ein Signal auswerten möchte.&lt;br /&gt;
&lt;br /&gt;
Die Grundlage für diesen Artikel bildet dieser [http://www.mikrocontroller.net/forum/read-1-344257.html#new Thread] aus dem Forum.&lt;br /&gt;
&lt;br /&gt;
==Sicherheit==&lt;br /&gt;
&lt;br /&gt;
Bleibt gesund! Denkt daran, dass nicht nur Strom und  Spannung bei dem neuen interessanten Hobby gefährlich sein können, sondern auch Hitze, Licht (Laser), Schall, Chemikalien (Entwickler, Ätzbäder, Lötrauch) usw. Lieber einmal mehr fragen, als einmal zu wenig. Und vielleicht bewahrt eure Frage euch und den Nächsten vor Schaden!&lt;br /&gt;
&lt;br /&gt;
===Versuchsaufbauten &amp;gt;60V (DC)===&lt;br /&gt;
Tipp aus dem Forum [http://www.mikrocontroller.net/topic/181266#1750311]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Diplomand schrieb:&lt;br /&gt;
&amp;gt; Oder wie geht es auf&#039;er Arbeit zu in Puncto &lt;br /&gt;
&amp;gt; Versuchsaufbauten?&lt;br /&gt;
&lt;br /&gt;
Alles was über 60V (DC) ist muß bei anliegender Spannung&lt;br /&gt;
mindestens unter 1 cm dickes Plexiglas.&lt;br /&gt;
&lt;br /&gt;
Gruß Anja&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
Ohne Lektüre (egal ob in Papierform oder im Internet) wird das mit der Elektronik in Eigenregie nix. &lt;br /&gt;
Möchte man sich ernsthaft mit der Materie beschäftigen, so kommt man nicht umhin, sich mit den Grundlagen der Elektronik zu beschäftigen. Während man im Internet viele Schaltungen findet, die einfach nachzubauen sind, bietet sich für das Grundlagenstudium eher ein Buch an. Da gute Elektronikbücher häufig teuer sind, will ich Dir folgenden Tipp geben: Schau einfach mal in die nächste größere Bibliothek. Wenn Dir ein Buch dort gefällt, kannst Du es jederzeit noch kaufen. Wer sich nicht irgendwann mit den Grundlagen beschäftigt, wird nie über das Stadium herauskommen, in dem er Schaltungen aus dem Internet kopiert. Aber unser aller Ziel ist es doch, auch zu verstehen, weshalb hier jetzt genau der rot-rot-schwarze Widerstand rein muss und was er tut...&lt;br /&gt;
*&#039;&#039;&#039;Fachzeitschriften&#039;&#039;&#039; am Kiosk&lt;br /&gt;
*&#039;&#039;&#039;Internet&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;[http://www.elektronik-kompendium.de/ Das Elektronik Kompendium]&#039;&#039;&#039; Ziel von das ELKO ist es die Themen Elektronik, Computertechnik, Kommunikationstechnik und Netzwerktechnik allgemeinverständlich zu erklären und der Allgemeinheit zu präsentieren. Die Zielgruppe sind vor allem Schüler und Auszubildende, die sich mit Elektronik näher beschäftigen müssen oder wollen. Weiterhin sollen alle privat und beruflich an Elektronik interessierte angesprochen werden.&lt;br /&gt;
**&#039;&#039;&#039;http://www.dse-faq.elektronik-kompendium.de/&#039;&#039;&#039; Es gibt zwar von der Startseite des ELKO einen Link zum FAQ, aber es schadet sicher nicht, es hier explizit aufzuführen.&lt;br /&gt;
**&#039;&#039;&#039;http://www.b-kainka.de/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;http://www.dieelektronikerseite.de/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;http://www.howstuffworks.com/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;Datenblatt (Datasheet)&#039;&#039;&#039; zu den meisten Bauteilen, wird vom Hersteller ein Datasheet angeboten. Es ist sinnvoll, dies wenigstens einmal durchzulesen, auch wenn man am Anfang wenig mit den ganzen Fachbegriffen anfangen kann.  &lt;br /&gt;
**Diverse Application Notes der großen Halbleiterhersteller sind auch immer eine gute Informationsquelle und beschäftigen sich teilweise auch mit sehr grundlegenden Problemen&lt;br /&gt;
*&#039;&#039;&#039;Bücher&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;[http://www.amazon.com/gp/product/0521370957/103-9884703-3518215?v=glance&amp;amp;n=283155 Art Of Electronics]&#039;&#039;&#039; Bitte nur die englische Version nutzen, da die Übersetzung nicht gut gelungen ist.&lt;br /&gt;
** &#039;&#039;&#039;[http://www.amazon.de/exec/obidos/ASIN/3426037920/qid=1146692611/sr=8-1/ref=sr_8_xs_ap_i1_xgl/302-0461878-1759243 Elektronik ohne Geheimnisse]&#039;&#039;&#039; Von der Anfängerschaltung bis zum Radio Franzis-Verlag ISBN 3-426-03792-0&lt;br /&gt;
**&#039;&#039;&#039;Schaltkreisbastelbuch&#039;&#039;&#039; von H.Jakubaschk und das&lt;br /&gt;
**&#039;&#039;&#039;Radiobastelbuch&#039;&#039;&#039; von K.H. Schubert. Das sind sehr alte DDR-Bücher. Aber die sind für Einsteiger äußerst nahrhaft.&lt;br /&gt;
**&#039;&#039;&#039;Tabellenbuch&#039;&#039;&#039; ein beliebiges Elektronik Tabellenbuch, hier findest Du die  mathematischen Grundlagen als Formelsammlung. Es wird Dich als Nachschlagewerk bis zur Rente begleiten.&lt;br /&gt;
** [http://www.generalatomic.com/teil1/index.html Das Telekosmos-Praktikum (Teil 1)]&lt;br /&gt;
** &#039;&#039;&#039;[http://www.amazon.de/Elektronik-nicht-schwer-Experimente-Gleichstrom/dp/3921608325 Elektronik - gar nicht schwer]&#039;&#039;&#039; Es gibt davon verschiedene Bände. Band 1 ist für den absoluten Einstieg gut, allerdings sind die Schaltungen darin für etwas Fortgeschrittene nicht mehr besonders interesssant. Band 2 hingegen ist sowohl für Einsteiger als auch für Fortgeschrittene empfehlenswert!&lt;br /&gt;
** &#039;&#039;&#039;[http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] PDF&lt;br /&gt;
&lt;br /&gt;
==Grundausstattung für das Elektroniklabor==&lt;br /&gt;
In der folgenden Liste werden die wichtigsten Bauteile aufgeführt, die in keinem Elektroniklabor fehlen dürfen. Da es eine Unmenge an Angeboten der einzelnen Bauteile gibt, wird auf der Seite [[Standardbauelemente]] darauf hingewiesen, welche Bauteile sich im Laufe der Zeit als sinnvoll dargestellt haben.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;[[Steckbrett]]&amp;lt;/b&amp;gt; Mit dem Steckbrett (Breadboard) kann man schnell und ohne Lötkolben eine Schaltung zum Testen aufbauen. &lt;br /&gt;
* &amp;lt;b&amp;gt;[[Steckbrücken und Kabel]]&amp;lt;/b&amp;gt; Ein farbcodiertes Steckbrückenset [http://www.ebay.de/sch/items/?_nkw=Steckbr%C3%BCcken+Set] macht das Verkabeln einfacher. Dazu noch ein Sortiment an Kabeln [http://www.ebay.de/sch/items/?_nkw=Jumper+Wires]. Zur Auswahl des richtigen Drahts fürs Steckbrett sind in folgendem Thread nützliche Informationen zu finden: [http://www.mikrocontroller.net/forum/read-1-350462.html#new].&lt;br /&gt;
*&#039;&#039;&#039;Widerstände:&#039;&#039;&#039; 330 Ω, 1 kΩ, 3.3 kΩ, 10 kΩ, 100 kΩ, 1 MΩ (lies: &amp;quot;Ohm&amp;quot;/&amp;quot;Kilo-Ohm&amp;quot;/&amp;quot;Mega-Ohm&amp;quot;). Ob man sich Kohleschicht- oder Metallfilmwiderstände kauft, ist zunächst unerheblich.&lt;br /&gt;
*&#039;&#039;&#039;Potentiometer:&#039;&#039;&#039; 1 kΩ, 10 kΩ, 100 kΩ&lt;br /&gt;
*&#039;&#039;&#039;Elektrolytkondensatoren&#039;&#039;&#039; (&amp;quot;Elkos&amp;quot;): 1 µF, 10 µF, 100 µF, 470 µF, 1000 µF, 2200 µF (lies: &amp;quot;Mikro-Farad&amp;quot;). Eine Spannungsfestigkeit von 25 Volt ist für den Anfang ausreichend.&lt;br /&gt;
*&#039;&#039;&#039;Keramikkondensatoren:&#039;&#039;&#039; 100 nF; 22 pF (letztere für Quarze)&lt;br /&gt;
*&#039;&#039;&#039;Dioden:&#039;&#039;&#039; 1N4148, 1N4007; BAT43 oder BAT85 (Schottky)&lt;br /&gt;
*&#039;&#039;&#039;[[LED]]s&#039;&#039;&#039; verschiedenfarbig, je nach Geschmack. Man sollte zumindest einige Farben haben, um unterschiedliche Betriebszustände u.ä. anzuzeigen.&lt;br /&gt;
*&#039;&#039;&#039;[[Transistor]]en:&#039;&#039;&#039; BC547, BC557 (Dies sind die beiden Standard npn- bzw. pnp-Transistortypen) und  BC327, BC337 (höherer Kollektorstrom, trotzdem Standard)&lt;br /&gt;
*&#039;&#039;&#039;Operationsverstärker (&amp;quot;OPV&amp;quot; oder &amp;quot;OpAmp&amp;quot;):&#039;&#039;&#039; LM324 (der LM741 ist weniger gut geeignet)&lt;br /&gt;
*&#039;&#039;&#039;Universal-Timer-IC:&#039;&#039;&#039; NE555. Wenn man mit 3,3V Mikrocontrollern arbeitet, dann eventuell die nur wenige Cent teureren CMOS-Version wie LM&#039;&#039;&#039;C&#039;&#039;&#039;555, I&#039;&#039;&#039;C&#039;&#039;&#039;M7555, TS555, TM&#039;&#039;&#039;C&#039;&#039;&#039;555, usw. Diese lassen sich mit niedrigeren Betriebsspannungen betreiben (Datenblatt checken!), während der bipolare NE555 etwa mindestens 4,5V benötigt.&lt;br /&gt;
*&#039;&#039;&#039;[[AVR-Tutorial:_Equipment#Spannungsversorgung|Spannungsregler]]:&#039;&#039;&#039; Ein  7805-Festspannungsregler für die Bereitstellung von 5 V ist sinnvoll, wenn man mal eine Schaltung autark betreiben will. Dann benötigt man in den meisten Fällen noch einen geeigneten Trafo mit einem Brückengleichrichter und einem Glättungskondensator oder ein kleines Steckernetzteil als Basisversorgung für den Spannungsregler. Ein regelbares Netzteil mit Anzeige ist ebenfalls einsetzbar, birgt aber eine Gefahr in sich. Einige ICs, darunter Mikrocontroller, haben enge Betriebsgrenzen, in denen sie funktionieren bzw. oberhalb denen sie sterben (siehe unter &#039;&#039;Absolute Maximum Ratings&#039;&#039; im Datenblatt). Irgendwann ist der Stellknopf am Labornetzteil dann doch höhergestellt, als es dem Chip gut tut... &lt;br /&gt;
*&#039;&#039;&#039;Schalter&#039;&#039;&#039; einfache Schiebeschalter (EIN/AUS)&lt;br /&gt;
*&#039;&#039;&#039;Taster: &#039;&#039;&#039; Bedrahtet oder SMD Kurzhubtaster (billiger). Für Verwendung mit einem Mikrocontroller müssen diese softwareseitig [[Entprellung|entprellt]] werden.&lt;br /&gt;
*&#039;&#039;&#039;Lötnägel&#039;&#039;&#039; Sind dazu gedacht, auf Platinen eingelötet zu werden.  Auf Breadboards haben sie nichts verloren, weil sie mit einem Durchmesser von 1 mm dafür zu dick sind.&lt;br /&gt;
* &#039;&#039;&#039;Jumperpins&#039;&#039;&#039;: gibt es als 40polige Leiste, die man mit dem Seitenschneider kürzen kann.&lt;br /&gt;
* &#039;&#039;&#039;Ein Satz Schnellverbinder-Kabel&#039;&#039;&#039; mit Krokodilklemmen an beiden Enden&lt;br /&gt;
*&#039;&#039;&#039;Draht&#039;&#039;&#039;&lt;br /&gt;
** dünne Litze,&lt;br /&gt;
** dünner isolierter Draht (je dünner desto besser), ideal: Wrap-Draht ca. AWG30, leider etwas schwer erhältlich und teuer, (alte 80-polige IDE-Kabel sind meist AWG30)&lt;br /&gt;
** dünner blanker verzinnter Draht (möglichst &amp;lt; 0,5mm, leider etwas schwer erhältlich) oder lötbarer Silberdraht,&lt;br /&gt;
* Ein paar &#039;&#039;&#039;Lochraster-Platinen&#039;&#039;&#039; mit Lötpunkten, falls man doch nicht nur stecken und nachher auseinanderbauen will. &#039;&#039;&#039;Streifenraster-Platinen&#039;&#039;&#039; sparen ein paar Löt- oder Drahtbrücken.&lt;br /&gt;
&lt;br /&gt;
Installationskabel, dicke 230V-Litze oder Klingeldraht sollte man zum Aufbau von Lochraster-Schaltungen nicht verwenden. Leitungen mit größerem Querschnitt kommen nur zum Einsatz, wenn hohe Ströme fließen sollen.&lt;br /&gt;
&lt;br /&gt;
Zur Aufbewahrung der Kleinteile ist ein Kleinteilemagazin oder einige Sortimentkästen sehr zu empfehlen. Man muss sich nicht von vornherein auf spezielle Bauteile festlegen.&lt;br /&gt;
&lt;br /&gt;
Eine weiterreichende Liste von Standard-Bauelementen findet sich [[Standardbauelemente|hier]].&lt;br /&gt;
&lt;br /&gt;
==Werkzeug==&lt;br /&gt;
* Eine eigene &#039;&#039;&#039;Bastelecke&#039;&#039;&#039;, in der ein Aufbau auch mal ein, zwei Wochen [http://www.mikrocontroller.net/topic/15027#104245 liegenbleiben] kann, bis man wieder Lust oder Zeit hat, was daran zu machen. Bau Dir den Schreibtisch vorm PC nicht zu – Du brauchst den Zugang hierher ;-)&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;stabile Unterlage&#039;&#039;&#039;, die nicht leitend ist, z. B. eine Holzplatte. Die nimmt es im Gegensatz zum Wohnzimmertisch nicht übel, wenn der Lötkolben mal umfällt und einen Brandfleck hinterlässt, oder wenn abgeknipste, scharfe Drahtspitzen (Platinenunterseiten!) kratzen. Eine Anti-Statik-Matte (mit angeschlossener Erdung!!) ist auch eine Überlegung wert, sie bewahrt evtl vor unangenehmen Überraschungen und langer Fehlersuche. &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Halterung&#039;&#039;&#039; um Dinge fixieren zu können. Anfangs tut&#039;s die [http://www.ebay.de/sch/items/?_nkw=Dritte+Hand dritte Hand]. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;kleiner Schraubendreher&#039;&#039;&#039; als Allzweckwerkzeug zum Drücken, Klopfen, Justieren, ICs-aus-dem-Sockel-hebeln, Kabel beim Löten Fixieren.  Ach ja, Schrauben drehen kann man damit auch.&lt;br /&gt;
&lt;br /&gt;
* Eine gute, spitze &#039;&#039;&#039;Pinzette&#039;&#039;&#039; zum Greifen und Richten kleiner Bauteile, Drähte einstecken usw. Außerdem eine Klemmpinzette mit flacher Spitze zum Fixieren von Bauteilen.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Seitenschneider&#039;&#039;&#039;, klein, zum Durchtrennen von Drähten. Opas Kneifzange ist ungeeignet, Omas Handarbeitsschere auch.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Spitzzange&#039;&#039;&#039;, klein, für alles, wofür die Pinzette nicht kräftig genug ist. &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Abisolierzange&#039;&#039;&#039;, Bauform vgl. Wasserrohrzange. Die symmetrischen mit dem Loch vorne sind eher für Starkstromleitungen gedacht.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Skalpell&#039;&#039;&#039; als Allzweckwaffe. Wenn man es einmal hat, will man es nicht mehr missen.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Cuttermesser&#039;&#039;&#039; für alles grobe wofür das Skalpell zu schade ist und wo die Abisolierzange und der Seitenschneider versagt.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Grundausrüstung zum Löten&#039;&#039;&#039;. Detaillierte Informationen zum Löten findest Du im Artikel [[Löten_(praktisch)]].&lt;br /&gt;
** &#039;&#039;&#039;Lötkolben&#039;&#039;&#039; 30 Watt ungeregelt oder mehr als 30 Watt mit Regelung&lt;br /&gt;
** &#039;&#039;&#039; Lötzinn&#039;&#039;&#039; 1 mm&lt;br /&gt;
** &#039;&#039;&#039;Lötschwamm &#039;&#039;&#039;. Ein gut mit Wasser angefeuchteter Baumwoll-Lumpen (gefaltete &amp;quot;Jute-Tasche&amp;quot;) tut es auch. Destillierte Wasser ist auf Dauer besser als Leitungswasser.&lt;br /&gt;
** Eine &#039;&#039;&#039;Entlötpumpe&#039;&#039;&#039; oder &#039;&#039;&#039;Entlötlitze&#039;&#039;&#039; zum Fehler auszubessern. &lt;br /&gt;
&lt;br /&gt;
* Eine kleine &#039;&#039;&#039;(LED-) Taschenlampe&#039;&#039;&#039; und eine Lupe, um Bauteile wie Dioden oder schwach bedruckte IC&#039;s zu beleuchten und um deren Beschriftung erkennen zu können. Das  Tageslicht kann gelegentlich zu &amp;quot;dunkel&amp;quot; sein.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Crimpzange&#039;&#039;&#039; und die entsprechenden Crimp-Kontakte und Leergehäuse. Macht das Basteln auf Dauer einfacher, da sich Kabel mit passender Länge und passendem Ende (Pin oder Buchse) schnell und ohne Löten herstellen lassen. Ausserdem scheiden irgendwelche Verlängerungen oder Isolierbandkonstruktionen als Fehlerquelle aus. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Netzteil mit Strombegrenzung&#039;&#039;&#039; hilft zu verhindern, dass Dir ständig die Bauteile flöten gehen. Oder Du nimmst deine Schaltungen zunächst mit Batterien oder Akkus in Betrieb, dann kostet es &amp;quot;nur&amp;quot; die Schaltung. Denn bei Batterien/Akkus ist auch darauf zu achten, dass bei einem Kurzschluss sehr hohe Ströme fließen können! Als Strombegrenzung für die Schaltung kann bei kleinen Aufbauten eine 6 V/100 mA Glühlampe in Serie benutzt werden ([http://www.mikrocontroller.net/topic/61119#480376 Forenbeitrag]). Bei einem Kurzschluss heizt sich durch den hohen Strom der Faden auf, die Lampe wird hell, der Widerstand des Fadens nimmt zu, und es können nur die 100 mA zur Schaltung kommen. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;[http://de.wikipedia.org/wiki/Multimeter Multimeter]&#039;&#039;&#039; zum Messen von Spannungen, Strömen und Widerständen. Eine Überlegung wert ist der Kauf zweier Multimeter, weil man dann z. B. gleichzeitig Strom und Spannung messen kann. Prüfspitzen in Klemmausführung haben den Vorteil, dass man die Hände frei hat für wichtigere Dinge. [http://de.wikipedia.org/wiki/Digitalmultimeter Digitale Multimeter] sind in der Regel günstiger als die analogen (Beispiel: 4,95 € bei [http://www.pollin.de pollin]). Für den Anfang reicht normalerweise ein günstiges Gerät, später könnte aber dessen mangelnde Genauigkeit doch einigen Frust erzeugen - das ggf gleich ein paar Euro mehr ausgeben. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;[[Oszilloskop]]&#039;&#039;&#039; ist zu Beginn noch nicht unbedingt notwendig, schadet aber nicht. Ein &#039;&#039;&#039;[[Logikanalysator]]&#039;&#039;&#039; ist für Digital-Schaltungen auch schon hilfreich und ggf. billiger. Wenn man sich eine Weile mit der Materie beschäftigt, kommt die Wünsche von ganz alleine. Ein kleiner Ratgeber zur Auswahl von Geräten findet sich hier im Wiki. &#039;&#039;Tip:&#039;&#039;Für I2C, SPI und UART reicht bei niedrigen Raten (bis so 16kHz) oft ein PC-Oszilloskop mit einem etwas veränderten Mikrofonkabel. Das Selber-Bauen eines Logikanalysators ist ein interessantes Projekt (siehe [[Logic_Analyzer]]), erreicht aber oft nicht die gewünschten Funktionen und Bandbreite - oder scheitert schon an dem grundlegenden [http://de.wikipedia.org/wiki/Henne-Ei-Problem Henne-Ei Problem].&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
* Ein &#039;&#039;&#039;Simulationstool&#039;&#039;&#039; ist nützlich. Mit Simulationsprogrammen kann man sich viel Zeit und Frust ersparen. Man weiß bereits vor dem Aufbau, ob eine Schaltung NICHT funktionieren wird. Der Umkehrschluss (&amp;quot;Das funktioniert dann auch in Echt&amp;quot;) ist leider nicht immer möglich.&lt;br /&gt;
:Viele kommerzielle, aber auch kostenlos erhältliche Simulationsprogramme sind Abkömmlinge eines Programms namens &#039;&#039;&#039;[[SPICE]]&#039;&#039;&#039;. Z.B. enthalten die folgenden Programme nicht ganz zufällig je einen SPICE-Kern für die eigentliche Berechnung. Im Gegensatz zum Original-SPICE bieten sie jedoch den Vorteil einer grafischen Benutzeroberfläche. &lt;br /&gt;
** Die &#039;&#039;&#039;[http://www.electronicsworkbench.com/ Electronic Workbench]&#039;&#039;&#039; (aktuelle Versionen heißen &#039;&#039;&#039;NI Multisim&#039;&#039;&#039;, nachdem der Hersteller von National Instruments übernommen wurde) ist in einigen Fachbüchern (s. Franzis Verlag) als abgespeckte Version mit einem geringeren Umfang an simulierbaren Bauteilen beigelegt und als [http://digital.ni.com/worldwide/germany.nsf/web/all/23834AA0D635C68586257124004EF1C9#3 Studentenversion günstiger erhältlich].&lt;br /&gt;
** &#039;&#039;&#039;[http://www.linear.com/designtools/software/#Spice SwitcherCAD III/LTspice]&#039;&#039;&#039; wird vom Hersteller Linear Technology kostenlos abgegeben. Eigentlich zur Unterstützung bei der Entwicklung von Anwendungen mit Linear Technology Produkten gedacht, enthält es doch einen kompletten SPICE-Kern.&lt;br /&gt;
** Das früher sehr populäre &#039;&#039;&#039;PSpice&#039;&#039;&#039; (erste PC SPICE Version, von der es eine kostenlose &#039;&#039;Student Edition&#039;&#039; gab) wurde mittlerweile von Cadence übernommen und in die OrCAD-Produktlinie integriert. Dabei ist die Student Edition weggefallen. Es gibt statt dessen eine &#039;&#039;&#039;[http://www.cadence.com/products/orcad/downloads/orcad_demo/index.aspx OrCAD PCB Demo-CD]&#039;&#039;&#039;, auf der auch eine eingeschränkte PSpice-Version enthalten ist.&lt;br /&gt;
** &#039;&#039;&#039;[http://ngspice.sourceforge.net/screens.html ngspice]&#039;&#039;&#039; ist eine mit diversen Erweiterungen versehene Freie-Software Version von SPICE für diverse Unix Systeme (Solaris, Linux, Mac OS X, etc.) und Windows XP. Es enthält eine graphische Ausgabe, jedoch selber keine graphische, sondern nur eine Texteingabe. Es ist Teil von &#039;&#039;&#039;[http://www.geda.seul.org/ gEDA]&#039;&#039;&#039;, einer Sammlung von freien &#039;&#039;Electronic Design Automation&#039;&#039;-Werkzeugen, zu denen auch &#039;&#039;&#039;gschem&#039;&#039;&#039; als Schaltplan-Editor gehört. Was zur nächsten Kategorie führt:  &lt;br /&gt;
** &#039;&#039;&#039;[http://qucs.sourceforge.net QUCS]&#039;&#039;&#039; ist ein gutes Simulationsprogramm, welches sich nicht nur zu Lernzwecken eignet, sondern auch zur Simulation von &amp;quot;echten&amp;quot; Schaltungen (Bauteilkatalog mit Strg-4 abrufen). Nützlich ist die Einbindung der Graphen direkt in den Schaltungseditor, da man so &amp;quot;alles auf einem Blick hat&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;[http://ktechlab.org/ KTechLab]&#039;&#039;&#039; ist eine Echtzeitsimulation von analogen und digitalen Bauelementen in Kombination mit PIC-Mikrocontrollern.&lt;br /&gt;
** &#039;&#039;&#039;[http://www.falstad.com/circuit/ P. Falstads Circuit Simulator]&#039;&#039;&#039; ist ein Java-Applet, das man direkt aus dem Browser heraus ausführen kann. Die Möglichkeiten sind zwar nicht ganz so umfangreich wie bei den anderen genannten Simulatoren, trotzdem lässt sich mit dem Applet schnell und einfach eine Schaltung simulieren (Vorteil: Programm muss nicht erst installiert werden)&lt;br /&gt;
So kann das gesamte Mikrocontrollerprojekt simuliert werden. Aber auch in die Transistor/Operationsverstärker/Logiktechnik kann man sich mit dem Programm gut&lt;br /&gt;
einarbeiten.&lt;br /&gt;
* Ein &#039;&#039;&#039;Schaltplaneditor&#039;&#039;&#039; (&#039;&#039;schematic capturer&#039;&#039;) ist nützlich z.&amp;amp;nbsp;B. &lt;br /&gt;
** &#039;&#039;&#039;[http://www.abacom-online.de/html/splan.html sEdit ]&#039;&#039;&#039; Software für Windows auch als Freewareversion geeignet.&lt;br /&gt;
**&#039;&#039;&#039;[http://www.cadsoft.de/ Eagle von Cadsoft]&#039;&#039;&#039; Der Quasi-Standard für Hobbyanwender. Es ist zwar etwas gewöhnungsbedürftig in der Bedienung, aber wenn  man erstmal dahintergekommen ist, was sich Cadsoft dabei gedacht hat, kann man damit leben. Und mit der Freeware-Version, Light- oder auch Non-Profit-Version kann man schon einiges machen. Früher oder später wirst eh nicht darum herumkommen, auch Platinen zu machen, und dann kannst Du schon auf eine Basis von Schaltplänen zurückgreifen, die Du vorher nur z.&amp;amp;nbsp;B. auf Lochraster aufgebaut hast und brav vorher wenigstens einen Schaltplan davon gezeichnet hast.&lt;br /&gt;
** Die bereits erwähnte &#039;&#039;&#039;[http://www.cadence.com/products/orcad/downloads/orcad_demo/index.aspx OrCAD PCB Demo-CD]&#039;&#039;&#039; enthält eine Demo-Version von &#039;&#039;&#039;OrCADE Capture&#039;&#039;&#039;.&lt;br /&gt;
** Das schon erwähnte &#039;&#039;&#039;[http://www.geda.seul.org/tools/gschem/index.html gschem]&#039;&#039;&#039; aus der gEDA-Sammlung.&lt;br /&gt;
** Die freie Software &#039;&#039;&#039;[http://www.lis.inpg.fr/realise_au_lis/kicad/ KiCad]&#039;&#039;&#039; für Linux und Windows (siehe auch den Artikel [[KiCAD]]).&lt;br /&gt;
:Siehe den Artikel [[Schaltplaneditoren]] für weitere Informationen zu Schaltplaneditoren.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Layout-Editor&#039;&#039;&#039; ist nützlich, um den Schaltplan dann in eine Vorlage zum Selbstätzen umzusetzen oder die Platine als Datei zum Leiterplattenhersteller zu senden.&lt;br /&gt;
** Das bereits erwähnte &#039;&#039;&#039;[http://www.cadsoft.de/ Eagle von Cadsoft]&#039;&#039;&#039; gilt auch hier als der Standard im Hobbybereich.&lt;br /&gt;
**&#039;&#039;&#039;[http://www.ibfriedrich.com TARGET 3001! ]&#039;&#039;&#039; vom Ing.-Büro Friedrich ist eine komplette Software vom Schaltplan bis zum Layout, inkl. Simulation oder Isolationsfräsen. Die kostenlose [http://www.ibfriedrich.com/download.htm Discover-Version] geht bis 250 Pins. Einen einfachen Einstieg findet man &#039;&#039;&#039;[http://ibfriedrich.dyndns.org/wiki/ibfwikide/index.php?title=Kurzeinführung2 hier]&#039;&#039;&#039;.&lt;br /&gt;
** In der gEDA-Sammlung für Linux findet man &#039;&#039;&#039;[http://www.geda.seul.org/tools/pcb/index.html PCB]&#039;&#039;&#039;, das allerdings noch Ecken und Kanten hat. &lt;br /&gt;
** Das bereits erwähnte &#039;&#039;&#039;[http://www.lis.inpg.fr/realise_au_lis/kicad/ KiCad]&#039;&#039;&#039; ermöglicht ebenfalls die Erstellung von Platinen-Layouts.&lt;br /&gt;
&lt;br /&gt;
* Zum Aufbau auf Platinen mit &#039;&#039;&#039;Lochraster&#039;&#039;&#039; oder &#039;&#039;&#039;Lochstreifen&#039;&#039;&#039; gibt es die Tools&lt;br /&gt;
** [http://www.geocities.com/stripboarddesigner/ Stripboard Designer] (Shareware)&lt;br /&gt;
** [http://veecad.com/ VeeCAD] Stripboard Layout Editor&lt;br /&gt;
** [http://www.abacom-online.de/html/lochmaster.html Lochmaster] (ca. 40€)&lt;br /&gt;
** [http://blackboard.serverpool.org/Home/News.html Blackboard], das kommt [http://www.mikrocontroller.net/topic/open-source-lochraster-layout hier aus dem Forum], ist opensource und kostenlos. Auf [http://www.sebulli.com/BlackBoard/index.html Sebulli] gibt es ein paar ergänzende Bauteil-Libraries.&lt;br /&gt;
** mit einem Zeichenprogramm ([http://www.mikrocontroller.net/topic/112889 Forenbeitrag])&lt;br /&gt;
** Alternativ kann man mit (Kästchen-)Papier und Stift entwerfen...&lt;br /&gt;
&lt;br /&gt;
==Baukästen== &lt;br /&gt;
Elektronikbaukästen bieten die Möglichkeit, das was man gelernt hat, gleich praktisch anzuwenden. Sie beinhalten die notwendigen Bauteile und sind oft didaktisch sinnvoll aufgebaut.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Kosmos XN&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;XN1000&#039;&#039;&#039; Bereits für Kinder geeignet. Prof. Armstrong und der kleine Roboter Robert führen spielend in die Welt der Elektronik ein.&lt;br /&gt;
** &#039;&#039;&#039;XN2000&#039;&#039;&#039; Die Erweiterung. &lt;br /&gt;
** &#039;&#039;&#039;XN3000&#039;&#039;&#039; Nicht mehr auf Kinder, sondern auf Jugendliche ausgerichtet. Relativ anspruchsvoll, aber verständlich.   &lt;br /&gt;
** &#039;&#039;Nachteil:&#039;&#039; relativ teuer&lt;br /&gt;
*&#039;&#039;&#039;Busch-Elektronik-Kästen (Conrad)&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Nachteil:&#039;&#039; Weil die Bauteile auf kleinen Platten befestigt sind, kann man mit ihnen keine eigenen Schaltungen aufbauen.&lt;br /&gt;
*&#039;&#039;&#039;Polytronic A B C ... (ex. DDR)&#039;&#039;&#039; aber nicht um jeden Preis im Kaufhaus kaufen - also Vorstufe zum Steckbrett&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Elektronik 2006 (amazon)&#039;&#039;&#039;  Sehr gut geeignet, da echte ungesockelte Bauelemente die überall nachgekauft werden können.&lt;br /&gt;
**&#039;&#039;Nachteil:&#039;&#039; Steckbrett wird schnell &amp;quot;zu klein&amp;quot;&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Elektronik mit ICs (Franzis)&#039;&#039;&#039;  Ausgezeichnetes Lernpaket für Theorie und Praxis: &#039;&#039;&#039;[http://www.franzis.de/elo-das-magazin/literatur-und-software/experimente/lernpaket-elektronik-mit-ics Lernpaket Elektronik mit ICs]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Besonders schön:&#039;&#039; Es liegt ein großes Breadboard bei&lt;br /&gt;
**&#039;&#039;Und dazu:&#039;&#039; Es werden nur kommerzielle Bauelemente eingesetzt, alles ist also nachbestellbar, Erweiterungen sind kein Problem.&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Sensortechnik (Franzis)&#039;&#039;&#039;  Hervorragendes Lernpaket für angewandte Sensorelektronik: &#039;&#039;&#039;[http://www.elo-web.de/elektronik-lernpakete/mechatronik/elektrotechnik-industrielle-elektronik/lernpaket-sensortechnik Lernpaket Sensortechnik]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Inhalt:&#039;&#039; Alle gängigen Sensoren, Opto-, Thermo-, Hall-Sensor etc.&lt;br /&gt;
**&#039;&#039;Weiterhin:&#039;&#039; Interessante ICs: LM386, 555, Bargraph-Treiber, LEDs etc. etc.&lt;br /&gt;
*&#039;&#039;&#039;NerdKit&#039;&#039;&#039; Steckbrett, AVR Microcontroller, LCD Screen, Temperatursensor, Piezo-Summer und weitere Bauteile. Interessante Projekte finden sich auf der &#039;&#039;&#039;[http://www.nerdkits.com/ Nerdkits Webseite]&#039;&#039;&#039;. &#039;&#039;Die Dokumentation ist englischsprachig.&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Einsteigerbox Elektronik I:&#039;&#039;&#039; &#039;&#039;&#039;[http://www.ehajo.de/starterkits/einsteigerbox-elektronik-1.html/eHaJo Link: Einsteigerbox von EhaJo]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Kleines aber gut durchdachtes Einsteigerpaket&#039;&#039; &lt;br /&gt;
**&#039;&#039;Inklusive hochwertigem Breadboard, Transistoren, Widerständen, Kondensatoren, Batterieclip etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Sinnvolles Wissen ==&lt;br /&gt;
* Es schadet nichts, wenn man das [http://de.wikipedia.org/wiki/Ohmsches_Gesetz  ohmsche Gesetz] und die [http://de.wikipedia.org/wiki/Kirchhoffsche_Regeln kirchhoffschen Regeln] kennt.&lt;br /&gt;
* [http://www.electronic-weblessons.de Electronic Weblessons] - Multimedial aufbereitetes Basiswissen zum Thema Elektronik in Form von WebLessons von Wis-Con (Multimedia, Sprache Deutsch)&lt;br /&gt;
* http://www.tldp.org/HOWTO/html_single/Coffee/ ;)&lt;br /&gt;
&lt;br /&gt;
== Was tun, wenn es brennt? ==&lt;br /&gt;
&lt;br /&gt;
Hier ist eine Liste der üblichen Anfängerfragen. Bitte überprüfe doch all diese Punkte. Falls Du zu einem der Punkte detaillierte Fragen hast, kannst Du Dich auch an die Experten im Forum wenden. Viel Glück bei der Suche!&lt;br /&gt;
*&#039;&#039;&#039;Anschlüsse vergessen&#039;&#039;&#039; Bevor Du die Schaltung das erste Mal an die Spannungsquelle hängst, überprüfe doch folgendes:&lt;br /&gt;
**&#039;&#039;&#039;VCC&#039;&#039;&#039; und &#039;&#039;&#039;GND&#039;&#039;&#039; Wurden die Bauteile mit der Versorgungsspannung verbunden? In aller Eile vergisst man dies leicht.&lt;br /&gt;
**&#039;&#039;&#039;Abblockkondensatoren&#039;&#039;&#039; Für sichere Funktion die Abblockkondensatoren (oft 100nF) nahe an den Pins anschließen. Sie sollen Störungen abfangen.&lt;br /&gt;
*&#039;&#039;&#039;Bauteile richtig herum eingesetzt?&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Wackelkontakt&#039;&#039;&#039; am Breadboard. Die Steckbretter haben leider häufig die Eigenschaft, dass die Kontakte nicht perfekt sind.&lt;br /&gt;
*&#039;&#039;&#039;korrekte Werte&#039;&#039;&#039; Gelegentlich liest man von Newbies, die etwas von 100µF am Quarz schreiben und sich ernsthaft wundern, weshalb nichts schwingt...&lt;br /&gt;
&lt;br /&gt;
===Probleme beim Mikrocontroller===&lt;br /&gt;
*&#039;&#039;&#039;Quarz schwingt nicht&#039;&#039;&#039;. Ein Anzeichen hierfür ist, wenn die Spannung zwischen XTAL1 und GND nicht ungefähr 1/2  VCC beträgt.&lt;br /&gt;
*&#039;&#039;&#039;Steckkontakte&#039;&#039;&#039; sind nicht ok -  Steckbretter haben manchmal schlechte Kontakte. Aus diesem Grund ist es sinnvoll, Mikrocontroller mit Sockel auf eine Platine zu löten.&lt;br /&gt;
*&#039;&#039;&#039;falsche Kondensatoren&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Bauteil beschädigt&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Weblinks ===&lt;br /&gt;
* [http://warmcat.com/milksop/prototypes.html Numbnut&#039;s guide to debugging prototypes] (engl.)&lt;br /&gt;
(Seite ist leider nicht mehr online und auch nicht in web.archive.org. Es gibt eine Kopie auf einer chinesischen Seite =&amp;gt; Selbersuchen)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
*&#039;&#039;&#039;http://www.csd-electronics.de&#039;&#039;&#039; Günstiger Anbieter, führt vieles, was man als Einsteiger braucht, dazu oft günstig. Versandkosten 3,85 bis 4,85 €.&lt;br /&gt;
*&#039;&#039;&#039;http://www.reichelt.de&#039;&#039;&#039; Mittel-günstiger Anbieter, führt leider nicht alles, was das Elektronikerherz begehrt. Der Grund hierfür ist, dass er sich hauptsächlich auf Mainstreamprodukte stützt, die einen großen Absatz finden. Nur so ist der günstige Preis möglich. Mindestbestellwert und Versandkosten nach Deutschland und Österreich sind gewichtabhängig, ab 5,60 oder 11,20 €.&lt;br /&gt;
* &#039;&#039;&#039;http://www.pollin.de&#039;&#039;&#039; Diverse Restposten, sehr günstige Preise aber keine große Auswahl an Standardbauteilen.&lt;br /&gt;
* &#039;&#039;&#039;http://www.conrad.de&#039;&#039;&#039; Filialen in vielen Städten, oft relativ hohe Preise - aber nicht immer. Vergleichen lohnt.&lt;br /&gt;
* &#039;&#039;&#039;http://www.ELV.de&#039;&#039;&#039; Versandkosten 6,95 € (inklusive Zustellgebühr)&lt;br /&gt;
* &#039;&#039;&#039;http://www.segor.de&#039;&#039;&#039; Hat manchmal Teile, die man bei Reichelt, Conrad nicht bekommt. Versandkosten 6,00 € (bei Kleinmengen jedoch 10,00 €)&lt;br /&gt;
* &#039;&#039;&#039;http://www.digikey.de&#039;&#039;&#039; Recht hohe Versandkosten dafür aber fast alles erhältlich auch in grossen Mengen. &lt;br /&gt;
* &#039;&#039;&#039;http://www.guloshop.de&#039;&#039;&#039; nur wenige Artikel, aber fast immer der günstigste Anbieter bei AVR-Standard-Mikrocontrollern. Versandkosten 2,40 bis 4,80 €.&lt;br /&gt;
* &#039;&#039;&#039;http://www.batterie24.de/Lithium-Batterien.html&#039;&#039;&#039; Für Schaltungen/Stromversorgung hochwertige Lithium-Batterien von Saft &amp;amp; Ultralife sowie FGS-Bleiakkus zu günstigen Preisen (z.B. 1 x Saft Lithium-Batterie LS14500 3,6V Mignon AA für 4,40 €).&lt;br /&gt;
&lt;br /&gt;
Der Artikel [[Elektronikversender]] zählt viele weitere Versender auf. Doch sollte man darauf achten, dass gerade sogenannte Distributoren in Deutschland normalerweise nicht an Privatleute verkaufen wollen (eine merkwürdige deutsche Spezialität) und mit Privatleuten auch mal sehr ruppig umgehen. Eine Ausnahme machen einige Distributoren für Studenten, da man sich so erhofft, frühzeitig Kontakt zu späteren gewerblichen Kunden zu bekommen. Eine andere Ausnahme sind normale Versender, die sich zusätzlich als Distributoren betätigen.&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99148</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99148"/>
		<updated>2018-04-30T18:32:41Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Beschreibung von Arduino aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board (mit z.B. einem AVR oder STM32 Prozessor) und einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Nucleo64 Boards&amp;lt;ref name=&amp;quot;NUCLEO64&amp;quot;&amp;gt;[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64&amp;lt;/ref&amp;gt; und Stm32 Discovery Boards&amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt; [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848]Stm32 Discovery&amp;lt;/ref&amp;gt; ab 15€&amp;lt;br&amp;gt;(incl. Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Uno clone ab 9€ || align=&amp;quot;center&amp;quot;| Microchip Demoboard&amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610] Microchip Demoboard&amp;lt;/ref&amp;gt; ab 18€&amp;lt;br&amp;gt;(Für 16 und 32bit auch mit integriertem Debugger)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | MSP430 Demoboard &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |Blue-Pill Board &amp;lt;ref name=&amp;quot;BLUEPILL&amp;quot;&amp;gt;[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board&amp;lt;/ref&amp;gt; ab 1,50€, S64DIL-405 &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405&amp;lt;/ref&amp;gt; mit STM32F405 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Nano clone ab 2€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PIC Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 1..15€&amp;lt;br&amp;gt;nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ST-Link clone 2,50€&amp;lt;br&amp;gt;ST-Link original 48€&amp;lt;br&amp;gt;Segger J-LINK EDU &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt; [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU&amp;lt;/ref&amp;gt; 50€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Atmel AVR Dragon 40€&amp;lt;br&amp;gt;Atmel ICE ohne Gehäuse ab 99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PICkit 3 clone 8€&amp;lt;br&amp;gt;Microchip PICkit 3 original 90€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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 Board von ST enthalten bereits einen ST-Link Adapter. Bei den Nucleo Boards ist er sogar abtrennbar und einzeln nutzbar.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* Anleitung: [[STM32 CooCox Installation]]&lt;br /&gt;
* Anleitung: [[STM32 Eclipse Installation]]&lt;br /&gt;
* Anleitung: [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] &lt;br /&gt;
* Diskussion: [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=99147</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=99147"/>
		<updated>2018-04-30T18:15:27Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Atollic TrueStudio aus der Liste der kommerziellen IDEs entfernt - ist so nicht mehr verfügbar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [https://gnu-mcu-eclipse.github.io/ GNU ARM Plug-in](Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#Fertige_GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
** [https://github.com/blacksphere/blackmagic/wiki Black Magic Probe] simuliert einen seriellen Port der direkt von gdb verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist der ultimative Compiler für denjenigen, der nur mal schnüffeln will. Doppelklick auf das gewünschte Board, Beispielprogramm (rechts am Rand auswählen), kompilieren und über USB hochladen. Schon blinkt es! Wenn man ein Projekt dann lieber doch lokal bearbeiten möchte (z.B. um einen Debugger zu benutzen) dann kann man die Projekte über die Export-Funktion herunterladen. Es werden verschiedene IDE sowie ein gcc-Kommandozeilenprojekt unterstützt. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com Atollic TrueStudio] wurde seit der Übernahme durch ST auf STM32 Mikrocontroller reduziert und kostenlos gemacht. Basiert auf Eclipse, OpenOCD und GCC. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC-Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse-basierten IDEs gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
* [[USB-Tutorial mit STM32]] enthält ein vollständiges Beispielprojekt&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (der Link funktioniert nicht mehr, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/ libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger&lt;br /&gt;
* [[USB-Tutorial mit STM32]]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=99146</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=99146"/>
		<updated>2018-04-30T18:14:16Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Beschreibung Atollic Studio aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [https://gnu-mcu-eclipse.github.io/ GNU ARM Plug-in](Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#Fertige_GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
** [https://github.com/blacksphere/blackmagic/wiki Black Magic Probe] simuliert einen seriellen Port der direkt von gdb verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist der ultimative Compiler für denjenigen, der nur mal schnüffeln will. Doppelklick auf das gewünschte Board, Beispielprogramm (rechts am Rand auswählen), kompilieren und über USB hochladen. Schon blinkt es! Wenn man ein Projekt dann lieber doch lokal bearbeiten möchte (z.B. um einen Debugger zu benutzen) dann kann man die Projekte über die Export-Funktion herunterladen. Es werden verschiedene IDE sowie ein gcc-Kommandozeilenprojekt unterstützt. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com Atollic TrueStudio] wurde seit der Übernahme durch ST auf STM32 Mikrocontroller reduziert und kostenlos gemacht. Basiert auf Eclipse, OpenOCD und GCC. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC-Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse-basierten IDEs gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic TrueStudio], auf Eclipse/GCC basierend. Aktuell ist V 5.4, diese hat kein Codesize Limit. Eingeschränkt sind Debug Optionen wie Variablen LiveWatch oder Tracing, was aber auch &#039;bessere&#039; Debugprobes erforderlich macht. Das Semihosting (printf über SWD/JTAG) fällt leider auch unter die Restriktionen der Lite Version. Atollic TrueStudio unterstützt viele verschiedene Hersteller von ARM MCUs, dadurch ist das Paket sehr umfangreich. In der Lite Version muss man sich beim Start für ein paar Sekunden einen Dialog mit dem Upgrade Angebot gefallen lassen.&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
* [[USB-Tutorial mit STM32]] enthält ein vollständiges Beispielprojekt&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (der Link funktioniert nicht mehr, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/ libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger&lt;br /&gt;
* [[USB-Tutorial mit STM32]]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99144</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99144"/>
		<updated>2018-04-30T18:11:46Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Link Liste aktualisiert, Link zur veralteten Diskussion entfernt, Link zu Off-Topic LPC Seiten entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Nucleo64 Boards&amp;lt;ref name=&amp;quot;NUCLEO64&amp;quot;&amp;gt;[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64&amp;lt;/ref&amp;gt; und Stm32 Discovery Boards&amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt; [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848]Stm32 Discovery&amp;lt;/ref&amp;gt; ab 15€&amp;lt;br&amp;gt;(incl. Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Uno clone ab 9€ || align=&amp;quot;center&amp;quot;| Microchip Demoboard&amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610] Microchip Demoboard&amp;lt;/ref&amp;gt; ab 18€&amp;lt;br&amp;gt;(Für 16 und 32bit auch mit integriertem Debugger)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | MSP430 Demoboard &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |Blue-Pill Board &amp;lt;ref name=&amp;quot;BLUEPILL&amp;quot;&amp;gt;[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board&amp;lt;/ref&amp;gt; ab 1,50€, S64DIL-405 &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405&amp;lt;/ref&amp;gt; mit STM32F405 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Nano clone ab 2€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PIC Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 1..15€&amp;lt;br&amp;gt;nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ST-Link clone 2,50€&amp;lt;br&amp;gt;ST-Link original 48€&amp;lt;br&amp;gt;Segger J-LINK EDU &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt; [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU&amp;lt;/ref&amp;gt; 50€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Atmel AVR Dragon 40€&amp;lt;br&amp;gt;Atmel ICE ohne Gehäuse ab 99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PICkit 3 clone 8€&amp;lt;br&amp;gt;Microchip PICkit 3 original 90€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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 Board von ST enthalten bereits einen ST-Link Adapter. Bei den Nucleo Boards ist er sogar abtrennbar und einzeln nutzbar.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* Anleitung: [[STM32 CooCox Installation]]&lt;br /&gt;
* Anleitung: [[STM32 Eclipse Installation]]&lt;br /&gt;
* Anleitung: [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] &lt;br /&gt;
* Diskussion: [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99142</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99142"/>
		<updated>2018-04-30T18:09:18Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Anfängerfragen überarbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Nucleo64 Boards&amp;lt;ref name=&amp;quot;NUCLEO64&amp;quot;&amp;gt;[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64&amp;lt;/ref&amp;gt; und Stm32 Discovery Boards&amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt; [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848]Stm32 Discovery&amp;lt;/ref&amp;gt; ab 15€&amp;lt;br&amp;gt;(incl. Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Uno clone ab 9€ || align=&amp;quot;center&amp;quot;| Microchip Demoboard&amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610] Microchip Demoboard&amp;lt;/ref&amp;gt; ab 18€&amp;lt;br&amp;gt;(Für 16 und 32bit auch mit integriertem Debugger)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | MSP430 Demoboard &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |Blue-Pill Board &amp;lt;ref name=&amp;quot;BLUEPILL&amp;quot;&amp;gt;[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board&amp;lt;/ref&amp;gt; ab 1,50€, S64DIL-405 &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405&amp;lt;/ref&amp;gt; mit STM32F405 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Nano clone ab 2€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PIC Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 1..15€&amp;lt;br&amp;gt;nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ST-Link clone 2,50€&amp;lt;br&amp;gt;ST-Link original 48€&amp;lt;br&amp;gt;Segger J-LINK EDU &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt; [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU&amp;lt;/ref&amp;gt; 50€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Atmel AVR Dragon 40€&amp;lt;br&amp;gt;Atmel ICE ohne Gehäuse ab 99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PICkit 3 clone 8€&amp;lt;br&amp;gt;Microchip PICkit 3 original 90€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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 Board von ST enthalten bereits einen ST-Link Adapter. Bei den Nucleo Boards ist er sogar abtrennbar und einzeln nutzbar.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99140</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99140"/>
		<updated>2018-04-30T18:04:09Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Off-topic links zu AVR, PIC und MSP430 Artikeln entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Nucleo64 Boards&amp;lt;ref name=&amp;quot;NUCLEO64&amp;quot;&amp;gt;[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64&amp;lt;/ref&amp;gt; und Stm32 Discovery Boards&amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt; [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848]Stm32 Discovery&amp;lt;/ref&amp;gt; ab 15€&amp;lt;br&amp;gt;(incl. Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Uno clone ab 9€ || align=&amp;quot;center&amp;quot;| Microchip Demoboard&amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610] Microchip Demoboard&amp;lt;/ref&amp;gt; ab 18€&amp;lt;br&amp;gt;(Für 16 und 32bit auch mit integriertem Debugger)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | MSP430 Demoboard &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |Blue-Pill Board &amp;lt;ref name=&amp;quot;BLUEPILL&amp;quot;&amp;gt;[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board&amp;lt;/ref&amp;gt; ab 1,50€, S64DIL-405 &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405&amp;lt;/ref&amp;gt; mit STM32F405 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Nano clone ab 2€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PIC Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 1..15€&amp;lt;br&amp;gt;nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ST-Link clone 2,50€&amp;lt;br&amp;gt;ST-Link original 48€&amp;lt;br&amp;gt;Segger J-LINK EDU &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt; [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU&amp;lt;/ref&amp;gt; 50€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Atmel AVR Dragon 40€&amp;lt;br&amp;gt;Atmel ICE ohne Gehäuse ab 99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PICkit 3 clone 8€&amp;lt;br&amp;gt;Microchip PICkit 3 original 90€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Anmerkung von stefanus: Alle STM32 Mikrocontroller, sowie alle aktuellen Discovery und Nucleo Boards haben eine SWD Schnittstelle und enthalten einen ST-Link Adapter, mit dem man programmieren und debuggen kann. Die JTAG Schnittstelle betrachte ich als optionales Feature. Man muss sie NICHT verwenden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99139</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99139"/>
		<updated>2018-04-30T18:00:47Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Auflistung der Demo Boards und Programmieradapter aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Nucleo64 Boards&amp;lt;ref name=&amp;quot;NUCLEO64&amp;quot;&amp;gt;[https://www.mouser.de/new/stmicroelectronics/stm-nucleo-development-boards/] Nucleo64&amp;lt;/ref&amp;gt; und Stm32 Discovery Boards&amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt; [http://www.st.com/en/evaluation-tools/stm32-mcu-discovery-kits.html?querycriteria=productId=LN1848]Stm32 Discovery&amp;lt;/ref&amp;gt; ab 15€&amp;lt;br&amp;gt;(incl. Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Uno clone ab 9€ || align=&amp;quot;center&amp;quot;| Microchip Demoboard&amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610] Microchip Demoboard&amp;lt;/ref&amp;gt; ab 18€&amp;lt;br&amp;gt;(Für 16 und 32bit auch mit integriertem Debugger)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | MSP430 Demoboard &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739] MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |Blue-Pill Board &amp;lt;ref name=&amp;quot;BLUEPILL&amp;quot;&amp;gt;[http://wiki.stm32duino.com/index.php?title=Blue_Pill] Blue-Pill Board&amp;lt;/ref&amp;gt; ab 1,50€, S64DIL-405 &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm] S64DIL-405&amp;lt;/ref&amp;gt; mit STM32F405 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | [[Arduino]] Nano clone ab 2€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PIC Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 1..15€&amp;lt;br&amp;gt;nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5..15€&amp;lt;br&amp;gt;SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ST-Link clone 2,50€&amp;lt;br&amp;gt;ST-Link original 48€&amp;lt;br&amp;gt;Segger J-LINK EDU &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt; [http://www.segger.com/j-link-edu.html] Segger J-LINK EDU&amp;lt;/ref&amp;gt; 50€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Atmel AVR Dragon 40€&amp;lt;br&amp;gt;Atmel ICE ohne Gehäuse ab 99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | PICkit 3 clone 8€&amp;lt;br&amp;gt;Microchip PICkit 3 original 90€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Anmerkung von stefanus: Alle STM32 Mikrocontroller, sowie alle aktuellen Discovery und Nucleo Boards haben eine SWD Schnittstelle und enthalten einen ST-Link Adapter, mit dem man programmieren und debuggen kann. Die JTAG Schnittstelle betrachte ich als optionales Feature. Man muss sie NICHT verwenden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99138</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99138"/>
		<updated>2018-04-30T17:18:59Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Unwichtige Randbedingungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* zu 90% reicht doch ein kleiner Prozessor ([[AVR]]/PIC), andererseits sind STM32 Modelle nicht wesentlich teurer.&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 ab 1,50€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ein Programmieradapter sollte unbedingt auch einen Debugger beinhalten. Denn für den Start ist es ungemein hilfreich zu sehen was im Prozessor gerade geschieht. Sowohl SWD (ST-Link) als auch JTAG-Adapter für einen [[STM32]] Prozessor sind alle Debugger-Tauglich. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Anmerkung von stefanus: Alle STM32 Mikrocontroller, sowie alle aktuellen Discovery und Nucleo Boards haben eine SWD Schnittstelle und enthalten einen ST-Link Adapter, mit dem man programmieren und debuggen kann. Die JTAG Schnittstelle betrachte ich als optionales Feature. Man muss sie NICHT verwenden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99137</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99137"/>
		<updated>2018-04-30T17:16:32Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Veraltete Tabelle zu Entwicklungsumgebungen durch eine neue Auflistung ersetzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* 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?&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 ab 1,50€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ein Programmieradapter sollte unbedingt auch einen Debugger beinhalten. Denn für den Start ist es ungemein hilfreich zu sehen was im Prozessor gerade geschieht. Sowohl SWD (ST-Link) als auch JTAG-Adapter für einen [[STM32]] Prozessor sind alle Debugger-Tauglich. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
Die [http://www.coocox.org/CooCox_CoIDE.htm CooCox] IDE gilt inzwischen als veraltet. Die [http://www.coocox.org/CooCox_CoIDE.htm Installationsanleitung für CooCox] beschreibt, wie man innerhalb einer Stunde die LED eines Nagel neuen STM32F4DISCOVERY Boards zum blinken bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Firma ST hat bis Ende 2017 für die kostenlose IDE [http://www.openstm32.org/HomePage System Workbench] geworben. Seit Januar 2018 ist das [https://atollic.com/ TrueStudio] ebenfalls kostenlos geworden, nachdem ST es aufgekauft hat. &lt;br /&gt;
&lt;br /&gt;
Die System Workbench und das True Studio sind sich sehr ähnlich. Beide basieren auf Eclipse, OpenOCD und GCC. Beide laufen unter Linux und Windows. True Studio kann Projekte von der System Workbench übernehmen, anders herum geht es jedoch nicht. Beide Entwicklungsumgebungen werden von ST weiterhin unterstützt. Beide haben den Nachteil, ausschließlich STM32 Controller zu unterstützen. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Anmerkung von stefanus: Alle STM32 Mikrocontroller, sowie alle aktuellen Discovery und Nucleo Boards haben eine SWD Schnittstelle und enthalten einen ST-Link Adapter, mit dem man programmieren und debuggen kann. Die JTAG Schnittstelle betrachte ich als optionales Feature. Man muss sie NICHT verwenden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99136</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99136"/>
		<updated>2018-04-30T17:00:03Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Sinnloser Bezug zu AVR Demo-Board entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* 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?&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 ab 1,50€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ein Programmieradapter sollte unbedingt auch einen Debugger beinhalten. Denn für den Start ist es ungemein hilfreich zu sehen was im Prozessor gerade geschieht. Sowohl SWD (ST-Link) als auch JTAG-Adapter für einen [[STM32]] Prozessor sind alle Debugger-Tauglich. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Betriebssystem || [[STM32]] || [[AVR]] || [[PIC]] || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Windows &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.coocox.org/CooCox_CoIDE.htm CooCox, EmBitz, Eclipse] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|Atmel-Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| Linux&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|z.B. [http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| MacOS&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|??&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* [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.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Anmerkung von stefanus: Alle STM32 Mikrocontroller, sowie alle aktuellen Discovery und Nucleo Boards haben eine SWD Schnittstelle und enthalten einen ST-Link Adapter, mit dem man programmieren und debuggen kann. Die JTAG Schnittstelle betrachte ich als optionales Feature. Man muss sie NICHT verwenden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99135</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99135"/>
		<updated>2018-04-30T16:58:53Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Angaben zum Debugger korrigiert und off-topic Kommentare zu AVR Programmieradapter entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* 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?&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 ab 1,50€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ein Programmieradapter sollte unbedingt auch einen Debugger beinhalten. Denn für den Start ist es ungemein hilfreich zu sehen was im Prozessor gerade geschieht. Sowohl SWD (ST-Link) als auch JTAG-Adapter für einen [[STM32]] Prozessor sind alle Debugger-Tauglich. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Betriebssystem || [[STM32]] || [[AVR]] || [[PIC]] || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Windows &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.coocox.org/CooCox_CoIDE.htm CooCox, EmBitz, Eclipse] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|Atmel-Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| Linux&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|z.B. [http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| MacOS&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|??&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* [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.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Anmerkung von stefanus: Alle STM32 Mikrocontroller, sowie alle aktuellen Discovery und Nucleo Boards haben eine SWD Schnittstelle und enthalten einen ST-Link Adapter, mit dem man programmieren und debuggen kann. Die JTAG Schnittstelle betrachte ich als optionales Feature. Man muss sie NICHT verwenden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99134</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99134"/>
		<updated>2018-04-30T16:56:12Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* FAQ - Anfängerfragen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* 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?&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 ab 1,50€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Betriebssystem || [[STM32]] || [[AVR]] || [[PIC]] || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Windows &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.coocox.org/CooCox_CoIDE.htm CooCox, EmBitz, Eclipse] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|Atmel-Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| Linux&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|z.B. [http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| MacOS&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|??&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* [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.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Anmerkung von stefanus: Alle STM32 Mikrocontroller, sowie alle aktuellen Discovery und Nucleo Boards haben eine SWD Schnittstelle und enthalten einen ST-Link Adapter, mit dem man programmieren und debuggen kann. Die JTAG Schnittstelle betrachte ich als optionales Feature. Man muss sie NICHT verwenden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99133</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=99133"/>
		<updated>2018-04-30T16:52:08Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks, Foren, Communities, Tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* 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?&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 ab 1,50€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Betriebssystem || [[STM32]] || [[AVR]] || [[PIC]] || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Windows &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.coocox.org/CooCox_CoIDE.htm CooCox, EmBitz, Eclipse] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|Atmel-Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| Linux&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|z.B. [http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| MacOS&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|??&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* [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.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie und ein kleines Buch für den Einstieg] (deutlich aktueller als dieser Artikel)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=97777</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=97777"/>
		<updated>2017-11-23T19:50:44Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Link zu meinem Buch hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
Der GCC (in seinen verschiedenen Binärdistributionen) ist der einzige ARM Compiler der [http://de.wikipedia.org/wiki/C%2B%2B11 C++11] unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [http://gnuarmeclipse.livius.net/blog/ GNU ARM Plug-in] (Bei Verwendung vom GCC-ARM-Embedded als Toolchain &amp;quot;Sourcery G++ Lite&amp;quot; auswählen, dieser sieht für eclipse gleich aus) (Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist der ultimative Compiler für denjenigen, der nur mal schnüffeln will. Doppelklick auf das gewünschte Board, Beispielprogramm (rechts am Rand auswählen), kompilieren und über USB hochladen. Schon blinkt es! Wenn man ein Projekt dann lieber doch lokal bearbeiten möchte (z.B. um einen Debugger zu benutzen) dann kann man die Projekte über die Export-Funktion herunterladen. Es werden verschiedene IDE sowie ein gcc-Kommandozeilenprojekt unterstützt. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com/pricing/ Atollic TrueStudio Lite] ist eine kostenlose Entwicklungsumgebung für &amp;gt;2800 ARM Prozessoren/µCs mit integrierter Eclipse-IDE und C/C++ Compiler und Debugger. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC-Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse-basierten IDEs gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic TrueStudio], auf Eclipse/GCC basierend. Aktuell ist V 5.4, diese hat kein Codesize Limit. Eingeschränkt sind Debug Optionen wie Variablen LiveWatch oder Tracing, was aber auch &#039;bessere&#039; Debugprobes erforderlich macht. Das Semihosting (printf über SWD/JTAG) fällt leider auch unter die Restriktionen der Lite Version. Atollic TrueStudio unterstützt viele verschiedene Hersteller von ARM MCUs, dadurch ist das Paket sehr umfangreich. In der Lite Version muss man sich beim Start für ein paar Sekunden einen Dialog mit dem Upgrade Angebot gefallen lassen.&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* Der [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2] ist ein Debugger, welcher von ST selbst angeboten wird. Jedes STM32 Discovery- oder Nucleo-Board hat einen ST-LINK V2 bzw. ST-Link V2-1 für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware und prinzipiell auch andere Cortex-M benutzt werden kann. Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Die ST-LINK-Variante auf den Nucleo- bzw. Discovery-Boards beherrscht nur SWD und kein JTAG, wohingegen der ST-Link in der Adapterversion mit Gehäuse auch JTAG beherrscht und zusätzlich auch in einer Variante mit galvanischer Trennung erhältlich ist. Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können auch per Softwareupdate zu einem J-Link OB umgewandelt werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier]. Kopien des ST-Link V2 sind als &amp;quot;mini&amp;quot;-Version u.a. sehr günstig (&amp;lt;5€) über Ebay, Aliexpress und Co zu beziehen. Diese unterstützen jedoch ebenfalls kein JTAG und haben desweiteren den Nachteil, das der Reset-Pin nicht herausgeführt ist bzw. der mit &amp;quot;Reset&amp;quot; bezeichnete Pin nur für STM8 gedacht ist. Sämtliche ST-Link V2 und V2/1 können mittels einer von ST angebotenen [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Update-Software ] auf den jeweils neuesten Stand gebracht werden.&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 10000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (der Link funktioniert nicht mehr, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [https://www.tme.eu/de/katalog/st-mikrocontroller_112866/ TME] &lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
* [http://www.mouser.de/STMicroelectronics/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/ARM-Microcontrollers-MCU/_/N-a85pc?P=1z0zpefZ1yzud1pZ1yzmxr3Z1yzud8sZ1yztkjiZ1yzonn5Z1yznfad&amp;amp;FS=True Mouser]&lt;br /&gt;
* [https://www.conrad.de/de/embedded-mikrocontroller-o0214046.html Conrad]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [https://www.conrad.de/de/stmicroelectronics-entwicklungs-kits-o0214062.html diverse Nucleo- und Discovery-Boards bei Conrad]&lt;br /&gt;
* [https://www.reichelt.de/Einplatinen-Microcontroller/2/index.html?ACTION=2&amp;amp;LA=3&amp;amp;GROUPID=6667 diverse Nucleo-Boards bei Reichelt]&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;keywords=STM32&amp;amp;cat=40&amp;amp;subkat=on&amp;amp;mnf=&amp;amp;sdesc=on&amp;amp;desc=on&amp;amp;x=79&amp;amp;y=19 STM32 bei Watterott (unter anderem Olimex- und Nucleo-Boards)]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/ST/ STM32-Boards direkt bei Olimex]&lt;br /&gt;
* [http://shop.myavr.de/Hardware.htm?sp=artlist_kat.sp.php&amp;amp;katID=51 verschiedene STM32-Boards myAVR]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://community.st.com/ Forum auf der ST Homepage] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial für Standard Peripheral Library in Deutsch]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/wiki/Main_Page libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
* [https://www.cs.indiana.edu/~geobrown/book.pdf &amp;quot;Discovering the STM32 Microcontroller&amp;quot; eBook (kostenlos)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] &#039;&#039;&#039;PDF&#039;&#039;&#039;, Programmieranleitung für Anfänger&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Linksammlung&amp;diff=97742</id>
		<title>Linksammlung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Linksammlung&amp;diff=97742"/>
		<updated>2017-11-19T17:34:31Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Tutorials und Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite werden Links zu anderen interessanten Mikrocontroller- und Elektronikseiten gesammelt. Die alte Linkseite findet man [http://www.mikrocontroller.net/en/links hier].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: diese Liste wird nicht mehr aktiv gepflegt. Viele der Links sind leider mittlerweile ungültig.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hinzufügen von Links:&lt;br /&gt;
# [http://www.mikrocontroller.net/wikisoftware/index.php?title=Linksammlung&amp;amp;action=edit Bearbeiten] anklicken&lt;br /&gt;
# Link unter der entsprechenden Kategorie eintragen&lt;br /&gt;
# &amp;quot;Artikel speichern&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
== Suchen &amp;amp; Finden ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Verkauf einem hungrigen Mann einen Fisch und du hast ein Geschäft gemacht, bring ihm das Angeln bei und du hast einen Kunden verloren! (asmo)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://www.supplyframe.com/ SupplyFrame] - Datasheet and Electronic Spec Search Engine&lt;br /&gt;
* [http://www.globalspec.com/ GlobalSpec] - The Engineering Search Engine&lt;br /&gt;
* [http://www.alldatasheet.com/ alldatasheet] - Datasheet Search&lt;br /&gt;
* [http://www.datasheetarchive.com/ datasheetarchive] - Datasheet Search&lt;br /&gt;
* [http://www.datasheetcatalog.com/ datasheetcatalog] - Datasheet Search&lt;br /&gt;
* [http://www.msarnoff.org/chipdb/ ChipDB] - Pinouts von gängigen µCs.&lt;br /&gt;
* [http://www.dcdcselector.com/de/] - Parametrische Produkt Suche für Analog IC&lt;br /&gt;
&amp;lt;!-- SPAM&lt;br /&gt;
* [http://www.TechTour.net] - Angebote und Technische Beratung von mehreren Anbietern gleichzeitig einholen. Von der Elektronik Entwicklung über Leiterplatten Bestückung, von Leiterplatten über Folientastaturen, Gehäusen bis zur Kabelkonfektion.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[AVR]] ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/products/avr/ Atmel.com] Herstellerseiten&lt;br /&gt;
* [http://www.atmel.com/dyn/products/product_whatchanged.asp?category_id=163&amp;amp;family_id=607 Atmel.com updates] Liste der letzten Änderungen in Datenblättern und Beispielcode für AVR(8) und AVR32&lt;br /&gt;
* [http://www.msc-ge.com/de/produkte/elekom/mc/atmel/avr_start.html AVR Produktinfos] AVR Infos vom Atmel Distributor MSC Vertriebs GmbH&lt;br /&gt;
* [http://www.siebert-group.com/ Siebert Group] Siebert Group Industrie Electronik&lt;br /&gt;
&lt;br /&gt;
=== Information (Foren, Mailinglisten, Linksammlungen) ===&lt;br /&gt;
* [http://progforum.com Batronix Elektronik Forum] Gut besuchtes Forum für allgemeine Elektronik, Mikrocontroller und Programmierung&lt;br /&gt;
* [http://www.avrfreaks.net/ AVR Freaks] AVR Forum, Samples, Tutorials, User-Projekte, GCC für AVR (Registrierung empfohlen)&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.mikrocontroller.net Mikrocontroller.net] - AVR Tutorials, Examples, LINKS, Forum (D)&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://www.openavr.org/ Openavr.org] &amp;quot;central repository of information for the various open source tools available for the development of software for Atmel&#039;s AVR family of 8-bit RISC microcontrollers&amp;quot;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://www.omegav.ntnu.no/avr/resources.php3 Omega V&#039;s AVR Resource List]&lt;br /&gt;
* [http://www.omegav.ntnu.no/avr/newresources.php3 Omega V&#039;s AVR NEW Resource List]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [http://www.ipass.net/hammill/newavr.htm Atmel AVR Embedded Microcontroller Resources]&lt;br /&gt;
* [http://members.tripod.com/Stelios_Cellar/AVR/AVR%20Info.html Stelios Cellar Atmel AVR Info Page] - Samples, Links&lt;br /&gt;
* [http://www.elektronik-projekt.de Elektronik Projekt] - Hauptthemen sind AVR und Roboter&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://www.microschematic.com/ AVR Microcontroller inside] (nett gemacht, Engl. Seite am 07-09-2008 nicht erreichbar)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://electrons.psychogenic.com/avr/ Intro To AVR Microcontrollers] (noch(?) sehr wenig Information)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [http://popularmicrocontrollers.com/ AVR Microcontrollers] - A web site about AVR microcontrollers&lt;br /&gt;
&amp;lt;!-- Dieser Unterabschnitt ist für AVR. Für PIC gibt es einen eigenen Unterabschnitt weiter unten. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungswerkzeuge (Compiler/Assembler/Debugger/Tools/Libraries) ===&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
* [http://sourceforge.net/projects/winavr WinAVR] (pronounced &amp;quot;whenever&amp;quot;) is a suite of executable, open source software development tools for the Atmel AVR series [for the] Windows platform&amp;quot; (includes GNU GCC) &lt;br /&gt;
* [http://sourceforge.net/projects/kontrollerlab KontrollerLab] is a free GPL open-source development environment based on KDE, using the avr-gcc, UISP and AVRDUDE&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/ avr-libc] avr-gcc&#039;s &amp;quot;standard&amp;quot;-library&lt;br /&gt;
&amp;lt;!-- * [http://hubbard.engr.scu.edu/embedded/avr/avrlib/ Procyon AVRlib] a lot of device drivers and Visual-Studio link for avr-gcc --&amp;gt;&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib/ Procyon AVRlib] a lot of device drivers and Visual-Studio link for avr-gcc&lt;br /&gt;
* [http://rod.info/avr.html rod.info on AVR] esp. for AVR GNU development tools setup under Linux&lt;br /&gt;
* [http://www.sisy.de SiSy AVR] - graphische Entwicklungsumgebung mit C/C++ Codegenerierung aus Struktogrammen und Klassendiagrammen&lt;br /&gt;
* [http://shop.embedit.de/product__206.php AtmanAVR C/C++ IDE]&lt;br /&gt;
* [http://www.iar.com IAR Embedded Workbench]&lt;br /&gt;
* [http://www.hpinfotech.com CodeVisionAVR] C-Compiler für AVRs mit Terminal&lt;br /&gt;
* [http://www.myAVR.de myAVRWorkpad] kompakte Entwicklungsumgebung für AVRs mit Terminal&lt;br /&gt;
* [http://www.amctools.com/vmlab.htm VMLab] komplette IDE mit Debugger und Simulator (auch Peripheriehardware)&lt;br /&gt;
* [http://www.forestmoon.com/Software/AvrIoDesigner/ AVR IO Designer] is a utility to generate initialization source code in C/C++ for the various devices, ports and registers of Atmel AVR processors. The intent is to allow the user to explore the devices specific to a selected processor and experiment with settings thru a user interface that assists in understanding the complexities involved. The user can also assign custom variable names to PORT IO pins thereby keeping track of the IO resources in use. These names are emitted in the generated code for use in the user’s program. (Windows .NET 2.0 erforderlich)&lt;br /&gt;
* [http://www.piconomic.co.za/avrlib/index.html Piconomic AVRLIB] is a collection of firmware for Atmel AVR microcontrollers. The aim is to share source code, experience and expertise (in the eye of the beholder) with the community of engineers, scientists and enthusiasts.&lt;br /&gt;
* [http://www.imagecraft.com/devtools_AVR.html Imagecraft] Der ICCAVR C Compiler fuer AVR von Imagecraft.&lt;br /&gt;
&lt;br /&gt;
==== Assembler ====&lt;br /&gt;
&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.tavrasm.org/ tavrasm] - Toms Linux (Atmel) AVR Assembler&lt;br /&gt;
* [http://www.avr-asm-tutorial.net/gavrasm/index_de.html gavrasm] - Gerds Linux/Win/DOS AVR Assembler &lt;br /&gt;
* [http://avra.sourceforge.net/ avra] - avra ATMEL AVR Assembler für Linux, FreeBSD, AmigaOS und Win32&lt;br /&gt;
* [http://algrom.net/english.html Algorithm Builder] - graphische Makro-Assembler Entwicklungsumgebung&lt;br /&gt;
* [http://www.sisy.de SiSy AVR] - graphische Entwicklungsumgebung mit Assembler Codegenerierung aus Programmablaufplänen&lt;br /&gt;
* [http://www.sbprojects.com/sbasm/sbasm.htm SB-Assembler] - Freeware Cross-Assembler unter DOS. (6502, 6800, 6801, 6804, 6805, 6809, 68HC08, 68HC11, Z8, Z80, Z180, 8080, 8085, 8021, 8041, 8048, 8051, AVR, PIC1684,...)&lt;br /&gt;
* [http://www.myAVR.de myAVRWorkpad] kompakte Entwicklungsumgebung für AVRs mit Terminal&lt;br /&gt;
* [http://john.ccac.rwth-aachen.de:8000/as/ Macro Assembler AS] - AS is a portable macro cross assembler for a variety of microprocessors and -controllers&lt;br /&gt;
* [http://shop-pdp.kent.edu/ashtml/asxxxx.htm ASxxxx Cross Assemblers] - The ASxxxx assemblers are a series of microprocessor assemblers written in the C programming language. (1802, S2650, C/MP, MSP430, 61860, 6500, 6800(6802/6808), 6801(6803/HD6303), 6804, 6805, 68HC(S)08, 6809, 68HC11, 68HC(S)12, 68HC16, 740, 8048(8041/8022/8021) 8051, 8085(8080), DS8xCxxx, AVR, Z80, F2MC8L/FX, GameBoy(Z80), H8/3xx, Cypress PSoC(M8C), PIC, Rabbit 2000/3000, Z8, Z80(HD64180)) linux &amp;amp; windows, source code&lt;br /&gt;
* [http://www.i8086.de/asm/8086-88-asm.html 8086/88 Assembler Befehlsreferenz] - Informationen zum Befehlssatz, Registern und Speicheradressierung&lt;br /&gt;
&lt;br /&gt;
==== Disassembler ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.datarescue.com/idabase/ IDA-Pro] -Disassembler und Debugger für fast alle bekannten Prozessoren. Evaluation Version verfügbar. Tagline: &#039;&#039;The most advanced tool for Hostile Code Analysis, Vulnerability and Software Reverse Engineering&#039;&#039;&lt;br /&gt;
* [http://www.jassenbaum.de/ja-tools/ ReAVR] - Disassembler und ACXutility Binary Tool&lt;br /&gt;
* [http://www.visi.com/~dwinker/revava/ revava] - Disassembler&lt;br /&gt;
* [http://dev.frozeneskimo.com/software_projects/vavrdisasm vAVRdisasm] - Free AVR Disassembler&lt;br /&gt;
* [http://www.johannes-bauer.com/mcus/avrdisas/ avrdisas] - AVR Mikrocontroller Disassembler für Linux (und Win32)&lt;br /&gt;
&amp;lt;!-- * [http://biew.sourceforge.net/en/biew.html BVIEW] is multiplatform portable viewer of binary files with built-in editor in binary, hexadecimal and disassembler modes. It includes &#039;&#039;&#039;AVR&#039;&#039;&#039;/Java/i86-i386-AMD64/ARM-XScale/PPC64 disassemblers, russian codepages convertor, full preview of formats - MZ, NE, PE, NLM, coff32, elf partial - a.out, LE, LX, PharLap; code navigator and more over. (GPL) - 404, 6.9.2010 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BASIC ====&lt;br /&gt;
* [http://www.mcselec.com/bascom-avr.htm Bascom AVR]&lt;br /&gt;
* [http://www.fastavr.com FastAVR] - und mit &#039;ASM&#039; Ausgabe, Nokia3310 LCD Unterstützung&lt;br /&gt;
* [http://www.nettypes.de/mbasic mikrocontrollerBASIC Freeware] - mit Simulator für ATmega32, ATmega128 und C-CONTROL.&lt;br /&gt;
* [http://www.mikroe.com/en/compilers/mikrobasic/avr/ mikroBasic] - Comprehensive, stand-alone Basic compiler for AVR microcontrollers&lt;br /&gt;
* [http://home.arcor.de/EDAconsult/Page3/index.html?c~3.1 MCS BASIC-52] - Original-Übersetzung 1988 INTEL MCS BASIC-52 USERS MANUAL 220 Seiten frei Download als PDF&lt;br /&gt;
* [http://www.DieProjektseite.de Beetle-Basic] Leistungsfähiges Basic-Betriebssystem im AVR.&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR_BASIC AVR_BASIC] Open Source Freeware: Minimalistischer Basic-Interpreter  im AVR.&lt;br /&gt;
* [http://gcbasic.sourceforge.net/ Great Cow BASIC] &amp;quot;Open Source BASIC programming tools for Microchip PIC and Atmel AVR microcontrollers&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Pascal ====&lt;br /&gt;
* [http://www.e-lab.de AVRco Pascal Compiler] - AVR Pascal Compiler mit umfangreicher Funktionslibrary&lt;br /&gt;
* [http://www.mikroe.com/en/compilers/mikropascal/avr/ mikroPascal] - Comprehensive, stand-alone Pascal compiler for AVR microcontrollers&lt;br /&gt;
&lt;br /&gt;
==== Forth ====&lt;br /&gt;
* [http://www.robo-forth.de www.robo-forth.de] - AVR Forth Compiler mit umfangreicher Funktionslibrary für Servos, Motore und Sensoren&lt;br /&gt;
* [http://amforth.sourceforge.net/ amforth] - Forth for Atmel ATmega micro controllers von Matthias Trute. [http://www.mikrocontroller.net/topic/55807#430816 Diskussion]&lt;br /&gt;
&lt;br /&gt;
==== Java ====&lt;br /&gt;
* [http://www.harbaum.org/till/nanovm NanoVM] - Java VM für AVR-Mikrocontroller ([[NanoVM|deutsches Wiki]])&lt;br /&gt;
* [http://www.fam-frenz.de/stefan/compiler.html SJC] - Java-Compiler (erzeugt AVR-Maschinencode) für AVR-Mikrocontroller ([[SJC]])&lt;br /&gt;
&lt;br /&gt;
==== Ada ====&lt;br /&gt;
* [http://avr-ada.sourceforge.net/ AVR-Ada] - Ada Compiler innerhalb von GCC (GNAT) für AVR.  Enthält eine kleine Laufzeitbibliothek ohne Tasking und ohne Exceptions. [http://www.mikrocontroller.net/topic/168823#1614208]&lt;br /&gt;
&lt;br /&gt;
==== Virgil ====&lt;br /&gt;
* [http://compilers.cs.ucla.edu/virgil/index.html The Virgil Programming Language] is designed for building robust, flexible, and scalable software systems on embedded hardware platforms. Virgil builds on ideas from object-oriented, statically typed languages like Java, providing a clean, consistent source language. Its compiler system provides an efficient implementation for resource-constrained environments.&lt;br /&gt;
&lt;br /&gt;
==== LabVIEW ====&lt;br /&gt;
* http://www.ni.com/embedded/ Informationen zu LabVIEW, der graphischen Entwicklungsumgebung von National Instruments&lt;br /&gt;
* http://www.labviewforum.de/ Deutsches Labview-Forum&lt;br /&gt;
* [http://web.me.com/iklln6/automation/LabVIEW.html Communicating Arduino--&amp;gt;LabVIEW]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
* [http://code.google.com/p/python-on-a-chip/ python-on-a-chip] (pymite). There are two sample projects in the source tree.  One for an 8-bit Atmel ATmega103 (but any AVR/ATmega with 4 KB RAM or more will do) and one for the 32-bit Atmel AT91SAM7S64 running on the AT91SAM7S-EK evaluation board. (GPL Lizenz)&lt;br /&gt;
&lt;br /&gt;
==== Openeye ====&lt;br /&gt;
&lt;br /&gt;
* OpenEye ist eine Kombination aus PC-Programm (Windows, Delphi) und einer Monitor-Routine im AVR. Die Daten aus dem AVR werden mit RS232 übertragen und können fürs Debuggen der laufenden Anwendung benutzt werden. OpenEye wurde vom User Martin Vogel (oldmax) geschrieben [http://www.mikrocontroller.net/topic/143144#1326244].&lt;br /&gt;
&lt;br /&gt;
==== Modkit ====&lt;br /&gt;
&lt;br /&gt;
[http://blog.modk.it/ Modkit] is a new kind of graphical programming environment that makes programming things in the physical world as easy as dragging and dropping little virtual code blocks in a web browser.. Heavily inspired by the Scratch programming environment (from MIT Media Lab&#039;s Lifelong Kindergarten Group), Modkit enables anyone including kids, artists and inventors to build with electronic kits and components including motors, sensors, lights, sound and the popular Arduino and Arduino compatible development boards... (Text vom Makezine)&lt;br /&gt;
&lt;br /&gt;
=== Tutorials und Beispiele ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.meinemullemaus.de/elektronik/avr_workshop/index.html AVR Mikrocontroller] Einfühung in AVR Mikrocontroller mit Nachbau des Spiels &amp;quot;Senso&amp;quot;.&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Modulares_Board] I2C Bus Tuts und Programme mit dem ATmega 1284p&lt;br /&gt;
* [http://www.avrbeginners.net AVRBeginners.net] Beginners Guides to AVRs&lt;br /&gt;
* [http://www.wikidorf.de/reintechnisch/Inhalt/AVRProjekt-9V-LED-Lampe reintechnisch.de] AVR Tutorial: 9V-LED-Lampe&lt;br /&gt;
* [http://www.schaltungsforum.de Das Schaltungsforum] ist eine Seite für Anfänger und Profis welche ständig mit Tutorials erweitert wird. Stellt Eure Projekte online. Die Seite befindet noch im Aufbau und Eure Mithilfe ist erwünscht.&lt;br /&gt;
* [http://www.mikrocontrollerspielwiese.de mikrocontrollerspielwiese.de] ist eine Seite, die an Anfänger gerichtet ist und Experimente und fertige Projekte komplett mit Code und Eagle-Dokumenten zur Verfügung stellt.&lt;br /&gt;
* [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-anwendungen ELO-AVR-Anwendungen] bietet eine wachsende Sammlung kleinerer AVR-Projekte, überwiegend für die ATTiny-Serie.&lt;br /&gt;
* [http://www.schramm-software.de/tipps/ AVR-Tipps] Programmier-Tipps und AVR-Experimente.&lt;br /&gt;
* [http://www.uwe-kerwien.de/pll/pll-synthesizer.htm PLL-Synthesizer Tutorial] kleines praxisorientiertes PLL-Tutorial zur Funktion, Reparatur und Steuerung einer PLL-Schaltung mit AVR ATtiny2313 über 3-Leiter-Bus&lt;br /&gt;
* Arduino&lt;br /&gt;
** [http://tronixstuff.wordpress.com/tutorials/ t r o n i x s t u f f] - Arduino Tutorials (engl.)&lt;br /&gt;
** [http://www.earthshinedesign.co.uk/ASKManual/Site/ASKManual.html The Complete Beginners Guide to the Arduino]&lt;br /&gt;
** [http://www.codeproject.com/KB/system/ArduinoVB.aspx Arduino with Visual Basic] by Carl Morey auf codeproject.com&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [http://www.smileymicros.com/QuickStartGuide.pdf Quick Start Guide for using the WinAVR Compiler with ATMEL&#039;s AVR Butterfly] ([http://www.smileymicros.com www.smileymicros.com], PDF)&lt;br /&gt;
* [http://www.avrtutor.com/tutorial/thermo/contents.htm avrtutor] - an attempt to provide a real tutorial for the ATMEL AVR microcontrollers.&lt;br /&gt;
* [http://www.sparkfun.com/commerce/present.php?p=BEE-1-PowerSupply Spark Fun Electronics] - Beginning Embedded Electronics (Atmega8, englisch)&lt;br /&gt;
* [http://metku.net/index.html?path=articles/microcontroller-part-1/index_eng metku.net] - How to get started with microcontrollers (ATtiny45, Steckbrett)&lt;br /&gt;
* [http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial XMEGA-C-Tutorial] - Tutorial über Atxmega&lt;br /&gt;
* [http://www.jtronics.de/avr-projekte/xmega-tutorial.html XMEGA Tutorial in C] - Tutorial ATxmega (unter anderen am ATxmega128A3U)&lt;br /&gt;
&lt;br /&gt;
==== C++ ====&lt;br /&gt;
* [http://www.avr-cpp.de/ www.avr-cpp.de] - Tutorial für AVR C++ und myAVR Bibliotheken&lt;br /&gt;
&lt;br /&gt;
==== Assembler ====&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.avr-asm-tutorial.net Atmel AVR Microcontroller Assembler Tutorial] (D)&lt;br /&gt;
* [[AVR-Studio]]&lt;br /&gt;
* [https://www.semiversus.com/dic/rechnerarchitektur/avr_assembler.html AVR Assembler Übersicht]&lt;br /&gt;
&lt;br /&gt;
==== Bascom ====&lt;br /&gt;
* [http://www.mcselec.com/ MCS Elektronik] BASCOM AVR Demo zum Download&lt;br /&gt;
&lt;br /&gt;
==== Pascal ====&lt;br /&gt;
* [http://www.elektronik-projekt.de/content/download/avrco_tut2.pdf AVRco Pascal Tutorial] - von Markus&lt;br /&gt;
* [http://www.ibrtses.com/embedded/avr.html ein paar Seiten zum AVR] (ASM und Pascal) von ibrt&lt;br /&gt;
&lt;br /&gt;
==== Ada ====&lt;br /&gt;
* [http://sourceforge.net/apps/mediawiki/avr-ada/index.php?title=Tutorial AVR-Ada Tutorial]&lt;br /&gt;
&lt;br /&gt;
=== Hardware (Prototypen-Platinen-Boards etc.) ===&lt;br /&gt;
&lt;br /&gt;
* [http://retrodan.tripod.com Atmel AVR Butterfly Site]&lt;br /&gt;
* [http://www.kanda.com Kanda] Starter Kits and Development Tools for different Microcontrollers&lt;br /&gt;
* [http://www.dontronics.com Dontronics] Starter Kits and Development Tools for different Microcontrollers, Linkpages for AVR and PIC&lt;br /&gt;
* [http://www.mikrocontroller.com mikrocontroller.com] u.a. Platine AVR-Ctrl, AVR-Webserver (D)&lt;br /&gt;
* [http://mikrocontroller.cco-ev.de/eng/ AVR webserver] RTL8019, 3COM (E) &lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter Kits for different Microcontrollers (D)&lt;br /&gt;
* [http://www.olimex.com Olimex Ltd.] DevelopmentBoards and Tools&lt;br /&gt;
* [http://www.krause-robotik.de Krause Robotik] Controller Boards &amp;amp; Zubehör&lt;br /&gt;
* [http://www.robotikhardware.de robotikhardware.de] Controller Boards&lt;br /&gt;
* [http://www.embedded-it.de/microcontroller/microcontroller-module.php Embedded-IT] USB Module auf AVR Basis sowie Ethernut kompatible Embedded Ethernet Mikrocontroller Boards für Industrie und Hobby auf ARM mit Nut/OS Betriebssystem&lt;br /&gt;
* [http://www.ssv-embedded.de SSV Embedded Systems] 32-bit Mikrocontrollermodule und -boards, Starter Kits etc.&lt;br /&gt;
* [http://shop.embedit.de/browse_002_21__.php Embedit] Mikrocontrollermodule und -boards&lt;br /&gt;
* [http://www.display3000.com Display3000] Farbdisplays, Mikrocontrollermodule und -boards mit TFT-Farbdisplays; Experimentierplatinen und Ansteuerplatinen für TFT Farbdisplays&lt;br /&gt;
* [http://www.myavr.de myAVR] Einsteigerboards und Zubehör&lt;br /&gt;
* [http://www.siphec.com/ SIPHEC] Development Boards für AVR, MSP430, USB&lt;br /&gt;
* [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MTY5OTgxOTk=&amp;amp;w=OTk4OTY4&amp;amp;ts=0 ATMEL Evaluations-Board Bausatz] ([http://www.pollin.de/shop/downloads/D810038B.PDF PDF]) und [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MzU5OTgxOTk=&amp;amp;w=OTk4OTY4&amp;amp;ts=0 ATMEL Funk-Evaluations-Board Bausatz] ([http://www.pollin.de/shop/downloads/D810046B.PDF PDF]) von Pollin&lt;br /&gt;
* [http://www.lochraster.org/etherrape/ Etherrape] Atmaga 644 mit Ethernet und TCP/IP als Bausatz.&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c4_Programmer.html AVR Programmieradapter],[http://www.ic-board.de/index.php?cat=c3_Funkmodule.html ZigBee-ready Funkmodule/Funk-USB-Sticks] und [http://www.ic-board.de/index.php?cat=c13_ICradio-Bundles.html Funk Starterkits] von In-Circuit&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c2_ICnova-Module.html AVR32 AP7000 Linux Board] mit 2xEthernet, TFT, Audio, SDCARD, USB-Host/Devive, Funk...&lt;br /&gt;
* [http://www.das-labor.org/wiki/Laborboard Das Laborboard] von das-labor.org (DIY)&lt;br /&gt;
* [http://six.media.mit.edu:8080/6 number six] - Open Source Design, Atmega32. Alle Pins sind auf eine 2x20 Pol Wannenstiftleiste herausgeführt.&lt;br /&gt;
* http://www.maares.de/tools USB Memory Stick am AVR Butterfly. AVR Butterfly Trägerplatine zum Anschluß von VDRIVE, VMUSIC, RFM12.&lt;br /&gt;
* [http://www.wiring.org.co/ Wiring] is an open source programming environment and electronics i/o board for exploring the electronic arts, tangible media, teaching and learning computer programming and prototyping with electronics.&lt;br /&gt;
* [http://www.chip45.com/ chip45] Atmel AVR Module und Boards mit USB, RS232/485, CAN, Ethernet, Funkmodule, sowie ISP Programmieradapter.&lt;br /&gt;
* [http://www.rakers.de/catalog Dr. Rakers] &amp;lt;b&amp;gt;AVR Boards und Experimentierplatinen&amp;lt;/b&amp;gt; mit USB, Ethernet, RS232, CAN, LCD etc. in hochwertiger Qualität zu günstigen Preisen.&lt;br /&gt;
* [http://nibo.nicai-systems.de Roboterbausatz Nibo] - autonomer &amp;lt;b&amp;gt;Roboter&amp;lt;/b&amp;gt; mit einem ATmega128 und einem ATmega88&lt;br /&gt;
* [http://www.aevum-mechatronik.de Modularis] - AVR Mikrocontroller-Boards (z.T. mit Zusatz-Speicher und USB) die über Flachbandkabel erweitert werden können. Es gibt bis jetzt Zubehör-Module mit Taster, Motor H-Brücke, XBee und Winkelsensor.&lt;br /&gt;
* [http://www.schramm-software.de/bausatz/ Schramm-Software] - AVR Mikrocontroller-Bausätze&lt;br /&gt;
* [http://www.alvidi.de/ Alvidi] - Headerboards mit AVR &amp;amp; AVR32 Controllern&lt;br /&gt;
* [http://www.steitec.net/ Steinert Technologies] - Thailändischer Anbieter von Mikrocontroller Boards (AVR, ARM7, ARM9, PIC, dsPIC, PSoC, uvm.)&lt;br /&gt;
* Arduino&lt;br /&gt;
** [http://www.arduino.cc/ Arduino] Homepage&lt;br /&gt;
** [http://www.freeduino.org/ Freeduino.org] - Riesige Linksammlung zu dem &#039;&#039;&#039;Ardunio&#039;&#039;&#039;(R) AVR-Board (Kit) und dessen Clones und Mutanten (DIY oder Kit)&lt;br /&gt;
** [http://www.freeduino.de/ freeduino.de] - Anleitungen und Tutorials, Arduino Wiki, Blog, Tools in Deutsch&lt;br /&gt;
** [http://shieldlist.org/ Arduino Shield List]&lt;br /&gt;
* [http://www.fritzing.org Fritzing] nützliches Programm für viele Betriebsysteme zur Unterstützung eines Brettboard-Aufbaus(ungetestet).&lt;br /&gt;
* [http://www.specialprint.eu Specialprint] InkjetDruck für den digitalen Direktdruck von Ätzmasken, Lötstoppmasken, Frontplatten, Kennzeichnungen&lt;br /&gt;
* [http://www.onlinesteuerung.de Onlinesteuerung.de] USB Bausatz. Technische Geräte per PC, Browser, Netzwerk, Ethernet, TCP/IP, Internet, Excel, Timer oder Sensoren schalten.&lt;br /&gt;
* [http://8devices.com/product/3/wi-fi-4-things Carambola WiFi module] Open hardware Linux friendly (OpenWRT) WiFi 802.11n OEM module&lt;br /&gt;
* [http://www.atxmega-board.de ATxMegaBoard und ATxMegaStick] Entwicklungsboards, zum Einstig in die Welt der ATxMegas&lt;br /&gt;
* [http://thinkembedded.ch/AVR:::21.html Thinkembedded Webshop, Schweiz] div. Olimex Demoboarde ab SFr 18.- / 14 Euro&lt;br /&gt;
* [https://shop.trimension.de Elektronische Baugruppen der AVR-Familie] Entwicklungs- und Breakout-Boards der Atmel AVR/XMEGA-Familie&lt;br /&gt;
&lt;br /&gt;
=== Programmierhard- und Software ===&lt;br /&gt;
* [http://www.obdev.at/products/avrusb/avrdoper.html AVR-Doper] Einfach nachzubauender, STK500-kompatibler Programmer mit USB-Anschluss. Beherrscht auch HVSP, nicht jedoch HVPP. Open Source.&lt;br /&gt;
* [http://www.bsdhome.com/avrdude/ AVRDUDE] AVR ISP-Programmerierwerkzeug für Unix/Linux/BSD und Windows. Kommandozeile [http://sourceforge.net/projects/avrdude-gui/ (oder mit GUI)], AVR Butterfly-Unterstützung&lt;br /&gt;
* [http://www.lancos.com/prog.html PonyProg] neben AVR für diverse seriell programmierbare Bauteile (Grafische Nutzeroberfläche und Kommandozeile), siehe auch [[Pony-Prog Tutorial]]&lt;br /&gt;
* [http://savannah.nongnu.org/projects/uisp/ uisp] AVR ISP-Programmierwerkzeug für Unix/Linux/BSD und Windows (Kommandozeile)&lt;br /&gt;
* [http://www.myplace.nu/avr/yaap/ yaap]&lt;br /&gt;
* [http://www.xs4all.nl/~sbolt/e-index.html SP12]&lt;br /&gt;
* [http://www.der-hammer.info/hvprog STK500 kompatibler Programmer] als Nachbauprojekt. Siehe auch [[STK500]&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=73&amp;amp;products_id=41 Preiswerter Standard ISP (STK200 kompatibel)]&lt;br /&gt;
*  [http://www.siwawi.arubi.uni-kl.de/avr_projects/evertool/ Evertool] kombinierter ISP &amp;amp; [[JTAG]] Programmer (kompatibel zum &amp;quot;original&amp;quot; Atmel AVRISP und Atmel JTAGICE) &lt;br /&gt;
* [http://www.olimex.com Olimex] (Bulgarischer Anbieter) Kostengünstig&lt;br /&gt;
* [http://www.avr-projekte.de/isp.htm AVR910-USB Programmer] incl. USB-Modul und USB-&amp;gt;Seriell Wandler&lt;br /&gt;
*[http://www.fischl.de/usbasp/ USBasp] &amp;amp;#8211; USB-Programmer bestehend aus ATmega8 (kein spezieller USB-Chip notwendig)&lt;br /&gt;
* [https://guloshop.de/shop/Mikrocontroller-Programmierung/guloprog-der-Programmer-von-guloshop-de::70.html USBasp – USB-Programmer guloprog] (ca. 5,00 €) mit Signalwandlerfunktion, bestehend aus ATtiny85 (kein spezieller USB-Chip notwendig)&lt;br /&gt;
* [[Bierdeckel-Programmer]] – USBasp mit ATtiny85, sehr wenige Bauteile, leicht nachzubauen&lt;br /&gt;
* [http://home.arcor.de/bernhard.michelis Amadeus-USB] - Highspeed-Programmer für PIC18, PIC24, dsPIC30, PIC32, dsPIC33 und AVR. Bietet auch Möglichkeiten zur Fehlersuche.&lt;br /&gt;
* [http://www.e-dsp.com Signalgenerator] - Signalgenerator software&lt;br /&gt;
* [http://www.piketec.com/products/tpt.php Time Partition Testing (TPT)] - Test-, und Testauswertewerkzeug für eingebettete Systeme&lt;br /&gt;
* [http://shop.myavr.de/Programmer.htm?sp=artlist_kat.sp.php&amp;amp;katID=16 mySmartUSB] - USB Programmer (ab 15€) kombiniert auch mit USB-UART-Bridge, STK500v2/AVR910/AVR911 kompatibel, ISP HV-seriell, HV-parallel&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=73&amp;amp;products_id=161 USB-Programmer für Bascom Programmierer]&lt;br /&gt;
* [http://www.virtualserialport.com/ Virtual Serial Port] Software for serial port communication and null-modem emulation&lt;br /&gt;
* [http://www.windautopilot.de/bcalmxp/SimpleSerial.zip] SimpleSerialTerminal, ein einfaches Tool für die serielle Schnittstelle, (freeware)&lt;br /&gt;
* [http://www.helmix.at/hapsim/index.htm HAPSIM graphischer Simulator ] zu graphischen Simulation von Tasten /LED /LCD und Terminal in AVR Studio Freeware !!!&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c4_Programmer.html AVR Programmieradapter und JTAGICE MKII]&lt;br /&gt;
* [http://www.myavr.de/download.php?suchwort=ProgTool myAVR ProgTool] nette Programmieroberfläche (free)&lt;br /&gt;
* [http://b9.com/elect/avr/kavrcalc/ KAVRCalc] is a free calculator to assist in programming AVR microcontrollers (Baudrate, Watchdog, Timer, ...)&lt;br /&gt;
* [http://www.chip45.com/CrispAVR-USB CrispAVR-USB] STK500 V2 kompatibler ISP Adapter mit USB Schnittstelle für Atmel AVR Mikrocontroller (1,8V-5,5V).&lt;br /&gt;
* [http://ucom-ir.nicai-systems.de UCOM-IR] - Programmieradapter mit USB Schnittstelle (AT90USB162) und IR-Sender/Empfänger, STK500 V2 kompatibel&lt;br /&gt;
* [http://www.anagate.de/products/programmers.htm AnaGate Programmer] Serielle Programmer mit LAN-Anschluss für I2C und SPI inkl. Programmier-API für Windows/Linux (Shop)&lt;br /&gt;
* [http://www.halec.de/roloFlash/?ref=wiki_links.mikrocontroller.net roloFlash] - mobiles Flashgerät ohne PC (standalone), flexibel durch eingebaute Skriptsprache roloBasic&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/AVR-ISP-Stick AVR-ISP-Stick] Sehr günstiger (6,90€!) und bereits über 500 mal bewährter AVR-Programmer mit USB-Anschluss&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=com.wesche.javad2xxmpsseavrprogrammer&amp;amp;hl=de Android AVR Flasher over FTDI] Program AVR Atmel Chips with FTDI chips (MPSSE mode) on Android&lt;br /&gt;
&lt;br /&gt;
=== Projekte und Quellcodebibliotheken ===&lt;br /&gt;
&lt;br /&gt;
====Bibliotheken====&lt;br /&gt;
* [http://www.sigem-elektronik.de/elektro/cad/eagle/biblio/eaglebib.htm Cadsoft Eagle Bibliotheken]&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/ AVR Libc]&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/index.html Procyon AVRlib]&lt;br /&gt;
* [http://homepage.hispeed.ch/peterfleury Peter Fleury&#039;s Pages] - UART / LCD (HD44780) / I²C (TWI)/ AVR-GCC Bibliotheken, STK500v2 Bootloader&lt;br /&gt;
*[http://sourceforge.net/projects/avrfix  Fixed Point Library Based on ISO/IEC Standard DTR 18037 for Atmel AVR microcontrollers, u.a. Cordic-Algorithmen] und [http://www.enti.it.uc3m.es/wises07/presentations/session2/05%20-%20Fixed%20Point%20Library%20According%20to%20ISOIEC%20Standard%20DTR%2018037%20for%20Atmel%20AVR%20ProcessorsWISES07-fixedpointlibrary%20-%20Elmenreich.pdf  Kurzbeschreibung dazu als Powerpoint-PDF TU Wien Febr. 2007]&lt;br /&gt;
&lt;br /&gt;
==== Betriebssysteme &amp;amp; Co. ====&lt;br /&gt;
* [http://www.tinyos.net/ TinyOS] - Komponentenbasiertes Betriebssystem für Sensorknoten. Bringt eigene C-ähnliche Hochsprache nesC mit.&lt;br /&gt;
* [http://www.chris.obyrne.com/yavrtos/ YAVRTOS] - Yet Another Atmel® AVR® Real-Time Operating System von Chris O&#039;Byrne (C, Atmega32, GPL3 Lizenz)&lt;br /&gt;
* [http://www.freertos.org/ FreeRTOS] is a portable, open source, mini Real Time Kernel - a free to download and royalty free RTOS that can be used in commercial applications. (AVR, MSP430, PIC, ARM7, ...)&lt;br /&gt;
* [http://www.barello.net/avrx/index.htm AvrX Real Time Kernel] (IAR ASM oder IAR/GCC C, GPL2 Lizenz)&lt;br /&gt;
* [http://scmrtos.sourceforge.net/ scmRTOS] - Single-Chip Microcontroller Real-Time Operating System (C++, AVR, MSP430, Blackfin, ARM7, FR (Fujitsu, [http://www.opensource.org/licenses/mit-license.php MIT Lizenz]).&lt;br /&gt;
* [http://www.circuitcellar.com/avr2004/DA3650.html csRTOS] - cooperative single-stack RTOS aus dem Circuit Cellar AVR 2004 Design Contest.  [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_id=987&amp;amp;item_type=project csRTOS port to ATmega32] und [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=50743&amp;amp;start=all&amp;amp;postdays=0&amp;amp;postorder=asc Diskussion] auf www.avrfreaks.net führte zur Weiterentwicklung als [http://www.mtcnet.net/~henryvm/4AvrOS/ 4AvrOS] - cooperative scheduler&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_type=project&amp;amp;item_id=230 OPEX] - freeware cooperative scheduler with lots of calendar and I/O functions von Steve Childress (Download auf www.avrfreaks.net ggf. Registrierung notwendig)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/12176#79672 Scheduler] von Peter Dannegger&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25087#186454 RTC-Scheduler] von ape&lt;br /&gt;
* [http://www.sics.se/~adam/pt/ Protothreads] - Lightweight, Stackless Threads in C (open source BSD-style license)&lt;br /&gt;
* [http://www.micrium.com/products/rtos/kernel/rtos.html uC/OS-II] is a real time operating system developed by Jean J. Labrosse. You can obtain the source code for the OS by buying Labrosse&#039;s excellent book &#039;&#039;MicroC/OS-II The Real-Time Kernel (2nd edition)&#039;&#039;. [http://www.ee.lut.fi/staff/Julius.Luukko/ucos-ii/avr/index.shtml Port for AVR (gcc 3.x)] and [http://www.myplace.nu/avr/ucos/index.htm AVR (gcc 2.x)].&lt;br /&gt;
* [http://freshmeat.net/projects/qp/ QP] is a lightweight, portable framework/RTOS for embedded systems (ARM, Cortex-M3, 8051, AVR, MSP430, M16C, HC08, NiosII, and x86). GPL (und kommerzielle Lizenz verfügbar)&lt;br /&gt;
* [http://www.femtoos.org/ Femto OS] von  Ruud Vlaming ist ein preemptives Betriebssystem für die kleinsten Mikrocontroller aus der AVR Serie bis ca. 16 KB ROM und 1 KB RAM. Spezielle Targets sind: ATtiny861/461/261. Geschrieben in C. Freie Software, GPLv3. Artikel in Elektor Februar 2010 &lt;br /&gt;
* [http://www.projects-lab.com/?p=344 kaOS] is a real-time, multithreaded, preemptive operating system for the ATmega32 microcontroller, which loads and executes programs from a Secure Digital or MMC card. Authors Nicholas Clark &amp;amp; Adam Liechty. (Circuit Cellar AVR Wettbewerb 2006)&lt;br /&gt;
* [http://helium.sourceforge.net/ Helium] is a minimalistic real-time kernel for the HC(S)08 core by Freescale and Atmel AVR.&lt;br /&gt;
* [http://dev.bertos.org/ BeRTOS] is a completely free, open source, real time operating system (RTOS) suitable for embedded platforms. Runs on many microprocessors and microcontrollers, ranging from 8 bits to 32 bits CPUs and even PCs.&lt;br /&gt;
* [http://funkos.sourceforge.net/ funkos] Targets: AVR, XMEGA, MSP430, Cortex M3, Open Source&lt;br /&gt;
* Vergleich zwischen [http://antipastohw.blogspot.com/2009/11/4-operating-systems-for-arduino.html 4 Operating Systems for the Arduino] auf [http://antipastohw.blogspot.com Liquidware Antipasto]&lt;br /&gt;
** &#039;&#039;&#039;DuinOS&#039;&#039;&#039; by RobotGroup (FreeRTOS Portierung)&lt;br /&gt;
** [http://www.skewworks.com/pyxis/ Pyxis OS] by ArduinoWill&lt;br /&gt;
** &#039;&#039;&#039;ArduinoMacOS&#039;&#039;&#039; by Mark&lt;br /&gt;
** &#039;&#039;&#039;TaOS&#039;&#039;&#039; by Ziplock&lt;br /&gt;
* [http://atomthreads.com/ Atomthreads] is a free, lightweight, portable, real-time scheduler for embedded systems. (BSD Lizenz)&lt;br /&gt;
* [http://www.shift-right.com/xmk/ XMK] (eXtreme Minimal Kernel) ist ein freies Echtzeitbetriebssystem für Mikrocontroller (AVR, H8, R8C, M16C).&lt;br /&gt;
* [http://irtos.sourceforge.net/index.html.en iRTOS] is an free Real Time Operating System. The iRTOS kernel is free to download and use under the terms of LGPL. It can be used in commercial applications. iRTOS is designed for tiny 8 bit microconroller chips with little RAM usage. OS can be installed also in 16 and 32 bit processor units.&lt;br /&gt;
* [http://sites.google.com/site/cocoosorg/avr-projects/home cocoOS] is a cooperative task scheduler, based on coroutines and it is written in C. (STK500, Atmega16)&lt;br /&gt;
* [http://www.DieProjektseite.de BasicBeetle] Basic-Betriebssystem im AVR&lt;br /&gt;
* Shells für Arduino:&lt;br /&gt;
** [http://biot.com/arsh/ ARSH]&lt;br /&gt;
** [http://www.battledroids.net/downloads/avrsh.html AVRSH]&lt;br /&gt;
** [http://bitlash.net/wiki/start BITLASH]&lt;br /&gt;
** [http://sourceforge.net/projects/fruitshell/ FRUITSHELL]&lt;br /&gt;
** [http://www.gisvold.co.uk/~gisvold/drupal/node/1484 BREAKFAST]&lt;br /&gt;
* [http://nootropicdesign.com/toolduino/ toolduino] is a simple software tool that lets you easily interact with your Arduino hardware so you can test the circuits you create. Toolduino is written in the [http://processing.org/ Processing] languange and is available for Windows, Mac OS X, and Linux. Toolduino uses the the [http://www.arduino.cc/playground/Interfacing/Processing Arduino library for Processing] to communicate with an Arduino board so you can manipulate output pins and read inputs. The Arduino must be running the [http://firmata.org/wiki/Main_Page Firmata] firmware that comes with the Arduino IDE. (LGPL)&lt;br /&gt;
* [http://www.mueller-torres.de/avr.php MOPS] - A small C and Assembly based operating system for the ATMEL AVR® 8-Bit RISC controller family.&lt;br /&gt;
* [http://www.hk-businessconsulting.de/rts.htm RTS(Realtime Tasking System)] - Betriebssystemkern mit Echtzeiteigenschaften, Lizenz: EUPL V. 1.1&lt;br /&gt;
&lt;br /&gt;
==== Projektsammlungen ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.DieProjektseite.de Die Elektronik-Projektseite und Heimat des BasicBeetle] Hauptthema ist der BasicBeetle. Ein modularer, leistungsfähiger, in Basic programmierbarer Mikrorechner speziell für Steuerungen. Mit vielen Programmen, Tiipps und Tricks, Informationen...&lt;br /&gt;
* [http://www.Happy-Micro.de Happy-Micro.de] Die Internetsite für Hobbyelektroniker, Mikrocontroller-Anwender, Programmierer und alle, die Spaß an Computern und Elektronik haben. Bei Happy-Micro.de steht der Spaß am Entwickeln von Programmen und Schaltungen im Vordergrund. Jeder Benutzer hat die Möglichkeit auch als Autor mitzumachen und seine Schaltungen oder Programme zu veröffentlichen. Freier Bilderdownload für die eigene Homepage. &#039;&#039;(Seite wurde geschlossen!)&#039;&#039;&lt;br /&gt;
* [http://iwenzo.de Elektronik und Informationen] Wissenswertes aus der Unterhaltungselektronik..&lt;br /&gt;
* [http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/ Cornell University ECE 476 Microcontroller Design Final Projects] &lt;br /&gt;
* [http://www.serasidis.gr/ Serasidis Vasilis&#039; AVRsite] u.a. GLCD, SMS, PAL&lt;br /&gt;
* [http://www.riccibitti.com Alberto Ricci Bitti] u.a. PAL Video-Interface&lt;br /&gt;
* [http://www.ulrichradig.de Mikrocontroller and more] AVR - Projekte (Ethernet, LCD, Relaiskarte usw.) und mehr&lt;br /&gt;
* [http://home.arcor.de/burkhard-john/index.html Burkhard John] (D)&lt;br /&gt;
* [http://www.avrprojects.net/ AVRmicrocontrollerprojects] u.a. Text-LCD, Schrittmotor, Thermometer&lt;br /&gt;
* [http://hem.bredband.net/robinstridh/ Robin Stridh] Rotor-Anzeige, Video-Interface&lt;br /&gt;
* [http://www.dertien.dds.nl/content/avrprojects.html dertien.dds.nl AVR-Projects]&lt;br /&gt;
* [http://www.microsps.com MicroSPS.com] Grafische Programmierung des AVR mit EAGLE&lt;br /&gt;
* [http://www.h-mpeg.de h-mpeg Festplatten mp3 Player] IDE Ansteuerung, IDE Filesystem, LCD Ansteuerung etc. in 8K Code. Quelltext unter GPL&lt;br /&gt;
* [http://www.embedtronics.com/ embedtronics.com]&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects  M. Thomas&#039; AVR Projekte] untern Anderem AVR Butterfly avr-gcc-port, DB101 gcc-port, BC100 gcc-port, Bootloader, Programmier- und Debughardware, Software-UART, DS1820-Lib., experimentelle avrdude-Versionen, AVR und CAN mit MCP2515 &amp;lt;!-- Vorsicht &amp;quot;Eigenwerbung&amp;quot; --&amp;gt;&lt;br /&gt;
* [http://www.mictronics.de Michaels Electronic Projects] AVR Projekte (EN) - ua. Sony/Becker CD/MD Wechsler Emulator, RDS-Decoder, GPS Infos, OBD J1850 VPW Interface, USB&amp;lt;&amp;gt;CAN Bus Interface. Informationen zu CD Wechsler Protokollen. MP3stick - MP3 Player mit ATmega128, color LCD, SD/MMC Karte und VS1011b&lt;br /&gt;
* [http://www.stahlbucht.de/elektronik/node13/ node13] modulares AVR 8515 Projekt: eine Controller-Platine, an die sich weitere Ein-Ausgabemodule (Tastenfeld, LEDs, LCD-Modul) anschliessen lassen&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2 Roboternetz-Mikrocontroller Projekte.de] Diverse Projekte mit AVR und anderen Controllern, insbesondere im Bereich Robotik&lt;br /&gt;
* [http://www.avr-projekte.de AVR-Projekte.de] Belichtungstimer, FT232RL Schaltungen,LED-Fading über Fernbedienung, HD44780-LCD über USB und Seriell, AVR910-USB Programmer, Basteleien: Ätzmaschine,Kompressor.&lt;br /&gt;
* [http://openeeg.sourceforge.net/ openeeg.sourceforge.net] Das OpenEEG Projekt befasst sich mit der Entwicklung eines preiswerten Elektro-Enzephalographie (EEG) Geräts und dessen freier Steuersoftware zur Messung elektrischer Gehirnströme. Sein µPC-Herz ist ein AT90S4433 bzw. ein ATmega8. Ziel sind auch verschiedene EEG Anwendungen z.&amp;amp;nbsp;B. im Bereich mentaler Trainingsmethoden (Neurofeedback).&lt;br /&gt;
* [http://www.amateurfunkbasteln.de/ www.amateurfunkbasteln.de] Seite von Michael Wöste (DL1DMW) u.a. CPU-Board mit AT89C2051, AT89C4051 oder AVR AT90S2313, CPU-Board mit Atmel AT90S8535, Experimentierplatine mit ATmega103, Programmer für AT89C2051/AT89C4051, 32-Kanal-Logik-Analysator bis 40 MHz (Entwurf von David L. Jones)&lt;br /&gt;
* [http://www.atmel.com/dyn/products/app_notes.asp?family_id=607 Atmel - AVR 8-Bit RISC - Application Notes] Anwendungshinweise und Beispiele vom Hersteller&lt;br /&gt;
* [http://www.projects.cappels.org/ Dick Cappels&#039; Project Pages]&lt;br /&gt;
* [http://see-by-touch.sourceforge.net/index.html SeebyTouch - Blinden-Seh-Ersatzsystem] Computerbilder fühlen durch ein einfaches Gerät (Bauanleitung) und freier Software (für 10 Betriebssysteme) - eine neue Erfahrung für alle&lt;br /&gt;
* [http://www.loetstelle.net www.loetstelle.net] Verschiedene kleinere AVR-Projekte rund um LEDs, z.&amp;amp;nbsp;B. RGB Dimmer, Moodlight. Diverse Elektronikprojekte und Grundlagen&lt;br /&gt;
* [http://www.dietmar-weisser.de Selbstbauprojekte Elektronik] kleine Sammlung von Elektronikprojekten zum Thema Leiterplattenfertigung, Hochfrequenztechnik und Mikrocontroller.&lt;br /&gt;
* [http://www.myplace.nu/avr/ Jesper&#039;s AVR pages] Yampp MP3 Player, Yaap Programmer, DDS mit 2313+R2R, Gitarrentuner, Frequenzzähler.&lt;br /&gt;
* [http://www.microsyl.com/ MicroSyl MCU] MP3 Player, MegaLoad, HCLoad, Propeller Clock, Freq Meter, BarCode Reader, Door Bell, OneWire Lib, Text LCD Lib, Graph LCD Lib, Nokia LCD Lib, Led Sign with MMC MemoryCard, Intercom&lt;br /&gt;
* [http://www.jeroen.homeunix.net/ http://www.jeroen.homeunix.net/] Aufbau eines elektronischen Rouletts auf basis eines AVRs&lt;br /&gt;
* [http://thomaspfeifer.net thomaspfeifer.net] Reflow-Ofen, Laminator-Temperaturregelung, USB-Atmel-Programmer, SMD-Tricks u.v.m.&lt;br /&gt;
* [http://www.scienceprog.com Scienceprog - embedded theory and projects] - AVR, ARM theory and projects&lt;br /&gt;
* [http://www.iuse.org Hausautomatisierung] - CAN-Bus mit ATmega32-Controllern und Bedienfeldern, Admin-Tools zum Updaten via CAN, Traffic Dumper etc.&lt;br /&gt;
* [http://www.myevertool.de AVRSAM] - AT91SAM7S Header Board annährend 100% Pinkompatibel zu den folgenden AVR Mikrocontroller: AT90S8535 / ATMEGA8535 / ATMEGA16 / ATMEGA32&lt;br /&gt;
* [http://members.aon.at/hausbus Hausbus Home] - Hausbus-Projekt unter Verwendung von ATmega8, ATtiny13 und ATmega128&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/AVR/avr-dcf-clock.html AVR-DCF-Clock] - DCF-Uhr mit bunter LED-Anzeige - ATmega8&lt;br /&gt;
* [http://www.grasbon.de/genuhr.html GenuhR] - DCF-Funkuhr / Wecker/ Timer mit LED-Punktmatrixanzeige. Das Projekt beschreibt den Aufbau des kompletten Gerätes beginnend beim Schaltplan bis hin zur Montage in ein Gehäuse.&lt;br /&gt;
* [http://www.avrguide.com/ AVR Projektsammlung] bei www.avrguide.com&lt;br /&gt;
* AVR Synth http://www.elby-designs.com/avrsynth/avrsyn-about.htm http://www.jarek-synth.strona.pl/&lt;br /&gt;
* [http://elm-chan.org/he_e.html Electronic Lives Manufacturing] - Aufbauten in Fädeldrahttechnik, tlw. auf Japanisch, aber mit englischen Sourcecodes&lt;br /&gt;
* AVR Synthesizer http://www.avrx.se/&lt;br /&gt;
* [http://www.wedis-basteleck.de/ Wedis-Basteleck] - Modellbahn DCC-Servo-Zubehördecoder DCC Servo Decoder mit ATmega8 / Servo Differenzierbaugruppe für Modellbau&lt;br /&gt;
* http://web.archive.org/web/20050415222337/http://www.hebel23.de/ RDS RADIO: ATMega32, TEA5757, T6963C, TDA7330B in C&lt;br /&gt;
* [http://www.gasenzer.dk Analog/Digital and MPU Eletronic Projects] PAL/VGA Terminal, CallerID, Ethernet, Wireless Bridge, LPC2214, AT91RM9200, Sony Unilink Controlled Wireless MP3 Player.&lt;br /&gt;
* [http://www.circuitcellar.com/avr2004/ Circuit Cellar AVR Design Contest 2004] mit Projektbeschreibungen&lt;br /&gt;
* [http://www.circuitcellar.com/avr2006/ Circuit Cellar AVR Design Contest 2006] mit Projektbeschreibungen&lt;br /&gt;
* [http://www.heesch.net/microcontroller.aspx/ Homepage von Stefan Heesch] - AVR Mikrokontroller Projekte, z.B. WLAN und AVR, netzwerkgesteuertes RGB Licht, IDE-Interface, DS1821 Thermometer, Morse-Dekoder u.a.&lt;br /&gt;
* [http://www.schaltungsforum.de Das Schaltungsforum] ist eine Seite für Anfänger und Profis welche ständig mit Tutorials erweitert wird. Stellt Eure Projekte online. Die Seite befindet noch im Aufbau und Eure Mithilfe ist erwünscht.&lt;br /&gt;
* [http://avrprojekte.de/] Viele Projekte mit LEDs(LED-Matrixen) und AVRs&lt;br /&gt;
* [http://wiki.trimension.de/wiki/Artikel_%C3%9Cbersicht wiki.trimension.de] Tutorial zum Auslesen eines TSIC, ein Belichtungsgerät, einfache PWM-Dimmer und andere Projekte mit AVR-Mikrocontrollern&lt;br /&gt;
* [http://arduino.milkcrate.com.au/ little-scale&#039;s arduino page]&lt;br /&gt;
* [http://www.sebastianweidmann.de www.sebastianweidmann.de] Grundlagen zum Thema Platinen ätzen, Bohren, Durchkontaktierungen und Projekte Tipps/Tricks mit Atmel AVR Microcontrollern&lt;br /&gt;
*[http://www.jtronics.de/avr-projekte.html Junghans Electronic Page] u.a Nokia 3310 LCD Ansteuerung in &amp;quot;C&amp;quot;(aktualisiert 2010), TWI/USI, Quadcopter&lt;br /&gt;
* [http://www.familie-finke.com/ http://www.familie-finke.com/] Die Website von Thomas Finke mit diversen Elektronikprojekten, wie z.B. STK-LAN (AVR im Netzwerk mit HTTPD, SNMP,...), UV-LED-Belichter, HPGL-Plotter.&lt;br /&gt;
* [http://phil-zone.de/ Philips Projektsammlung] Elektronik Projekte (µC,CMOS,Analog,...), Tutorials und nützliche Online-Tools&lt;br /&gt;
* [http://www.iuac.res.in/~elab/phoenix/index.html Phoenix] allows you to develop science experiments  by connecting  sensor / control elements to a computer and access them through software. The project was started by Inter University Accelerator Centre, with the objective of improving the laboratory facilities at Indian Universities, and growing with the support of the user community. Phoenix depends heavily on Python language. The data acquisition, analysis and writing simulation programs to teach science and computation. The hardware design is freely available. The project is based on Free Software tools and the code is distributed under GNU GPL. (Atmega16)&lt;br /&gt;
* [http://code.google.com/p/usb-pwm-generator/ USB PWM Generator] Low Cost PWM Generator, über USB Programmierbar. 1Hz - 120khz Duty Cycle 1 - 99 %.&lt;br /&gt;
* [http://www.electronicshub.org/ Electronics Hub] - Huge collection of electronics projects, free electronics circuits and other technical information is available for Engineering students.&lt;br /&gt;
&lt;br /&gt;
==== Schnittstellen &amp;amp; Protokolle ====&lt;br /&gt;
===== Ethernet (TCP/IP...) =====&lt;br /&gt;
* Kostengünstige und schnelle WLAN Anbindung an Mikrocontroller mit Wiz610wi. Bezugsquelle inkl. praktischer Adapterplatine bei: [http://www.shop.display3000.com/elektronikmodule/ethernet-wlan/index.html Display3000]&lt;br /&gt;
* [http://www.laskater.com/projects/uipAVR.htm TCP/IP Stack für AVR] mit Realtek RTL8019AS oder Axis AX88796 Netzwerk-Chips (open source für avr-gcc und Imagecraft). Passende Hardware in [http://www.edtp.com/ diesem online-shop]&lt;br /&gt;
* [http://www.ethernut.de Ethernut] - AVR based Hardware with Ethernet-Interface, Multithreading OS, Software and Hardwaredesign is free&lt;br /&gt;
* [http://www.embedded-it.de/microcontroller/eNet-sam7X.php eNet-sam7X] Embedded Ethernet Modul im DIL64 Format mit kompletten OpenSource Board Support Packake auf Ethernut / Nut/OS Basis. Industrie geeignet&lt;br /&gt;
* [http://www.ethersex.de/index.php/Feature_Liste Ethersex] - Trotz des bescheuerten Namens sehr empfehlenswert. Viele flexibel einbindbare Module für diverse Hardware.&lt;br /&gt;
* [http://wiki.neo-guerillaz.de OpenMCP] Bekanntes Board auf Basis des ATmega2561 und ENC28j60. Läuft auch auf dem AVR-NETIO und dem myAVR.&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUDP/IgorPlug-UDP%20(AVR)_eng.htm IgorPlug-UDP AVR] - Ethernet &amp;amp; UDP/IP in Software implementiert&lt;br /&gt;
* [http://members.home.nl/bzijlstra/software/examples/RTL8019as.htm] RTL8019 Bascom&lt;br /&gt;
* [http://members.home.nl/bzijlstra/software/examples/RTL8019as.htm AVR und RTL8019]&lt;br /&gt;
* [http://avr.auctionant.de/avr-ip-webcam AVR IP Webcam] &lt;br /&gt;
* http://mikrocontroller.cco-ev.de/de/webcam.php&lt;br /&gt;
* [http://avr.auctionant.de/avrETH1/ avrETH1 - Webserver mit enc28j60 und Webcam-Support]&lt;br /&gt;
* [http://www.sics.se/~adam/uip/ uIP-Stack, Teil des Contiki OS]&lt;br /&gt;
* [http://www.sics.se/~adam/lwip/ LwIP-Stack]&lt;br /&gt;
* [http://www.harbaum.org/till/spi2cf/ WLAN-Implementierung auf Basis einer PRISM-CF-Karte und uIP]&lt;br /&gt;
* http://www.circuitcellar.com/AVR2006/winners/DE/AT2581.htm MEGA128(CAN) PCMCIA&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c2_ICnova-Module.html AVR32 AP7000 Linux Board] mit 2xEthernet, TFT, Audio, SDCARD, USB-Host/Devive, Funk...&lt;br /&gt;
* [https://berlin.ccc.de/wiki/AVR-Board_mit_Ethernet AVR-Board mit Ethernet mit dem ENC28J60 von Microchip]&lt;br /&gt;
* [http://www.roland-riegel.de/mega-eth/ AVR-Ethernet-Board mit extra SRAM, SD/MMC, USB und zugehöriger Software]&lt;br /&gt;
&lt;br /&gt;
===== CAN =====&lt;br /&gt;
* [http://www.canathome.de/ Can@Home] - CAN als &amp;quot;Installationsbus&amp;quot;, u.a. mit AVRs (D)&lt;br /&gt;
* [http://www.iuse.org/ www.iuse.org] - Hausautomatisierung auf CAN Basis&lt;br /&gt;
* [http://www.port.de/ www.port.de] - Professionelle CAN/CANopen Entwicklungswerkzeuge&lt;br /&gt;
* [http://can-wiki.info CAN-WIKI] - spezielle Wiki Site für CAN bus (Englisch)&lt;br /&gt;
* [[CAN-Bus]] - Eintrag in diesem Wiki&lt;br /&gt;
* [[CAN als Hausbus]] - Eintrag in diesem Wiki&lt;br /&gt;
* [http://www.canhack.de/ www.canhack.de] - Ein Forum, dass sich mit dem CAN bus im Auto beschäftigt&lt;br /&gt;
* [http://www.edevices.lt/  www.edevices.lt ] - USB2CAN inexpensive USB to CAN bus converter&lt;br /&gt;
&lt;br /&gt;
===== USB =====&lt;br /&gt;
* [http://www.embedded-it.de/microcontroller/microcontroller-module.php eUSB-162 und eUSB-LCD] - At90USB162 basiertes universelles USB Prototypen / Mikrocontroller Modul und USB Terminal Interface für HD44780 kompatible LCDs auf Basis der Lufa Library&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm Igor-Plug] - USB Device interface in AVR Firmware - no extra Interface IC needed, read the License&lt;br /&gt;
* [http://www.obdev.at/products/vusb/index-de.html V-USB] &amp;amp;#8211; USB-Implementation in C nach gleichem Prinzip wie Igor-Plug, aber einfacher zu verwenden, GPL-ähnliche Lizenz (Nutzung des Projekts &#039;&#039;erfordert&#039;&#039; Veröffentlichung), englisch kommentierter Code&lt;br /&gt;
* [http://www.xs4all.nl/~dicks/avr/usbtiny/ USBTiny] &amp;amp;#8211; weitere Software-USB-Implementierung in C; sehr ähnlich AVR-USB; steht aber unter GPL; relativ wenige Beispiele&lt;br /&gt;
* MJoy USB Joystick Controller on AVR ATmega8&lt;br /&gt;
* [http://www.ime.jku.at/tusb/ TUSB3210-Controller, HID, LIBUSB] Ein Projektseminar, in dem es darum ging, die USB-Schnittstelle des TUSB3210 zu aktivieren und die Daten eines ADC an den PC zu senden. USB-Implementierung für µC und PC.&lt;br /&gt;
* [http://www.b-redemann.de Steuern und Messen mit USB - FT232, 245 und 2232] Das aktuelle Buch zu den USB-Controllern von FTDI. Viele Beispielprogramme in C, zwei Projektbeschreibungen: I²C-Bus mit LM75A und ein Web-Projekt. Bauteilesatz und USB-Modul mit dem FT2232 zum schnellen Einstieg in die Thematik. Buch / Teilesatz über Segor oder dieser Seite erhältlich.&lt;br /&gt;
* [http://www.eltima.com/products/usb-over-ethernet/ USB to Ethernet Connector] - Share your USB devices via LAN/Internet&lt;br /&gt;
* [http://www.ixbat.de Viele kleine USB Projekte] Rund um die Bibliothek usbn2mc http://usbn2mc.berlios.de. Dies ist eine einfache Bibliothek für den USBN9604/03 von National Semiconductor&lt;br /&gt;
* [http://www.rahand.eu Mega8D12] - Schritt für Schritt zum virtuellen COM-Port. Ein Einsteiger-Tutorial zur CDC-Klasse mit Schaltung und Firmware (ATmega8 und PDIUSBD12).&lt;br /&gt;
* http://www.maares.de/tools USB_ISO: Isolierter Schnittstellenwandler USB auf RS232 (TTL) mit FT232RL und ADUM1402. Galvanische Trennung für das Zielsystem.&lt;br /&gt;
* [http://www.embedded24.net USB HID Host Treiber] - USB HID Treiber DLL für Windows (Demo Projekte für Visual Studio 2010 C++, C# und VB).&lt;br /&gt;
&lt;br /&gt;
===== DMX512 =====&lt;br /&gt;
* [http://www.hoelscher-hi.de/hendrik/light/profile.htm Hennes Sites] Bauanleitungen für DMX-Dimmerpacks, DMX-Switchpacks, PWM-Controller, ... Tutorial für Senden und Empfangen von DMX-Daten mit AVRs.&lt;br /&gt;
* [http://www.lj-skinny-development.de/lj2000/ DMX Lichtanlage im Selbstbau] Projekt für den Selbstbau einer kompletten Lichtanlage zur Steuerung über DMX. Projekt beinhaltet alles was man für den Betrieb einer eigenen Lichtanlage benötigt (Mischpult, Steuersoftware, Dimmer, Scanner mit Iris, Shutter-Dimmer, 2 rotierenden Goborädern, 2 Farbrädern, CMY-Farbmischeinheit, Prisma, Fokus ...).&lt;br /&gt;
* [http://digital-enlightenment.de Digital Enlightenment ]Verschiedene DMX-Selbstbauprojekte&lt;br /&gt;
&lt;br /&gt;
===== PS2 =====&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_id=1086&amp;amp;item_type=project&amp;amp;timestamp=2007-09-04%2018:34:41 PC keyboard to an AVR]&lt;br /&gt;
&lt;br /&gt;
===== LANC =====&lt;br /&gt;
* [http://dsc.ijs.si/3dlancmaster/ 3D LANC Master from Damir Vrancic] is a device which keeps in synchronisation some of Sony camcorders by using LANC (CONTROL-L, ACC) protocol. (Open Hardware + Open Source, Atmega8).&lt;br /&gt;
* [http://jochendony.homeip.net/content/view/22/26/ LANC Lib] for AVRGCC. Read and write LANC commands.&lt;br /&gt;
* [http://blog.makezine.com/archive/2008/12/controlling_sony_camcorders_with_th.html Controlling Sony camcorders with the Arduino]&lt;br /&gt;
&lt;br /&gt;
===== MMC/SD-Card =====&lt;br /&gt;
* [http://www.roland-riegel.de/sd-reader/index.html MMC/SD card reader example application] von Roland Riegel (Atmega8, Atmega168 für FAT16)&lt;br /&gt;
* [http://www.captain.at/electronic-atmega-mmc.php MMC Flash] bzw.  [http://www.captain.at/electronic-atmega-sd-card.php SD Flash ] Memory Extension für Atmegas von Captain. (Atmega16, Atmega32)&lt;br /&gt;
* http://arm.hsz-t.ch MMC, SD, SDHC Kartentreiber für ARM7 Mikrocontroller&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/FAT32 Wiki und FAT16/32 Bibliothek für atmega]&lt;br /&gt;
&lt;br /&gt;
==== LC-Displays ====&lt;br /&gt;
&lt;br /&gt;
===== Text (character-mode) HD44780 =====&lt;br /&gt;
* [http://jump.to/fleury P.Fleury]&lt;br /&gt;
* avrfreaks Projekt 59 (Chris E.) und andere&lt;br /&gt;
* Procyon avrlib v. Pascal Slang (GPL)&lt;br /&gt;
* Bray&lt;br /&gt;
* [http://www.sprut.de/electronic/lcd/index.htm Spruts LCD-Seite]&lt;br /&gt;
* [http://elm-chan.org/docs/lcd/lcd3v.html Standard-LCD auf 3V betreiben (eng)]&lt;br /&gt;
* [http://www.harbaum.org/till/lcd2usb LCD2USB, LCD mit AVR am USB betreiben]&lt;br /&gt;
* [http://www.simon-brenner.ch/projekte/lcd-display 4x40 LCD Projekt, Microchip]&lt;br /&gt;
&lt;br /&gt;
===== Grafik T6963C etc. =====&lt;br /&gt;
&lt;br /&gt;
* http://www.holger-klabunde.de/avr/avrboard.htm#t6963&lt;br /&gt;
* [[Projekt T6963-LCD-Ansteuerung]] nur PC, keine Änderung seit Juli 2006&lt;br /&gt;
* avrfreaks.net - TOSHIBA_LCD_T6963C, AVR Graphics&lt;br /&gt;
* http://www.mikrocontroller.net/topic/48456 C&lt;br /&gt;
* http://www.mikrocontroller.net/topic/54563 C&lt;br /&gt;
* http://www.mikrocontroller.net/topic/48584 ASM&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430/viewtopic.php?t=47 Grafik LCDs] - 128 x 112 Grayscale für MSP430 und andere uCs.&lt;br /&gt;
* http://www.display3000.com/ Farb-TFT-Module inkl. Mikrocontroller (ATMega128; ATMega2561 und AT90CAN128)&lt;br /&gt;
* [http://www.tklinux.de/sed1330.html SED1330 an ATMega]. Library für SED 1330 controller an ATmega&lt;br /&gt;
In der Codesammlung gibt es auch für andere Controller was.&lt;br /&gt;
&lt;br /&gt;
===== Siemens S55/C60 =====&lt;br /&gt;
* [http://www.module.ro/siemens_lcd.html S55-Display Pinbelegung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/22643 Forumbeitrag]&lt;br /&gt;
&lt;br /&gt;
===== Siemens S65/M65/CX65 =====&lt;br /&gt;
* [http://www.superkranz.de/christian/S65_Display/DisplayIndex.html S65-Display] vom Siemens S65/M65/CX65, 132x176 Pixel, 65536 Farben, günstig als Ersatzteil zu bekommen.&lt;br /&gt;
&lt;br /&gt;
===== Nokia 3210/3310 =====&lt;br /&gt;
* [http://www.jtronics.de/avr-projekte.html Bibliothek für Nokia 3310 Lcd Ansteuerung in &amp;quot;C&amp;quot; von http://www.jtronics.de - sehr gut (aktualisiert 2010)]&lt;br /&gt;
* [http://www.microsyl.com MicroSyl.Com]&lt;br /&gt;
&amp;lt;!-- * [http://www.microsyl.com/nokialcd/shematic.gif Belegung] --&amp;gt;&lt;br /&gt;
* [http://www.deramon.de/nokia3310lcd.php Deramon.de]&lt;br /&gt;
&amp;lt;!-- [[Bild:Beispiel.jpg]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Nokia 6100 LCD =====&lt;br /&gt;
&amp;lt;!-- * [http://www.apetech.de/article.php?artId=3&amp;amp;nnId=12 Nokia 6100 LCD Library] für Nokia-Displays 132x132 Pixel, 4096 Farben mit Philips Controller (bei eBay ziemlich preiswert zu ersteigern) --&amp;gt;&lt;br /&gt;
* [http://www.myplace.nu/mp3/download/download.php Yampp 7 Software Download Seite]: Archiv &amp;quot;yampp-7 with colour LCD firmware&amp;quot; enthält avr-gcc/avr-as Routinen für 6100-LCDs mit Philips- oder Epson-Controller (nicht direkt eine &amp;quot;Library&amp;quot;)&lt;br /&gt;
*[http://www.e-dsp.com/controlling-a-color-graphic-lcd-epson-s1d15g10-controller-with-an-atmel-avr-atmega32l/ S1D15G10]: Routine code für den Epson S1D15G10 Controller&lt;br /&gt;
*[http://thomaspfeifer.net/nokia_6100_display.htm Nokia 6100 Display am AVR] Anzeige von RGB-Bildern (für avr-gcc)&lt;br /&gt;
*[http://www.optixx.org/ www.optixx.org] Code zur Ansteuerung von Philips und Epson&lt;br /&gt;
*[http://www.zipfelmaus.com/nokia6100lcd_en/ http://www.zipfelmaus.com/nokia6100lcd_en/] --&amp;gt; unter Download: Tool zum Konvertieren von BMPs in h-Files zum Ausgeben auf dem Display&lt;br /&gt;
&lt;br /&gt;
===== KS0108 =====&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib Procyon avrlib (GPL)]&lt;br /&gt;
* avrfreaks UP&lt;br /&gt;
* apetech.de nicht mehr erreichbar http://www.mikrocontroller.net/topic/68316&lt;br /&gt;
&lt;br /&gt;
====GPS====&lt;br /&gt;
* http://www.holger-klabunde.de/avr/avrboard.htm#GPSdisplay GPS-Daten auf LCD&lt;br /&gt;
* [http://www.geoclub.de/forum57.html www.geoclub.de] - Elektronik beim Geocaching&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430/viewtopic.php?t=22 passworld.co.jp] - Do It Yourself GPS&lt;br /&gt;
&lt;br /&gt;
== [[8051|8051 / MCS51]] ==&lt;br /&gt;
* [http://mcu8051ide.sourceforge.net/ MCU 8051 IDE] - MCU 8051 IDE is a new modern graphical IDE for microcontrollers based on 8051. MCU 8051 IDE is noncommercial open-source software for Linux.&lt;br /&gt;
* [http://www.rakers.de/catalog Dr. Rakers] Entwicklungssystem mit C-Compiler, BASIC-Compiler und Makroassembler für alle 8051-Mikrocontroller (80C552, 80C515(C), 80C537). Auch für Hobbyisten bezahlbar.&lt;br /&gt;
* [http://www.progshop.com/versand/software/prog-studio/index.html Prog-Studio] - Moderne Assembler Entwicklungsumgebung für 8051 Mikrocontroller mit Debugger, Edit &amp;amp; Continue, Code-Folding, Intelli-Sense, Monitorung und mehr&lt;br /&gt;
* [http://www.yCModule.de yCModule: µController-Systeme] - Preisgünstige µController-Module, ISP-Programmiertools und Applikationsboards&lt;br /&gt;
* [http://www.erikbuchmann.de/ Erik Buchmanns Mikrocontroller-Seite] - Assemblerkurs und mehrere Projekte&lt;br /&gt;
* [http://www.holger-klabunde.de/projects/8051.htm Experimentierboard für 8051 Controller] von Holger Klabunde.&lt;br /&gt;
* [http://www.woe.de.vu/ World Of Electronics] - Projekte mit den 8051-Controllern von Atmel&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/8051/8051.html Controllerplatine mit SAB80C535]&lt;br /&gt;
* [http://www.maxim.ph.tc Selbstbau-Programmer] für 2051er&lt;br /&gt;
* [http://www.nomad.ee/micros/8052bas.html 8052 BASIC Projects] - IDE-Interface&lt;br /&gt;
* [http://home.t-online.de/home/s.holst/sh51/index.html Mikrokontroller sh51] Schaltplan für 80C535-Board&lt;br /&gt;
* 8051-Makroassembler [http://plit.de/asem-51/ ASEM-51] (Freeware)&lt;br /&gt;
* [http://sdcc.sourceforge.net/ SDCC - Small Device C Compiler] - freier ANSI-C compiler für Intel 8051, Maxim DS80C390 und Zilog Z80 kompatible Controller.&lt;br /&gt;
* [http://sdccokr.dl9sec.de/ The SDCC Open Knowledge Resource]&lt;br /&gt;
* [http://www.wickenhaeuser.de/ Wickenhäuser C Compiler] - Preisgünstiger C Compiler&lt;br /&gt;
* [http://home.tiscali.cz:8080/~cz056018/lanc_a.htm LANC-Remote] Projekt von Ji&amp;amp;#345;í &amp;amp;#352;mach zur Steuerung von Videorekordern oder Camcordern über das Control-L (LANC) Protokoll mit Hilfe eines AT89C2051.&lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter-Kits für verschiedene Microcontroller (D) preisgünstige Platinen (ab 12,95 Euro für AT89S8252). Beim uC-Dualboard : Das Board ist nutzbar mit AVR-Controllern und 8051-Controllern!&lt;br /&gt;
* [http://turbo51.com Turbo51 - Free Pascal compiler for 8051]&lt;br /&gt;
* [http://self8051.de/ self8051.de] - Dein Nachschlagewerk - Befehlsreferenz, Eigenschaften, Derivate&lt;br /&gt;
* [http://cmon51.sourceforge.net/ CMON51] - freier Onboard Monitor und Debugger, anpassbar an unterschiedliche 8051 kompatible Mikrocontroller&lt;br /&gt;
* [http://et-tutorials.de/632/kostenloser-mikrocontroller-kurs/ Mikrocontroller Video Tutorial] Video-Tutorial für Einsteiger (C-Kurs + Einführung 8051)&lt;br /&gt;
&lt;br /&gt;
== MSP430 ==&lt;br /&gt;
* [http://www.mikekohn.net/micro/naken430asm_msp430_assembler.php naken430msp] -   MSP430 Assembler von Michael Kohn (GPL)&lt;br /&gt;
* [http://www.mathar.com MSP430 Tutorials] - Tutorials, Anleitungen und viele Beispielprojekte mit dem MSP430-Mikrocontroller&lt;br /&gt;
* [http://www.student-zw.fh-kl.de/~stwi0001/imp/msp430/pwm430/index.htm Pulsweitenmodulation mit dem MSP430] - sehr ausführliche Einführung&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/msp430/msp430.html Kleine Projekte mit dem MSP430] - Schaltplan und Layout zu einem MSP430F149-Board und einem ADXL-G-Sensor mit MSP430&lt;br /&gt;
* [http://tinymicros.com/embedded/MSP430/ The MSP430 Bugspray Database] - umfangreiche Datenbank für Bugs in MSP430-Controllern&lt;br /&gt;
* [http://msp430.info MSP430.info] - Portalseite für MSP430; Info, Projekte (MIDI, USB)&lt;br /&gt;
* [http://groups.yahoo.com/group/msp430 Yahoo group MSP430] - lebhaftes Forum mit vielen MSP430-Experten&lt;br /&gt;
* [http://homepage.hispeed.ch/py430/mspgcc/ mps430-gdb und Eclipse] - Eine Anleitung von Chris Liechti&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430 Forum MSP430] - Projekte mit MSP430 (GPS, BlueTooth usw...)&lt;br /&gt;
* TI Design-Wettbewerb: http://www.designmsp430.com/View.aspx (Dateien liegen evtl. in /projects/) [2011-01-24: redirect zum TI Wiki, Projekte nicht mehr vorhanden]&lt;br /&gt;
* [http://www.sics.se/project/mspsim MSPsim] - a Java-based simulator of MSP430 sensor network platforms (BSD License (revised))&lt;br /&gt;
* [http://develissimo.net/de/msp430entwicklung MSPGCC + Eclipse + msp430-gdbproxy / Linux / Debian / Ubuntu] - Anleitung / Tutorial zur Installation der MSPGCC Toolchain + Eclipse + msp430-gdbproxy für Linux / Debian / Ubuntu Lang=Deutsch und Englisch&lt;br /&gt;
* [http://travisgoodspeed.blogspot.com/ Travis Goodspeed&#039;s Blog] - Home of the [http://goodfet.sourceforge.net/ GoodFET] Programmer&lt;br /&gt;
* [http://www.43oh.com/ Four-Three-Oh!]&lt;br /&gt;
* [http://thinkembedded.ch/MSP430:::10.html Webshop mit MSP430 Olimex Demoboarden und Programmer]&lt;br /&gt;
&lt;br /&gt;
=== MSP430 Launchpad ===&lt;br /&gt;
* [http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_(MSP-EXP430G2)?DCMP=launchpad&amp;amp;HQS=Other+OT+launchpadwiki MSP430 LaunchPad Wiki] bei TI&lt;br /&gt;
* [http://hackaday.com/2010/08/11/how-to-launchpad-programming-with-linux/ How-to: Launchpad programming with Linux] auf hackaday.com&lt;br /&gt;
* [http://springuin.nl/en/articles/launchpadwindows TI Launchpad programming and debugging with Open Source tools on Windows] (Eclipse, MSPGCC4, Insight, msp430-gdbproxy)&lt;br /&gt;
* [http://osx-launchpad.blogspot.com/ MSP430 LaunchPad toolchain for Mac OS X]&lt;br /&gt;
&lt;br /&gt;
=== EZ430 Chronos ===&lt;br /&gt;
* [http://processors.wiki.ti.com/index.php/EZ430-Chronos?DCMP=Chronos&amp;amp;HQS=Other+OT+chronoswiki EZ Chronos Wiki] bei TI&lt;br /&gt;
&lt;br /&gt;
== ARM ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
* [http://www.arm.com ARM] - Entwickler des ARM-Prozessorkerns (kein Hersteller von ICs)&lt;br /&gt;
* [http://infocenter.arm.com ARM Infocenter] Sammlung Technischer Informationen&lt;br /&gt;
&lt;br /&gt;
* [http://www.analog.com/ Analog Devices] ADuC7xxx ARM7TDMI Serie unter &#039;&#039;Analog Microcontrollers&#039;&#039;&lt;br /&gt;
* [http://www.atmel.com/products/AT91/ Atmel AT91 Startseite]&lt;br /&gt;
* [http://www.at91.com AT91.COM] - Atmel ARM Informationsseite (Forum, Beispielcodes etc.)&lt;br /&gt;
* [http://www.cirrus.com/en/products/pro/techs/T7.html Cirrus Logic]&lt;br /&gt;
* [http://www.energymicro.com/ Energy Micro] EFM32 mit Cortex M0+,M3,M4&lt;br /&gt;
* [http://www.freescale.com/mac7100 Freescale MAC7100]&lt;br /&gt;
* [http://www.hilscher.com Hilscher netX] (ARM926 core)&lt;br /&gt;
* [http://www.infineon.com/cms/en/product/microcontrollers/32-bit-industrial-microcontrollers-based-on-arm-registered-cortex-tm-m/channel.html?channel=db3a30433c1a8752013c3e221b9d004f Infineon XMCxxxx] Cortex M0,M4&lt;br /&gt;
* [http://www.intel.com/design/intelxscale/ Intel XSCALE Startseite], siehe auch [http://www.marvell.com/ Marvell]&lt;br /&gt;
* [http://www.luminarymicro.com/ Luminiary Micro (TI)] Controller mit Cortex M3 core&lt;br /&gt;
* [http://www.standardics.nxp.com/microcontrollers/ NXP (ehemals Philips) Microcontroller Startseite] für sämtliche Mikrocontroller (ARM7, ARM9, Cortex-M0, -M3, MCS51 etc.), neben LPC2000, LPC3000 auch die LH7xxxx BlueStreak-Serie (ehemals Sharp Microelectronics)&lt;br /&gt;
* [http://www.lpc2000.com lpc2000.com] Infoseite für NXP (ex. Philips) LPC1700 Cortex-M3 basierende Typen, LPC2000, ARM7 basierende Typen und LPC3000, ARM9 basierende Typen. Auch andere Cortex-M3 Bausteine sind erfasst&lt;br /&gt;
* [http://www.okisemi.com/eu/1.Products/ARM32bit.html OKI ARM-Controller Startseite]&lt;br /&gt;
* [http://www.samsung.com/Products/Semiconductor/ Samsung] ARM7/9 unter &#039;&#039;Mobile SoC&#039;&#039;&lt;br /&gt;
* [http://mcu.st.com/mcu/ STMicroelectronics (ST) Microcontroller Startseite] u.a. STR7, STR9, STM32 Support-Forum&lt;br /&gt;
* [http://www.ti.com/ Texas Instruments] TMS470 ARM7TDMI Serie&lt;br /&gt;
* [http://www.toshiba.com/taec/ Toshiba] Controller mit ARM9 und Cortex-M3 core&lt;br /&gt;
&lt;br /&gt;
=== Information (Foren, Mailinglisten, Linksammlungen) ===&lt;br /&gt;
* [http://forum.energymicro.com Lizard Lounge -] Energy Micros Forum für EFM32&lt;br /&gt;
* [http://m8051.blogspot.no/2012/11/efm32-low-power-series-part-2-low-power.html Blog über Low Power Modes der EnergyMicro uC]&lt;br /&gt;
* [http://www.neko.ne.jp/~freewing/cpu/arm_olimex/ Freewing Linksammlung] zu den NXP (ex. Philips) LPC-ARM7-Controllern (Assemblerbeispiele u.a. für Nokia 3310-GLCD)&lt;br /&gt;
* [http://www.open-research.org.uk/ARMuC ARM Microcontroller Wiki]&lt;br /&gt;
* [http://arm.hsz-t.ch arm.hsz-t.ch] Einfühung in ARM7 Mikrocontroller und uClinux.&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/ADuC7000/ ADuC7000 Yahoo-Group]&lt;br /&gt;
* [http://www.at91.com AT91 Forum] (Atmel Rousset)&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/AT91SAM/ AT91SAM Yahoo-Group]&lt;br /&gt;
* [http://en.mikrocontroller.net/forum/17 arm-elf-gcc WinARM Forum] (auch für Yagarto)&lt;br /&gt;
* [http://www.codesourcery.com/archives/arm-gnu/maillist.html Sourcery G++ Lite Edition User Forum/Mailing-List]&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/gnuarm/ GNUARM Yahoo-Group]&lt;br /&gt;
* [http://www.keil.com/forum/ Keil/ARM Forum]&lt;br /&gt;
* [http://groups.yahoo.com/group/lpc2000/ LPC2000 Yahoo-Group]&lt;br /&gt;
* [http://www.mcu-related.com MCU related] Neuigkeiten zu MCUs, überwiegend ARM / Cortex-M3 basierend mit Vergleichen von RTOS und anderen Entwicklungstools&lt;br /&gt;
* [http://forum.sparkfun.com/ Sparkfun Foren]&lt;br /&gt;
* [http://mcu.st.com/mcu/modules.php?name=Splatt_Forums STMicroelectronis Forum]&lt;br /&gt;
* [http://www.stm32circle.com/ Forum for STM32 moderated by Raisonance] Sehr viele Beispielprogramme in Source fuer STM32 und den Primer2 von Raisonance&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungswerkzeuge (Compiler/Assembler/Debugger/Tools) ===&lt;br /&gt;
==== IDEs ====&lt;br /&gt;
* [http://www.st-angliamicro.com/software.asp Anglia Idealist IDE und Anglia Toolchain] GNU toolchain für Win32-hosts inkl. Beispielen für STR7, STR9 und STM32. IDE kostenlos aber registrierungspflichtig&lt;br /&gt;
* [http://atollic.com/ attolic] TrueSTUDIO&lt;br /&gt;
* [http://devkitpro.org/ devkitPro/devkitARM] GNU-Toolchain für MS-Windows &amp;quot;Hosts&amp;quot;. Vor allem auf GBA abgestimmt aber auch für andere ARM-Controller geeignet&lt;br /&gt;
* [http://www.itrgmbh.de/ecos-toolchain/ EmbOrigin] Integrierte Cross Entwicklungsumgebung für die Anwendungsentwicklung unter eCos (RTOS kernel) für ARM Prozessoren. Highlights: eCos Kernel Aware Debug Features. Trial Version verfügbar [http://tiprom.itrgmbh.com/projects/itr-products-ecos-toolchain/ Support,Download]&lt;br /&gt;
* [http://www.ghs.com/ Green Hills Software]&lt;br /&gt;
* [http://www.hitex.de Hitex] IDE für diverse Compiler, Debugger&lt;br /&gt;
* [http://www.iar.com IAR] Embedded Workbench, kommerzielle IDE/Compiler, codegrößenbeschränkte Evaluierungsversion verfügbar&lt;br /&gt;
* [http://www.isystem.com/ iSYSTEM] Integrated Development Environment, USB/JTAG interface, OnChip Emulation and Trace&lt;br /&gt;
* [http://www.keil.com Keil/ARM MDK-ARM] kommerzielle IDE/Compiler, unterstützt zwei Compiler (ARM RealView, GNU/gcc), codegrößenbeschränkte Evaluierungsversion verfügbar (IDE/Compiler unbeschränkt für GNU), guter Debugger, sehr guter Simulator, Simulator und Debugger in der Evaluierungsversion auch bei Nutzung der GNU-Toolchain mit Größenbeschränkung&lt;br /&gt;
* [http://mct.de/download.html#free MCT Demoversion C-Compiler für ARM und 68k] ARM C-Compiler basiert auf GCC laut Herstellerinformation jedoch mit Codegrößenbeschränkung &amp;lt;!-- etwas ungewöhnlich: Codegrößenbeschränkung bei GNU-Toolchain --&amp;gt;&lt;br /&gt;
* [http://www.mpeforth.com www.mpeforth.com] - A free Forth system with 125 page manual for all Philips LPC2xxx CPUs with at least 64k Flash and 16k RAM and cystal frequency of 10, 12, or 14.7456 MHz. &lt;br /&gt;
* [http://www.raisonance.com/ Raisonance] Ride, RKit-ARM&lt;br /&gt;
* [http://www.rowley.co.uk/ Rowley] Kommerzielle IDE für GNU-Compiler, eigene libc (nicht newlib), Debugger (inkl. gutem Support für Wiggler)&lt;br /&gt;
* [http://h-storm.tantos.homedns.org/gcc_arm.htm Tantos gcc for ARM Targets] eine weitere ARM-GNU-Toolchain für MS-Windows &amp;quot;Hosts&amp;quot; &lt;br /&gt;
* [http://www.yagarto.de Yagarto] GNU arm-eabi-Toolchain, Eclipse, OpenOCD für Win32 inkl. Setup&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html#winarm WinARM] eine an WinAVR angelehnte Sammlung von Entwicklungswerkzeugen (binutils, arm-elf-gcc, newlib, &#039;&#039;newlib-lpc&#039;&#039;, Programmers Notepad, &#039;&#039;Beispiel-Makefiles und Beispielcode&#039;&#039;) für alle ARM-Controller. Beispiele für Philips LPC2000 und Atmel AT91SAM7S (ARM7TDMI) u.a.&lt;br /&gt;
* [http://code.google.com/p/dissy/ Dissy] is a disassembler for Linux and UNIX which supports multiple architectures and allows easy navigation through the code. Dissy is implemented in Python and uses objdump for disassembling files.&lt;br /&gt;
* [http://www.sinelabore.com sinelaboreRT] - generiert leicht lesbaren C-Code aus einer Zustandsmaschine. Die Generierung berücksichtig speziell die Bedürfnisse eingebetteter Echtzeitsysteme.&lt;br /&gt;
* http://arm.hsz-t.ch Entwicklungsumgebung für ARM7 Mikrocontroller basierend auf der Knoppix CD. Keine Harddisk installation nötig für uClinux.&lt;br /&gt;
&lt;br /&gt;
==== HW Debugger/Programmer ====&lt;br /&gt;
* [http://openocd.berlios.de/web/ OpenOCD] Open On-Chip Debugger: Schnittstelle (&amp;quot;gdb-Server&amp;quot;) zwischen verschiedenen JTAG-Interfaces (u.a. auf FTDI2232-Basis, &amp;quot;Wiggler&amp;quot;-ParPort und andere) und GNU-debugger (gdb/Insight-gdb) Flash-Programmierfunktion für LPC2k, AT91SAM7S, LM3S, STM32 und viele andere interne und externe Flashspeicher (Open Source, GPL, unter anderem auf MS Windows und Linux lauffähig)&lt;br /&gt;
* [http://macraigor.com/full_gnu.htm OCDLibRemote] Schnittstelle zwischen WIGGLER-kompatibler JTAG Hardware und dem GNU-Debugger (gdb)&lt;br /&gt;
* [http://gdb-jtag-arm.sourceforge.net/ GDB-JTAG-ARM] GDB JTAG Tools&lt;br /&gt;
* [http://jtagpack.sourceforge.net/ JTAG-Pack] GDB JTAG Tools&lt;br /&gt;
* [http://www.hjtag.com H-JTAG] RDI-Interface für Wiggler, Flash-Funktionen für diverse interne und externe Speicher&lt;br /&gt;
* [http://www.clibb.de/ lpc21isp] Flashutility für LPC21xx, ISP via &amp;quot;Bootloader&amp;quot; (&amp;quot;multiplattform&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
*[http://www.abatron.ch Abatron] BDI1000 &amp;amp; BDI2000, On-Chip Debuggers für ARM, 68k, Coldfire uvm.&lt;br /&gt;
* [http://www.amontec.com Amontec] JTAGkey, JTAGkey2(P): JTAG-Adapter auf Basis des FTDI2232(H) &lt;br /&gt;
* [http://www.hjtag.com/product_intro.html H-JTAG USB Emulator]&lt;br /&gt;
* [http://www.keil.com Keil/ARM ULINK/ULINK2/ULINK-ME] JTAG-Adapter, USB-Anschluss, wird von Keil uVision unterstützt, ULINK2 teilw. auch von Codesourcery G++ (lt. Hestellerangaben)&lt;br /&gt;
* [http://www.kristech.eu Kristech] USB-Scarab, JTAG Adapter, kommt mit eigener Debugger-UI, kompatibel zu Olimex&lt;br /&gt;
* [http://www.lauterbach.de Lauterbach] TRACE32 JTAG-Adapter, USB und Ethernet-Anschluss, eigene Software&lt;br /&gt;
* [http://www.olimex.com Olimex] JTAG-Adapter: Wiggler-Nachbau (ParPort) und  Adapter auf Basis des FTDI2232 (USB)&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ Olimex ARM-JTAG-COOCOX] CoLinkEx nachbau von Olimex (daher siehe CoLinkEx)&lt;br /&gt;
* [http://www.coocox.org/Colinkex.htm CoLinkEx] günstiger JTAG/SWD Programmer von Coocox.com, nicht alle uC unterstützt, siehe [http://www.coocox.org/Colinkex.htm Website], unterstützt,CoIDE, Keil MDK-ARM, IAR sowie Eclipse.&lt;br /&gt;
* [http://www.ronetix.at/peedi.html Ronetix Peedi]&lt;br /&gt;
* [http://www.segger.de Segger J-Link] JTAG-Adapter, USB-Anschluss, unterstützt z.&amp;amp;nbsp;B. von IAR, Keil uVision (via RDI) (OEM: IAR J-Link, SAM-ICE)&lt;br /&gt;
* [http://www.signalyzer.com/ Signalyzer] Signalyzer Tool, u.a. JTAG-Adapter auf Basis des FTDI2232&lt;br /&gt;
* [http://www.versaloon.com/ Simon Qians Versaloon]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials und Beispiele ===&lt;br /&gt;
* [http://www.dreamislife.com/arm/ LPC210x ARM7 Microcontroller Tutorial] - Assembler-Beispiele (arm-elf-as) für das Olimex LPC-MT-Board (Philips LPC2106 ARM7TDMI)&lt;br /&gt;
* [http://re-eject.gbadev.org/index.php gcc-Assembler für ARM] - Befehlsübersicht&lt;br /&gt;
* [http://patater.com/gbaguy/gbaasm.htm GBA ASM Tutorial] - ARM7 Assembler Tutorial mit arm-elf-as (&amp;quot;gcc&amp;quot;) (Allgemein und GBA)&lt;br /&gt;
* [http://www.robsite.de/daten/tutorials/devgba/gba_asm1.html GBA Assembler Tutorial] - ARM7TDMI, Schwerpunkt auf GBA&lt;br /&gt;
* [http://www.sparkfun.com/tutorial/ARM/ARM_Cross_Development_with_Eclipse.pdf Eclipse+CDT+gnuarm-Tutorial]&lt;br /&gt;
* [http://mct.de/download/armsamples/map.html Beispiele in C, für ARM7-Controller von Philips und ADI]&lt;br /&gt;
* [http://www.embedded.com/design/opensource/201802580 Embedded.com: Building Bare-Metal ARM Systems with GNU] Teil 10, Links zu den Teilen 1-9 auf der Seite&lt;br /&gt;
* [http://www.sparkfun.com/datasheets/DevTools/SAM7/at91sam7%20serial%20communications.pdf AT91SAM7 Serial Communications] von James P. Lynch (PDF, www.sparkfun.com)&lt;br /&gt;
* [http://www.kaczurba.pl/aduc ADuC7000 Tutorial] von Witold Kaczurba (www.kaczurba.pl)&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS mit Webcam ]&lt;br /&gt;
* [http://www.mySTM32.de Tutorial für das STM32F4 Discovery in C und C++ (UML)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] PDF&lt;br /&gt;
&lt;br /&gt;
=== Projekte und Quellcodebibliotheken ===&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/arm/armlib/ Procyon ARMlib-LPC2100] - Treiber, Beispiele (Lizenz: GPL, kaum weiterentwickelt)&lt;br /&gt;
* [http://www.standardics.nxp.com/support/documents/?type=software NXP BlueStreak] Code für LH7xxxx (ehemals Sharp)&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html M. Thomas&#039; ARM Projekte] &amp;quot;Projectvorlagen&amp;quot; für AT91SAM7 und LPC2000 mit GNU-Toolchain Einsteiger-Projekte für AT91SAM7, LPC2000, ADuC7000 u.a. (u.a. Blinky, UART, Interrupt, C++, GLCD mit KS0108, DS18x20, DCF77, Anpassungen von FAT16/32-Libraries) &amp;lt;!-- noch mehr &amp;quot;Eigenwerbung&amp;quot; --&amp;gt;&lt;br /&gt;
* [http://mcu.st.com/ STMicro] Treiber und Beispiel für STR7, STR9 und STM32&lt;br /&gt;
* [http://wiki.sikken.nl/index.php?title=LPCUSB LPCUSB] - Open-source [[USB]] stack for the built-in USB controller in LPC214x microcontrollers von Bertrik Sikken. [http://lpcusb.cvs.sourceforge.net/lpcusb/host/benchmark/main.c?revision=1.2&amp;amp;view=markup Sample code]&lt;br /&gt;
* [http://www.olimex.com Olimex] Einige Beispiele auf den &amp;quot;Produktseiten&amp;quot; der ARM Boards.&lt;br /&gt;
* [[ARM MP3/AAC Player]]&lt;br /&gt;
* [http://www.jcwren.com/arm/ J.C. Wrens Beispielprojekt] für LPC214x&lt;br /&gt;
* [http://www.keil.com/download/list/arm.htm Beispiele von Keil] abgestimmt auf deren Boards und Realview-Toolchain, Portierung auf andere Boards und Compiler relativ einfach, Lizenz beachten.&lt;br /&gt;
* [http://www.luminarymicro.com/ Luminary Micro Driverlib] für Stellaris Cortex-M3&lt;br /&gt;
* [http://r2d2.stefanm.com/gps-tracker.html GPS-Tracker] mit Navigation auf LPC2103-Basis (Complier: GCC)&lt;br /&gt;
* [http://elua.berlios.de elua] Lua für ARM-controller&lt;br /&gt;
* [http://freemodbus.berlios.de/ FreeMODBUS] &amp;quot;A Modbus ASCII/RTU and TCP implementation&amp;quot; (für STR71x, AT91SAM7, LPC214x, auch: AVR, MSP430 u.a.)&lt;br /&gt;
* [http://bettyhacks.com BettyHacks] Freie Firmware für die &amp;quot;interaktive TV-Fernbedienung&amp;quot; betty-tv (ARM7tdmi, 2MB Flash, 160 x 128 Pixel 2 bit LCD, CC1100, IR, Lautsprecher,..)&lt;br /&gt;
*[http://cdn.energymicro.com/dl/zip/Simplicity_Studio_Setup.exe Download Simlicity Studio], Tool mit vollständiger Dokumentation und vielen Beispielen zu Energy Micro EFM32 Cortex M0+/M3/M4 uC.&lt;br /&gt;
&lt;br /&gt;
=== Betriebssysteme ===&lt;br /&gt;
* [http://agnix.sourceforge.net/ Agnix]&lt;br /&gt;
* [http://www.bertos.org/ BeRTOS] is a completely free, open source, real time operating system (RTOS) suitable for embedded platforms. Runs on many microprocessors and microcontrollers, ranging from 8 bits to 32 bits CPUs and even PCs. &lt;br /&gt;
* [http://www.chibios.org/ ChibiOS/RT]&lt;br /&gt;
* [http://www.stm32circle.com/resources/upgrade.php Circle-OS for STM32] Kostenloses OS, sehr klein mit Basisfunktionen fuer STM32&lt;br /&gt;
* [http://coocox.org/ CoOS]&lt;br /&gt;
* [http://sources.redhat.com/ecos/ eCos] - &amp;quot;Real-Time-Operating-System&amp;quot; o.a. auch für ARM7&lt;br /&gt;
* [http://www.freertos.org/ FreeRTOS (.org!)] - &amp;quot;Real-Time-Kernel&amp;quot; unter anderem für ARM7 (LPC2xxx) auch AVR, MSP430, &#039;51er&lt;br /&gt;
* [http://sourceforge.net/projects/funkos/ FunkOS]&lt;br /&gt;
* [http://l4ka.org/ L4Ka]&lt;br /&gt;
* [http://developer.toradex.com/software-resources/arm-family/linux/source-code Linux für Toradex Module] basierend auf Intel XScale und Nvidia Tegra&lt;br /&gt;
* [http://www.linux4sam.org Linux4SAM] Informationen, Anleitungen und Code zur Anwendung von Linux auf AT91SAM9xxx&lt;br /&gt;
* [http://www.freertos.com/ NicheTask] (URL ist www.freertos.com aber hat nichts mit FreeRTOS(.org) zu tun)&lt;br /&gt;
* [http://www.ethernut.de/en/software/index.html Nut/OS] Echtzeitbetriebssystem für Mikrocontroller (ARM, AVR, AVR32, Cortex M3 u.A). Multitasking und vollständiger TCP/IP Stack inklusive. Leicht zu erlernen und viele Beispiele&lt;br /&gt;
* [http://nuttx.org/ NuttX RTOS] (ARM7TDMI port for TI TMS320C5471 also called a C5471 or TMS320DM180).&lt;br /&gt;
* [http://www.phoenix-rtos.org/ Phoenix-RTOS]&lt;br /&gt;
* [http://picoos.sourceforge.net/ PicoOS]&lt;br /&gt;
* [http://prex.sourceforge.net Prex] is a portable real-time operating system for embedded systems. The small, reliable, and low power kernel is written in the C language based on microkernel design. The file system, Unix process, and networking features are provided by user mode tasks. (ARM, i386, geplant: MIPS, PowerPC, Hitachi-SH und Win32)&lt;br /&gt;
* [http://www.rtems.org/ RTEMS]&lt;br /&gt;
* [https://github.com/RT-Thread/rt-thread rt-thread]&lt;br /&gt;
* [http://sourceforge.net/projects/scmrtos/ scmRTOS]&lt;br /&gt;
* [http://www.tnkernel.com/downloads.html TNKernel] - &amp;quot;Real-Time-Kernel&amp;quot; [[TNKernel]] ist ein kompakter und sehr schneller Echtzeitkernel unter anderem für ARM7 (Philips LPC2106/LPC21XX/LPC22xx, Samsung S3C44B0X, Atmel AT91SAM7S128, STMicroelectronics STR711FR2)&lt;br /&gt;
* [http://www.ucos-ii.com/ uC/OS-II RTOS]&lt;br /&gt;
&lt;br /&gt;
=== Hardware (Prototypen-Platinen etc.) ===&lt;br /&gt;
&amp;lt;!-- Veralteter Link; Shop verkauft &amp;quot;nichts&amp;quot; mehr * [http://www.knif-elektronik.de/index.php/cPath/27/category/industrie-module-/-bausaetze.html/ KNIF-elektronik] Preisgünstige Industriemodule und Bausätze z.B GPS, W-Lan, Kamera,Bluetooth uvm. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ist KEIN ARM-Board, falsche Rubrik! * [http://www.chip45.com/ chip45] Atmel AVR Module und Boards mit USB, RS232/485, CAN, Ethernet, Funkmodule, sowie ISP Programmieradapter --&amp;gt;&lt;br /&gt;
* [http://www.armkits.com/ Embest] Philips, Samsung und Atmel ARM Boards und Module, JTAG-Hard- und Software&lt;br /&gt;
* [http://www.waveplayer.de/ Embedded-Waveplayer] mit ARM7-Prozessor EP7309 (MIDI- und RS232-Steuerung)&lt;br /&gt;
* [http://www.embeddedartists.com/ Embedded Artists] bietet verschiedene preisgünstige Platinen (ab 25 Euro für LPC213x Familie)&lt;br /&gt;
* [http://www.embedded-it.de/microcontroller/microcontroller-module.php Embedded-IT] eNet-sam7X: Ethernut kompatible Embedded Ethernet Mikrocontroller Boards für Industrie und Hobby auf ARM mit Nut/OS Betriebssystem sowie USB Module auf AVR Basis&lt;br /&gt;
* [http://www.hiteg.com Hiteg] SAMSUNG und Intel XScale basierende boards. (Deutsches Unternehmen in China)&lt;br /&gt;
* [http://www.hitex.de/ Hitex] Starter-Kits für Philips LPC2000, ST STR7, Atmel AT91M&lt;br /&gt;
* [http://www.iar.com/ IAR] Starter-Kits für Atmel, Oki, Philips, ST und TI &lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c12_ICswift-Module.html ic-board.de] Kommunikationsplattform auf Basis des AT91SAM7X256 mit Ethernet, USB, CAN und Funk Schnittstellen&lt;br /&gt;
* [http://www.keil.com/ Keil] Philips LPC2000 und ST STR7/9 Boards und Starter-Kits&lt;br /&gt;
* [http://www.lpctools.com/ LPCTools] bietet verschiedene Starter Kits für die LPC2000-Familie&lt;br /&gt;
* [http://www.makingthings.com/ MakingThings] Make Controller Kit (AT91SAM7X256)&lt;br /&gt;
* [http://mct.de/index.html MCT Paul und Scherer] Starterkits für ARM7 (NXP LPC2000, ADI ADUC7000)&lt;br /&gt;
* [http://shop.mikrocontroller.net Mikrocontroller.net Shop] Platinen mit AT91SAM7, LPC2xxx, JTAG&lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter-Kits für verschiedene Microcontroller (D) preisgünstige Platinen (ab 12,95 Euro für LPC2129 und 2194) sowie Entwicklungsboard komplett bestückt&lt;br /&gt;
* [http://stores.ebay.de/Micro-Research Micro-Research] Development- und Header-Boards für LPC2000 und ADuC7000&lt;br /&gt;
* [http://www.olimex.com Olimex] Bulgarischer Anbieter günstiger ARM Prototypen- und Header-Boards (LPC2000, STR7, AT91SAM, ADI, TI, OKI u.a.)&lt;br /&gt;
* [http://www.propox.com/?lang=en Propox]&lt;br /&gt;
* [http://www.mcu-raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer2 from Raisonance] Focus auf STM32 mit sehr grossem Forum im STM32circle&lt;br /&gt;
* [http://www.revely.com/ Revely] Evaluations- und Demo-Boards mit Sharp ARM Controllern. Teilweise mit SVGA-Anschluss.&lt;br /&gt;
* [http://www.skpang.co.uk/catalog/index.php SKPang electronics] Entwicklungsboards für diverse ARM7/9 (UK)&lt;br /&gt;
* [http://www.dilnetpc.com SSV Embedded Systems] bietet verschiedene Starter Kits für die verschiedenen DIL/NetPC u.a. (A)DNP/9200 SBC mit AT91RM9200&lt;br /&gt;
* [http://www.taskit.de taskit] [https://www.ledato.de/shop_content.php?coID=10 Development- und Header-Boards für AT91SAM7S/X], AT91RM9200, AT91SAM9&lt;br /&gt;
* [http://www.toradex.com Toradex] ARM DevKits (XScale, Nvidia Tegra) (Schweiz)&lt;br /&gt;
* [http://thinkembedded.ch/ARM:::6.html Thinkembedded Webshop] Demoboarde,Debugger Cortex M (Schweiz)&lt;br /&gt;
&lt;br /&gt;
== [[PIC]] ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
* [http://www.microchip.com Microchip] Hersteller der PIC Microcontroller&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en010014&amp;amp;part=SW006011 Microchip C18 Student Edition] - die &amp;quot;Student Edition&amp;quot; des Microchip C18 C Compilers für die PIC18 Serie ist kostenlos verfügbar.&lt;br /&gt;
* [http://www.powercontact.de Elektronikentwicklung von Systemtechnik LEBER] Offizieller Microchip Design Partner für professionelles Microcontroller Design und Hersteller von Leistungsstellern, Thyristorstellern und Halbleiterelais...&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungstools / Tutorials / Foren  ===&lt;br /&gt;
* [http://www.osterer.co.at www.osterer.co.at] Entwicklungs-Board mit integrierten Programmer/Debugger für PIC18F4550.&lt;br /&gt;
* [http://www.martins-elektronikwelt.tk www.martins-elektronikwelt.tk] ICD1-Debugger-Nachbau im Kleinstformat u. SMD Technik (so groß wie eine halbe Scheckkarte).&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/index.htm PIC-Microchip-Controller (www.sprut.de)] Diese Seite soll dem Anfänger die ersten Schritte in die Welt der Microcontroller der Firma Microchip erleichtern. Betrachtet werden die 14-Bit-Controller der Serien PIC16Fxxx bzw PIC12Fxxx.&lt;br /&gt;
* http://www.waitingforfriday.com/ Wer anstatt mit Delphi (sprut.de) lieber mit C++ oder C# arbeiten möchte, findet bei Simon Inns ein USB-Framework und zahlreiche interessante und anpassbare Anwendungen.&lt;br /&gt;
* [http://pic-projekte.de/ PIC-Projekte.de] Tutorials (u.a. für PIC C) und Projekte mit erklärten Codesnipseln (geeignet für Anfänger), [http://pic-projekte.de/phpBB3/ deutschsprachiges PIC Forum]&lt;br /&gt;
* [http://www.fernando-heitor.de PIC: Programmierung in CCS (www.fernando-heitor.de)] Dies ist eine weitere Seite, die dem Anfänger, der sich mit PICs beschäftigt, auf die Beine hilft. Sie befasst sich hauptsächlich mit dem CCS-Compiler und hat dazu ein sehr gutes Tutorial. Ausserdem bietet die Seite ein Forum speziell für PIC Mikrocontroller.&lt;br /&gt;
* [http://www.cc5x.de CC5X] Programmierkurs für PIC-Mikrocontroller in C (CC5X Compiler)] Programmierkurs mit Beispielen und Schaltplänen, fertige Hardware- und Softwarelösungen. In diesem Kurs sind auch einige Unterprogramme detailliert erklärt.&lt;br /&gt;
* [http://www.microchipc.com/ MicrochipC.com] Programmieren von PIC-Microcontrollern mit C. (Enthält auch Links und Bootloader für diverse PICs.)&lt;br /&gt;
* [http://www.amodio.biz/projects/PIC10BaseT/index.html Internetworking with Microchip Microcontrollers - PIC18F4620+ENC28J60]&lt;br /&gt;
* [http://pic18fusb.online.fr/wiki/wikka.php?wakka=WikiHome Wiki about Microchip USB PIC] (PIC18F2550, PIC18F4550...)&lt;br /&gt;
* [http://picpgm.picprojects.net/ PICPgm - A free and simple PIC Development Programmer Software for Windows and Linux] Einfacher PIC Programmer für Windows und Linux. Unterstützt eine Vielzahl von PIC-Chips und wird ständig erweitert. Derzeit können PIC10F, PIC12F, PIC16F, PIC18F, PIC24H  sowie dsPIC30F und dsPIC33F programmiert werden.&lt;br /&gt;
* [http://www.stolz.de.be InCircuit-Programmer und -Debugger (www.stolz.de.be)] Einfacher Nachbau des Microchip ICD2s. Zum Programmieren und Debuggen.&lt;br /&gt;
* [http://www.winpicprog.co.uk WinPicProg] Programmer und Tutorials für Anfänger von Nigel Goodwin (Englisch)&lt;br /&gt;
* [http://usbpicprog.org/ usbpicprog], an open source Microchip PIC programmer for the USB port. A wxWidgets based (cross platform) application to communicate with the usbpicprog hardware / firmware. This application is known to function well on Linux, Windows (XP or later) and Macosx.&lt;br /&gt;
* [http://www.tigal.com EasyPIC3, EasyPIC4, Easy8051A, EasyAVR, Easy-was-weiss-ich (www.tigal.com)] - Distributor für Produkte von [http://www.mikroelektronika.co.yu mikroelektronika] und weiteren Herstellern&lt;br /&gt;
*[http://www.pro-zukunft.de Pro Zukunft] Evaluation-Board für PIC16F84A, hands-on-training und Print-Lehrgang. Für Schulen, Ausbildungsbetriebe &amp;amp; Hobbyelektroniker.&lt;br /&gt;
* [http://www.wselektronik.at www.wselektronik.at] Bausatz für &amp;quot;Full Speed ICD2&amp;quot; (USB2.0, Debugger, Programmer) oder Fertiggerät erhältlich.&lt;br /&gt;
* [http://www.uchobby.com/index.php/2008/04/19/pic-development-linux-style/ How to setup for PIC microcontroller development on Linux] von Steven Moughan&lt;br /&gt;
* [http://www.dattalo.com/gnupic/gpsim.html#docs gpsim] is a full-featured software simulator for Microchip PIC microcontrollers distributed under the GNU General Public License.&lt;br /&gt;
* [http://www.mtoussaint.de/yapide.html YaPIDE] aims to be a fully featured Microchip PIC simulator for Linux (and probably other UNIXes). YaPIDE is a GUI only application. If you need a commandline based PIC simulator there is the excellent &#039;&#039;&#039;gpsim&#039;&#039;&#039;. The simulator kernel currently supports the PIC 16F628.&lt;br /&gt;
* [http://piklab.sourceforge.net/ Piklab] is an integrated development environment for applications based on Microchip PIC and dsPIC microcontrollers similar to the MPLAB environment. It integrates with several compiler and assembler toolchains (like gputils, sdcc, c18) and with the simulator &#039;&#039;&#039;gpsim&#039;&#039;&#039;. It supports the most common programmers (serial, parallel, ICD2, Pickit2, PicStart+) and debuggers (ICD2).&lt;br /&gt;
* [http://dev.frozeneskimo.com/software_projects:vpicdisasm vPICdisasm] is a Microchip PIC Mid-Range family firmware disassembler. This single-pass disassembler can read Intel HEX and Motorola S-Record formatted files containing valid PIC firmware. (GPL)&lt;br /&gt;
* [http://pikdev.free.fr/ PiKdev] is a simple graphic IDE for the development of PIC-based applications. It currently supports assembly language. C language is also supported for PIC 18 devices. PiKdev is developed in C++ under Linux and is based on the KDE environment.&lt;br /&gt;
* [http://www.yenka.com/en/Yenka_PICs/ Yenka PICs] lets you write routines using simple flowcharts, and test them on-screen, before using them to program real PIC or PICAXE chips. To help spread the news about Yenka, we&#039;re offering free copies of Yenka PICs for use at home or school.&lt;br /&gt;
* [http://gcbasic.sourceforge.net/ Great Cow BASIC] &amp;quot;Open Source BASIC programming tools for Microchip PIC and Atmel AVR microcontrollers&amp;quot;&lt;br /&gt;
* [http://openprog.altervista.org/OP_eng.html Open Programmer] - An open source [[USB]] programmer for [[PIC]] micros, [[I2C]]-[[SPI]]-MicroWire [[EEPROM]]s, some ATMEL [[AVR]] micros, generic I2C/SPI devices and (soon) other devices. Can work as [[ICD]] debugger.&lt;br /&gt;
&lt;br /&gt;
=== Projektsammlungen/Einzelprojekte ===&lt;br /&gt;
* [http://www.martins-elektronikwelt.tk www.martins-elektronikwelt.tk] Viele Projekte mit den PIC Mikrocontrollern, u.a. SMS-Schaltzentrale, SD/MMC-FAT32-MP3-Player, Lichtschranken, Funk-Wetterempfänger, PS/2 am PIC usw.&lt;br /&gt;
* [http://www.Firmware-On-Demand.com Firmware-On-Demand] Umfangreiche Firmware-Bibliothek. &lt;br /&gt;
* [http://pic-projekte.de/wordpress/?p=387#more-387 XLCD Librarie] Anleitung zum Ansteuern des HD44780 unter Verwendung der C18 XLCD Librarie&lt;br /&gt;
* [http://www.rentron.com www.rentron.com] Anfänger-taugliche Projekte für PIC und [[8051]] von Reynolds Electronics (Englisch)&lt;br /&gt;
* [http://www.circuitcellar.com/microchip2007/ Microchip 16-Bit Embedded Control 2007 Design Contest] bei [http://www.circuitcellar.com/ Circuit cellar]&lt;br /&gt;
* [http://mondo-technology.com/ Mondo Technologiy] Grosse Ansammlung von PIC-Projekten, u.a. SuperProbe: Logic Probe,(Auf der linken Seite ganz oben) Logic pulser, Frequency Counter, Event Counter, Voltmeter, Diode Junction Voltage, Capacitance Measurement, Inductance Measurement, Signal Generator, Video Patern, Serial Ascii, Midi Note, R/C Servo, Square Wave, Pseudo Random Number, ir38, PWM in einem... (PIC16F870)&lt;br /&gt;
* [http://micrognurtos.sourceforge.net uGNU/RTOS] is a microcontroller-targeted serial real time operating system. It has been ported to USART capable Microchip PIC16 devices. It supports I/O operations and some internal registry operations. The user can interact with the chip through the RS-232 serial cable and a shell. The user can type a small list of commands and see the results on the chip&#039;s outputs. (LGPL)&lt;br /&gt;
* [http://pic-projekte.de http:pic-projekte.de] Viele Projekte vom Betreiber der Webseite. Außerdem gibt es ein deutsches PIC-Forum&lt;br /&gt;
* [http://pic16f628a.blogspot.com/ Experiments with PIC16F628A] - PIC Programming in C&lt;br /&gt;
&amp;lt;!-- * [http://www.picguide.org PIC Guide] Eine große Sammlung von PIC-Projekten für den Anfänger 6.9.2010: nur cPanel Standard Seite --&amp;gt;&lt;br /&gt;
*Stevy&#039;s Homepage http://stevy.bplaced.com Pic Projekte die in C geschriebn wurden z.B 3D Engine, Grafik Display Ansteuerungen, Oszilloskip usw&lt;br /&gt;
* [http://www.simon-brenner.ch/projekte/rgb-led-stripe RGB Stripe mit 16bit Bus, realisiert mit PIC12F629]&lt;br /&gt;
* [http://scifi.pages.at/drakesoft/aulem_mypong/ Spiel PONG] auf einer 16x16 LED Matrix mit Ton, realisiert auf einem AVR.&lt;br /&gt;
* [http://hackinglab.org/ Pinguino Webpage] und [http://wiki.pinguino.cc/index.php/Main_Page Pinguino Wiki] ist ein Arduino-ähnliches Open Source und Open Hardware Projekt für 8-Bit (PIC18F2550, PIC18F4550) Mikrocontroller.&lt;br /&gt;
* [http://pic-projekte.de/wordpress/?p=653 Entwicklungsboard auf Grundlage des PIC18F25K22] - Sehr gut geeignetes Entwicklungsboard für Einsteiger und Fortgeschrittene&lt;br /&gt;
&lt;br /&gt;
== [[Z8]] ==&lt;br /&gt;
* [http://groups.yahoo.com/group/z8encore/ Yahoo! Groups : z8encore] Yahoo-Gruppe, die sich mit den Z8 Encore! Mikrocontrollern beschäftigt (Anmeldung bei Yahoo erforderlich).&lt;br /&gt;
* [[Zilog Encore Experimentierplatine]] (Z8F6421 Familie mit DIP-40 Gehäuse)&lt;br /&gt;
*[http://thomastechnik.blogspot.de/ Thomas&#039; Technik Blog] Ein Z8Encore und ZNEO Projekt und viele Tips zum Programmieren und Debuggen.&lt;br /&gt;
&amp;lt;!-- * [http://www.z8micro.com/forum/ Z8 Encore! Microcontroller Discussion Forum - Dedicated to the ZiLOG Z8 Encore! Microcontroller] Ein der Z8 Encore!-Mikrocontrollerfamilie gewidmetes Diskussionsforum (in Englisch). - Link tot 6.9.2010 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmierbare Logik ([[CPLD]]/[[FPGA]]/[[GAL]]) ==&lt;br /&gt;
&lt;br /&gt;
=== Chip-Hersteller ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.altera.com      Altera], Große FPGAs, direkter Wettbewerber zu Xilinx&lt;br /&gt;
* [http://www.latticesemi.com Lattice Semiconductor], kleinere und mittlere FPGAs, sehr Strom sparend&lt;br /&gt;
* [http://www.microsemi.com   Microsemi]&lt;br /&gt;
* [http://www.xilinx.com      Xilinx], Große FPGAs, direkter Wettbewerber zu Altera&lt;br /&gt;
&lt;br /&gt;
=== Soft-Core-Prozessoren und IP-Cores ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.opencores.org/ OpenCores.org], VHDL Sourcen&lt;br /&gt;
* [http://opencollector.org/history/freecore/ Freecore], unter &#039;Module library&#039; gibt&#039;s einige freie Designs&lt;br /&gt;
* [http://members.optushome.com.au/jekent/FPGA.htm Private Seite von John Kent], enthält eine Menge Links und auch einige Designs&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungswerkzeuge für Soft-Core-Prozessoren===&lt;br /&gt;
&lt;br /&gt;
* [http://www.fautronix.com/fidex FIDEx], FIDEx assembler IDE für mehrere Soft-Core-Prozessoren&lt;br /&gt;
* [http://www.mediatronix.com/Tools.htm Mediatronix tools], Picoblaze und DSP tools&lt;br /&gt;
&lt;br /&gt;
=== Weitere Info-Seiten ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.fpga4fun.com/ fpga4fun], umfangreiche Seite mit Einführung und Beispielen, berücksichtigt Xilinx &amp;amp; Altera&lt;br /&gt;
* [http://www.fpgacpu.org/links.html FPGA CPU Links]&lt;br /&gt;
&lt;br /&gt;
=== FPGA-Modul- und Eval-Board-Hersteller ===&lt;br /&gt;
&lt;br /&gt;
* [https://digilent.us/ Digilent], Hersteller verschiedener FPGA/CPLD-Boards (u.a. Xilinx Spartan Starter Kit)&lt;br /&gt;
* [http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&amp;amp;CategoryNo=39 Terasic], Anbieter von Altera FPGA-Boards&lt;br /&gt;
* [http://shop.trenz-electronic.de/catalog/ Trenz Elektronik], verkauft verschiedene FPGA/CPLD-Boards&lt;br /&gt;
* [http://www.xess.com/index.html XESS], Anbieter von FPGA-Boards (Xilinx), unter Support gibts es eine Menge Beispiele&lt;br /&gt;
* [http://www.cesys.biz Online Shop für Cesys FPGA Karten]&lt;br /&gt;
&lt;br /&gt;
=== Programmierwerkzeuge ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.ixo.de/info/usb_jtag/ ixo.de usbjtag] - USB-JTAG Adapter, fast kompatibel zu Altera USB-Blaster, wahlweise basierend auf FT245+CPLD oder Cypress FX2 Controller&lt;br /&gt;
&lt;br /&gt;
== DSP ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.tetrix-systems.de/embedded.html combined embedded Linux-DSP Solutions]&lt;br /&gt;
* [http://open.neurostechnology.com/node/1020 TI c54x DSP  Compilertools (ohne Debugger)] frei für Open Source Projekte.&lt;br /&gt;
&lt;br /&gt;
== Wettbewerbe (Contests) == &lt;br /&gt;
&lt;br /&gt;
Verschiedene Hersteller veranstalten zur Promotion ihrer Produkte Designwettbewerbe, aus denen teilweise komplette Projektunterlagen hervorgehen (Schaltung, Source).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2014&#039;&#039;&#039;&lt;br /&gt;
*[http://http://makeit.intel.com/ Make It Wearable] Der &amp;quot;VISIONARY Track&amp;quot; startet am 24.02.2014, der &amp;quot;DEVELOPMENT Track&amp;quot; im Sommer 2014.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2013&#039;&#039;&#039;&lt;br /&gt;
*[http://www.digilentinc.com/events/ddc2013/ digilent Design contest 2013] &lt;br /&gt;
*[http://www.ebv.com/index.php?id=1477 EBV verlost Infineon XMC4500 Cortex M4 Starter Kits]&lt;br /&gt;
*[http://www.energymicro.com/freekit Energy Micro verschenkt kostenlose Starter Kits]&lt;br /&gt;
*[http://www.challenge.toradex.com/ Toradex Wettbewerb, 100&#039;000 USD in Preise] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2012&#039;&#039;&#039;&lt;br /&gt;
*[http://forum.energymicro.com/topic/150-contest-description/ EFM32 Design Contest 2012 von Energy Micro] Anmeldung bis zum 31.10.2012&lt;br /&gt;
*[http://dangerousprototypes.com/2012/09/03/announcing-the-open-7400-logic-competition-2012/ Open 7400 Logic Competition 2012] Anmeldung bis 31.10.2012&lt;br /&gt;
*[http://beagleboard.org/CapeContest/ beaglebone Cape Contest] Anmeldung bis 31.Dezember 2012&lt;br /&gt;
&#039;&#039;&#039;2011&#039;&#039;&#039;&lt;br /&gt;
*[http://www.designspark.com/chipkitchallenge DesignSpark chipKIT Challenge] bis 27.03.2012&lt;br /&gt;
*[http://www.555contest.com 555 Contest]&lt;br /&gt;
*[http://www.circuitcellar.com/nxpmbeddesignchallenge/ NXP and ARM/mbed challenge]&lt;br /&gt;
*[http://www.ebv.com/en/products/stm32-design-contest.html STM32 Design Contest] von EBV Elektronik und STMicroelectronics&lt;br /&gt;
* [http://www.renesasrulz.com/community/rx-contest The RX MCU Design Contest] und die Top 3 im [http://www.eevblog.com/2011/06/05/eevblog-174-renesas-rx-design-contest-winners/ Video] bei Dave Jones auf EEVBlog.com&lt;br /&gt;
* [http://www.cypress.com/?id=3298 ARM Cortex-M3 PSoC® 5 Design Challenge]&lt;br /&gt;
* [http://www.instructables.com/contest/micro/ SparkFun Microcontroller Contest] bis 13.02.2011&lt;br /&gt;
* [http://www.elektroniknet.de/bauelemente/news/article/27963/0/Wer_entwickelt_die_beste_Anwendung_mit_dem_EFM32/ EFM32 Design-Wettbewerb] von Elektronik, Avnet-Memec und Energy Micro&lt;br /&gt;
* [http://www.freescale.com/webapp/sps/site/overview.jsp?code=KINETIS_MAKEIT_CHALLENGE&amp;amp;tid=vanKINETIS_MAKEIT_CHALLENGE Make It Challenge: Kinetis MCUs] von Freescale&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2010&#039;&#039;&#039;&lt;br /&gt;
* [http://www.schmartboard.com/index.asp?page=mcu_2010 SchmartBoard 2010 MCU Challenge]&lt;br /&gt;
* [http://www.digilentinc.com/showcase/contests/designcontest.cfm?ContestID=6 Digilent Design Contest 2010]&lt;br /&gt;
* [http://www.parallax.com/go/holidaychallenge Parallax &amp;amp; iGen Student LED Holiday Challenge]&lt;br /&gt;
* [http://www.embeddedspark.com/upcomingchallenge/ The embeddedSPARK 2010 SUMMER Challenge]&lt;br /&gt;
* [http://www.libelium.com/tienda/catalog/contest.php?language=en Libelium Arduino Open Hardware Contest]&lt;br /&gt;
* [http://www.circuitcellar.com/designstellaris2010/index.html Texas Instruments DesignStellaris 2010]&lt;br /&gt;
* [http://www.wizwiki.net/main/ iMCU Design Contest] (WIZnet)&lt;br /&gt;
* [http://www.elo-web.de/elo/entwicklung-und-projekte/ping-pong/elo-programmierwettbewerb-2010 ELO-Programmierwettbewerb 2010] (Atmega8, PingPong-Platine, 31.3.10)&lt;br /&gt;
* [http://www.lpc1100challenge.com/ NXP LPC1100 Design Challenge] (Cortex-M0 based LPC1100)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2009&#039;&#039;&#039;&lt;br /&gt;
* [http://arduinofun.com/blog/2009/11/01/fun-with-arduino-contest/ Fun with Arduino Contest]&lt;br /&gt;
* [https://www.xmos.com/challenge/ XMOS Challenge]&lt;br /&gt;
* [http://www.designmsp430.com/ Design MSP430 Ultra-Low Power Challenge]&lt;br /&gt;
* [http://makezine.com/halloweencontest/ Make: Halloween Contest 2009], sponsored by Microchip Technology!&lt;br /&gt;
* [http://www.bricogeek.com/contest/let-arduino-play/resultados.php Let Arduino Play Contest]&lt;br /&gt;
* [http://www.dlpdesign.com/designcontest/ DLP Design DLP-232PC Design Contest]&lt;br /&gt;
* [http://www.libelium.com/tienda/catalog/contest.php Arduino contest by Libelium]&lt;br /&gt;
* [http://www.expli.de/wettbewerb/coole-avr-microcontroller-elektronik-ideen/ EXPLI Elektronik Wettbewerb]: Die coolsten Elektronik Projekte &amp;amp; AVR Microcontroller Anleitungen&lt;br /&gt;
* [http://www.stm32circle.com/projects/contest.php STM32 Primer2 Design Competition 2009]&lt;br /&gt;
* [http://www.parallax.com/Resources/ApplicationsContests/Contests/200910PropellerContest/tabid/846/Default.aspx 2009/2010 Propeller Design Contest]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2008&#039;&#039;&#039;&lt;br /&gt;
* [http://www.parallax.com/tabid/720/Default.aspx Propeller Design Contest]&lt;br /&gt;
* [http://www.psocidcindia.com/index.php PSoC Innovator Design Challenge India 2008]&lt;br /&gt;
* [http://www.mypic32.com Microchip PIC32 Design Challenge]&lt;br /&gt;
* [http://contest.renesasinteractive.com/ HEW Target Server Design Contest 2008]&lt;br /&gt;
* [http://www.stm32circle.com/projects/result_contest_2008.php STM32 Primer Design Competition 2008]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2007&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/wiznet/index.html WIZnet iEthernet Design Contest 2007] &lt;br /&gt;
* [http://www.circuitcellar.com/microchip2007/ Microchip 16-Bit Embedded Control 2007 Design Contest]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2006&#039;&#039;&#039;&lt;br /&gt;
* [http://www.designmsp430.com/View.aspx 2006 MSP430 eZ Design Contest] &lt;br /&gt;
* [http://www.luminarymicro.com/DesignStellaris2006 Luminary Micro DesignStellaris2006]&lt;br /&gt;
* [http://www.circuitcellar.com/avr2006/ Atmel AVR Design Contest 2006] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2005&#039;&#039;&#039;&lt;br /&gt;
* [http://www.jandspromotions.com/philips2005/index.htm Philips ARM Design Contest 2005] (LPC213x)&lt;br /&gt;
* [http://www.circuitcellar.com/renesas2005m16c/index.htm Renesas M16C Design Contest 2005]&lt;br /&gt;
* [http://www.edn.com/article/CA516007.html Cornelius van Drebbel&#039;s Mad Design Contest] (NEC)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2004&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/avr2004/ Atmel AVR 2004 Design Contest]&lt;br /&gt;
* [http://www.circuitcellar.com/psoc2004/ PSoC High Integration Challenge 2004]&lt;br /&gt;
* [http://www.jandspromotions.com/zilog2004/ Zilog 2004 Flash Nets Cash Design Contest] (eZ80Acclaim!)&lt;br /&gt;
* [http://www.jandspromotions.com/wirelesschallenge/index.html 2004 Freescale Wireless Design Challenge] (MC13191/92/93 RF Transceivers, [[Meshnetics Zigbee|ZigBee]])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2003&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/fi2003/ MOTOROLA FLASH INNOVATION 2003 DESIGN CONTEST] (Motorola HC08)&lt;br /&gt;
* [http://www.circuitcellar.com/renesas/ Renesas H8 Design 2003 Contest]&lt;br /&gt;
* [http://www.jandspromotions.com/zilog2003/ ZiLOG Flash for Cash Z8 Encore®! International Design Contest]&lt;br /&gt;
* [http://www.jandspromotions.com/efield203/index.htm 2003 Motorola E-Field Sensor Contest] (MC33794)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2002&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/flash2002/ Mad Dash for Flash Cash] (Microchip, PIC)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2001&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/dl2001/ Atmel &#039;Design Logic 2001&#039; Design Contest]&lt;br /&gt;
* [http://www.circuitcellar.com/msp430/ MSP430 Design Contest]&lt;br /&gt;
&lt;br /&gt;
== Interfaces &amp;amp; Protokolle ==&lt;br /&gt;
Siehe auch [[Linksammlung#Schnittstellen]]&lt;br /&gt;
&lt;br /&gt;
=== Infrarot (IR) ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbprojects.com/knowledge/ir/index.php Übersicht IR-Protokolle] von San Bergmans (engl.): ITT, JVC, NEC, Nokia NRC17, Sharp, Sony SIRC, Philips RC-5, RC-6, RC-MM, RECS80, RCA, X-Sat&lt;br /&gt;
* [http://www.vishay.com/docs/80071/dataform.pdf Data formats for IR controls (PDF)] von Vishay.&lt;br /&gt;
* [http://www.ostan.cz/IR_protocol_analyzer/ IR protocol analyzer] (Freeware)&lt;br /&gt;
&lt;br /&gt;
=== Parallelport ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.projects-lab.com/?p=1139 ECPMON] - ECP Parallel Port Monitor ([[M16C]]/62P) &lt;br /&gt;
&lt;br /&gt;
=== iPod ===&lt;br /&gt;
* [http://ipodlinux.org/IPod_to_T%26A_remotecontrol_adapter IPod to T&amp;amp;A remotecontrol adapter] ([[PIC]]-Projekt)(Link defect)&lt;br /&gt;
* http://jasongarr.wordpress.com/project-pages/ipod-clickwheel-hack/&lt;br /&gt;
&lt;br /&gt;
=== [[RFID]] ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.alexanderguthmann.de/RFIDemulator.html RFIDemulator] - Beschreibung eines RFIDemulators zum klonen von Tags&lt;br /&gt;
* [http://www.mwjournal.com/journal/article.asp?HH_ID=AR_905 Radio Frequency Identification: Evolution of Transponder Circuit Design] - Übersichtsartikel aus dem Microwave Journal&lt;br /&gt;
* [http://www.foebud.org/rfid Die StopRFID-Seiten des FoeBuD e.V.]&lt;br /&gt;
* [http://www.rfzone.org/free-rf-ebooks/ PDF-Bücher (englisch) ]- Bücher über RF, Antennen und elektromagnetische Wellen.&lt;br /&gt;
&lt;br /&gt;
* http://cq.cx/proxmark3.pl Jonathan Westhues RFID Leser/Schreiber/Cloner&lt;br /&gt;
&lt;br /&gt;
http://www.message_bocracco.com/&lt;br /&gt;
&lt;br /&gt;
==== ~ 125 kHz ====&lt;br /&gt;
&lt;br /&gt;
*[http://t4f.org/en/projects/open-rfid-tag Open RFID Tag]&lt;br /&gt;
&lt;br /&gt;
==== 13,56 MHz RFID ====&lt;br /&gt;
* [http://www.openpcd.org/ OpenPCD - a free 13.56MHz RFID reader design] for Proximity Coupling Devices (PCD) based on 13,56MHz communication. This device is able to screen informations from Proximity Integrated Circuit Cards (PICC) conforming to vendor-independent standards such as ISO 14443, ISO 15693 as well as proprietary protocols such as Mifare Classic. (AT91SAM7S128 [[ARM]] Projekt)&lt;br /&gt;
* [http://www.rf-dump.org/ RFDump] is a backend GPL tool to directly interoperate with any RFID ISO-Reader to make the contents stored on RFID tags accessible. (Linux)&lt;br /&gt;
&lt;br /&gt;
==== 2,4 GHz RFID ====&lt;br /&gt;
* [http://www.openbeacon.org/ OpenBeacon] - a free active 2.4GHz beacon design. (Reader: USB oder Ethernet; Tags: RF_Chip: NRF24L01, PIC16F684)&lt;br /&gt;
&lt;br /&gt;
=== [[DMX512]] ===&lt;br /&gt;
* [http://www.soundlight.de/techtips/dmx512/dmx512.htm DMX-512 - was ist das?] Eine Übersicht von SOUNDLIGHT.&lt;br /&gt;
* [http://dworkin-dmx.de/ USB DMX Interface] Bausatz /Fertiggerät USB DMX Interface  &lt;br /&gt;
* [http://www.oksidizer.com/electronic/spp2dmx/index_en.html OksiD DMX 3/1 is a Standard Parallel Port DMX 512 interface for IBM compatible PCs]. Drei Output Universe und ein Input Universe (Universe = 512 channels). Open project. All source code and schematics are available for free. &lt;br /&gt;
* [http://www.usbdmx.com/usb_dmx_interface.html USB DMX Interface revision 1.3] - opto isolated, bus powered, DMX512 from/to [[USB]]interface with both in and out universes. Cheap and simple to build.&lt;br /&gt;
* [http://www.dmx512-online.com/ Ujjal&#039;s DMX512 Seite]&lt;br /&gt;
* [http://llg.cubic.org/dmx4linux/ DMX4Linux 2.6] - A DMX device driver package for Linux (incl. hardware schematics with TI [[MSP430]])&lt;br /&gt;
&lt;br /&gt;
=== Verschiedenes ===&lt;br /&gt;
* [http://www.taelektroakustik.de/deu/index.htm T&amp;amp;A Kommandos] - &#039;&#039;&#039;RC&#039;&#039;&#039; und &#039;&#039;&#039;RCII&#039;&#039;&#039; Kommandoset der Philips PRONTO Familie zur Steuerung von Audiogeräten. Dokumentation siehe unter Downloads.&lt;br /&gt;
* [http://www.marjorie.de/ps2/ps2_protocol.htm Das PS/2 Maus und PS/2- oder AT-Tastatur-Protokoll] (Original auf [http://www.computer-engineering.org/])&lt;br /&gt;
* [http://www.hth.com/snap/ S.N.A.P - Scaleable Node Address Protocol]. S.N.A.P is an free and open network protocol. The protocol was primary developed for PLM-24 based home automation and control systems but it is a generic protocol and not limited to this. S.N.A.P can be used in any type of applications where an easy to learn and light weighted network protocol is needed.&lt;br /&gt;
* [http://www.ulrichradig.de/home/index.php/avr/avr_-_rc PPM / PWM Encoder/Decoder für R/C Funkfernsteuerungen] von Ulrich Radig (AVR, C)&lt;br /&gt;
* [http://www.national.com/analog/interface/lvds_owners_manual LVDS Owner&#039;s Manual - 4th Edition] von National Semiconductor&lt;br /&gt;
* [http://www.mictronics.de/?page=becker Becker Unilink]&lt;br /&gt;
* [http://users.ntplx.net/~andrew/sony/unilink/ Sony UniLink]&lt;br /&gt;
* [http://www.vending.org/technology/MDB_Version_4.pdf Multi-Drop Bus / Internal Communication Protocol (MDB / ICP)]&lt;br /&gt;
&lt;br /&gt;
== Elektronikversender‎ ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Elektronikversender‎]]&lt;br /&gt;
&lt;br /&gt;
== Leiterplattenhersteller ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Platinenhersteller]]&lt;br /&gt;
&lt;br /&gt;
== Schulungen (Online) ==&lt;br /&gt;
* [http://www.kr-onlinetraining.de/ www.kr-onlinetraining.de] Vor Ort und Onlineseminare zu den Themen Elektronik, Reparaturen von Unterhaltungselektronik, Telekommunikation und IT Administration&lt;br /&gt;
* [http://www.esacademy.com/myacademy/ www.esacademy.com] (engl.) - C, CAN, I²C, BlueTooth, PWM, USB, 51LPC, ARM (Einführung)&lt;br /&gt;
* [http://www.elprak.ch Elektronik in der Praxis] Präsentationen zu verschiedenen Themen der Elektronik in der Praxis. Lötvideo, das den zeitlichen Ablauf beim Löten anschaulich darstellt.&lt;br /&gt;
* [http://www.national.com/onlineseminar/ www.national.com] - Amplifiers, Audio, Data Acquisition, Die Products, Displays, Interface, Microcontrollers, Military/Aerospace, Power, Thermal Management, Wireless&lt;br /&gt;
* [http://www.circuitrework.com Circuit Technology Center] - Surgeon grade rework and repair, by the book and guaranteed. Deeplink: [http://www.circuitrework.com/guides/guides.shtml Guides]&lt;br /&gt;
* [http://www.onlinetutorials.de/index.htm onlinetutorials.de] - Linksammlung zu Tutorials für höhere Programmiersprachen ([[HLL]]) wie C, C++, Java, BASIC, Perl, PHP, ...&lt;br /&gt;
* [http://www.awce.com/classroom/ AWCE Interactive Classroom] - Embedded Systems (Using the APP-IV with GCC, Getting Started with the PIC 18F Family), Electronics (CLARC/HBSIG DSP Study Group, Basic Circuits), RoadMap to Programmable Logic&lt;br /&gt;
* [http://www.ibiblio.org/kuphaldt/socratic/ Socratic Electronics] (englisch)&lt;br /&gt;
* [http://www.embedded.com/design/multicore/201200638;jsessionid=4T1T0OZQW4PFSQSNDLRSKH0CJUNN2JVN?printable=true The basics of programming embedded processors] von Wayne Wolf. Neun Artikel bei embedded.com (englisch)&lt;br /&gt;
* [http://webcast.berkeley.edu/course_details.php?seriesid=1906978507 EE 42/EE 100 Introduction to Digital Electronics] - Webcast, Spring 2008 (englisch)&lt;br /&gt;
* [http://freevideolectures.com freevideolectures.com] - Webcasts zu  naturwissenschaftlichen Theman (englisch)&lt;br /&gt;
* [http://www.circuitsage.com/ Circuit Sage], a complete source of information to help you design circuits fast. (Linksammlung zu Software, Artikeln Büchern und Websites)&lt;br /&gt;
* [http://www.DieElektronikerseite.de Die Elektronikerseite] Umfangreiche Sammlung von kleinen Lehrgängen und Schaltungen. Ideal für Anfänger aber auch für Fortgeschrittene&lt;br /&gt;
* [http://homepages.internet.lu/absolute3/tronic/ 3D Virtual Development] - Sammlung von vielen Grundschaltungen im Bereich Oszillator, Operationsverstärker, Empfangstechnik. Vereinzelt in Englisch.&lt;br /&gt;
* [http://cws.gtc.edu/programs/objects/electronics.htm Learning Objects for Electronics] des Engineering Tech Wing of Gateway Technical College (Flash erforderlich)&lt;br /&gt;
* [http://ecee.colorado.edu/~bart/book/book/title.htm Principles of Semiconductor Devices] von Bart Van Zeghbroeck&lt;br /&gt;
* [http://itp.nyu.edu/physcomp/Intro/HomePage Introduction to Physical Computing] ([[AVR]], Arduino)&lt;br /&gt;
* [http://nptel.iitm.ac.in/courses.php?disciplineId=108 NPTEL ELearning Courses Electrical Engineering] (englisch)&lt;br /&gt;
*[http://www.energymicro.com/company/university-program-energy-micro University Program], Lernprogramm zum uC programmieren für Einsteiger (von [https://www.energymicro.com Energy Micro], ist jedoch universell anwendbar)&lt;br /&gt;
* [http://pic-projekte.de http://pic-projekte.de/] PIC- und PIC-C-Tutorial. Besonders geeignet für Einsteiger!&lt;br /&gt;
* [http://www.ta.de http://www.ta.de/] Weiterbildung für Industrietechniker Elektrotechnik IHK ([http://www.ta.de/industrietechniker-elektrotechnik-ihk.html weitere Infos])  und Industriemeister Elektrotechnik IHK ([http://www.ta.de/industriemeister-elektrotechnik-ihk.html weitere Infos])&lt;br /&gt;
&lt;br /&gt;
== Skripte ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.janson-soft.de/skripte/index.html Linksammlung von Volker Lange-Janson]&lt;br /&gt;
* [http://wwwex.physik.uni-ulm.de/lehre/physikalischeelektronik/phys_elektr/phys_elektr.html Physikalische Elektronik und Messtechnik] von Othmar Marti und Dr. Alfred Plettl, Universität Ulm&lt;br /&gt;
* [http://openbookproject.net//electricCircuits/index.htm Lessons in Electric Circuits I-VI] von Tony R. Kuphaldt&lt;br /&gt;
&lt;br /&gt;
== Messequipment ==&lt;br /&gt;
* [http://www.filmetrics.com  Filmetrics Inc.] (Filmetrics manufactures affordable thin-film measurement instruments capable of measuring thin films from 3nm to 0.5mm in thickness.)&lt;br /&gt;
* [http://www.pce-instruments.com  PCE Instruments] (Entwicklung und Produktion für Prüfgeräte und Waagen.)&lt;br /&gt;
* [http://www.bmcm.de/ger/prgr-products.html BMC Messsysteme] Sensorik, Anschlusstechnik, Messverstärker, Messsysteme und Digital I/O ([http://www.bmcm.de/dld/misc-messkette-a4-04.07.pdf Produkt Uebersicht]) auch erhältlich [http://www.redacom.ch/messtechnik/bmcm/index.html hier]&lt;br /&gt;
=== Logikanalyse ===&lt;br /&gt;
* [http://www.pctestinstruments.com Intronix LogicPort], Günstiger, aber sehr leistungsfähiger Logikanalysator mit USB-Anschluß an PC (34Ch, 500MHz Timing, 34 x 2kSa mit Kompression, ca. 367 Euro / 459 SFr.- [http://thinkembedded.ch/Measurement-Tools/LogicPort-Logikanalysator::13.html hier] )&lt;br /&gt;
* Zeroplus LAP-Cxxxx (Familie von LA&#039;s mit unterschiedlichen Daten, 32kBit...2MBit, 16ch oder 32ch, 100MHz..200MHz, Preise von 90,-...1100,- Euro, zu kaufen [http://www.tigal.com/products_category.asp?cid=96 hier])&lt;br /&gt;
* [http://www.tech-tools.com/dv_main.htm TechTools DigiView], Günstiger Logikanalysator mit USB-Anschluß an PC (18Ch, 100MHz Timing, 128kSa mit Kompression,  [http://elmicro.com/de/digiview.html ca. 430Euro])&lt;br /&gt;
* [http://www.tribalmicro.com/logic_an/ Tribalmicro], PC hosted LA (32ch, 40MHz Timing, 128kSa, ca. 1700$)&lt;br /&gt;
* [http://www.nci-usa.com/frame_products_overview.htm NCI GoLogic], Logikanalysator mit USB-Anschluß an PC (34 oder 72Ch, 500MHz Timing, 1 oder 2MSa, ca. 3000..5500$)&lt;br /&gt;
* [http://www.tek.com/products/logic_analyzers/index.html Tektronix], Verschiedene Geräte, standalone oder modular (ab 34ch, 2GHz Timing, ab 512kSa, gut und teuer)&lt;br /&gt;
* [http://www.home.agilent.com/DEger/nav/-536902443.0/pc.html Agilent], Verschiedene Geräte, standalone, modular oder PC-hosted (ab 34ch, ab 800MHz timing, ab 256kSa, gut und teuer)&lt;br /&gt;
* [http://www.sump.org/projects/analyzer/ Sumps LA], günstiges Projekt für einen LA basierend auf einem Digilent Spartan Board (32ch, 100MHz Timing, 256kSa, Kosten Digilent Board ca. 100$ + Versand/Zoll)&lt;br /&gt;
* [http://www.meilhaus.de/produkte/usb-mobile-messtechnik/?user_produkte%5BPATTR%5D=HPG_3-UPG1_3-UPG2_2&amp;amp;user_produkte%5BPR%5D=8&amp;amp;cHash=2c8edb93e2 Meilhaus Electronic - MEphisto Scope UM203] Robustes, mobiles 16 bit Kombi-Instrument 7 Mess-Geräte in einem! (ab 348€)&lt;br /&gt;
* [http://www.hacker-messtechnik.de/13722/59001.html TravelLogic TL2x36], Logikanalysator zum Anschluß an PC über USB, (36ch, 4GHz timing, 200MHz state, Speicher bis 72MBit, Preis ab ca. 500,- netto)&lt;br /&gt;
* [http://www.inovaflex.de/index.html Bus und Logic Analyzer] 100MHz Samplerate und integrierten SPI, I²C, CAN Interpreter, erweiterbar als Oszilloskop&lt;br /&gt;
* [http://www.saleae.com/logic/ logic] - Logik-Analyzer mit 8 Kanälen, mit Software zur Analyse von SPI, I2C, UART, etc... (ca 150$ + Versand/Zoll)&lt;br /&gt;
* [http://www.deditec.de/de/logikanalysatoren/prod/usb-logi-500.html DEDITEC USB-LOGI-500], kostengünstiges Einsteigermodell mit USB-Anschluß und dazugehöriger Software Logi+ (36Ch, Abtastrate 500MHz, 4096 Samples Speichertiefe/Kanal,  ca. 236 Euro)&lt;br /&gt;
* [http://basic.io/index.php/component/virtuemart/alogic-analyzer-detail Alogic Analyzer]: Verfügt über USB-, I2C-, UART- und SPI-Protokoll-Dekoder. Vier oder zwei Kanäle mit bis zu 24 MHz Abtastrate. USB-High-Speed-Transfer zur kontinuierlichen Datenspeicherung. Aufzeichnung über Tage hinweg (nur durch Festplatte begrenzt). Preis 99,- Euro incl. MwSt.&lt;br /&gt;
&lt;br /&gt;
* Eine Übersicht über verschiedene Selbstbauprojekte: [[Logic_Analyzer]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.timing-diagrams.com TimingAnalyzer] can be used to easily draw timing diagrams and perform timing analysis to find faults in digital logic systems. Written in Java, it runs on any platform that supports the Java Run-time Environment, JRE1.6.0 or Java Development Kit JDK1.6.0 or newer.&lt;br /&gt;
&lt;br /&gt;
=== Oszilloskope ===&lt;br /&gt;
&lt;br /&gt;
siehe die separate [http://www.mikrocontroller.net/articles/Oszilloskop Seite] zum Thema&lt;br /&gt;
&lt;br /&gt;
=== Generatoren ===&lt;br /&gt;
[http://www.meilhaus.de/produkte/mess-und-steuer-karten/?user_produkte%5BPR%5D=23&amp;amp;cHash=64a269a3c6 Meilhaus Electronic - ME-6x00] Waveform-Generator - potentialfrei isolierte 16 bit Analog-Ausgabe-Karte (ab EUR 1138,00)&lt;br /&gt;
&lt;br /&gt;
=== Handbücher für Messgeräte ===&lt;br /&gt;
Für ältere kommerzielle Messgeräte sind viele Handbücher im Web als PDF verfügbar. Hier eine Linkliste für den &amp;lt;u&amp;gt;kostenlosen&amp;lt;/u&amp;gt; Download:&lt;br /&gt;
* [http://www.ko4bb.com/cgi-bin/manuals.pl KO4BB Didier Juges]&lt;br /&gt;
* [http://bama.edebris.com/manuals/ BAMA-Edebris (mirror)]&lt;br /&gt;
* [http://www2.faculty.sbc.edu/kgrimm/boatanchor/index.htm BAMA Originalseite K4XL]&lt;br /&gt;
* [http://www.to-way.com/teqman.html to-way.com (K7MLR)]&lt;br /&gt;
* [ftp://ftp.bluefeathertech.com/pub/electronics/testgear/ Bluefeathertech FTP-Server]&lt;br /&gt;
* [http://www.bitsavers.org/ Bitsavers, vor allem Computermanuals und Software]&lt;br /&gt;
* [https://www.logsa.army.mil/etms/online.cfm Handbücher der US-Army (-&amp;gt;&amp;quot;i accept&amp;quot; -&amp;gt; &amp;quot;Enter the site&amp;quot; -&amp;gt; Suchbegriff z.B &amp;quot;Analyzer&amp;quot; in &amp;quot;Pub Title Text&amp;quot; eingeben -&amp;gt; search)]&lt;br /&gt;
* [http://www.eserviceinfo.com/browse.php eserviceinfo.com]&lt;br /&gt;
* [http://www.one-electron.com/FC_TestEquipment.html one-electron.com]&lt;br /&gt;
* [http://manoman.sqhill.com/ manoman]&lt;br /&gt;
* [http://www.nostalgiaair.org/ Nostalgia Air schematics, manuals, tube data]&lt;br /&gt;
* [http://pages.cthome.net/fwc/ Freds sehr alte (vor allem Militärelektronik-) Geräteliteratur, Röhrentechnik] und hier [http://pages.cthome.net/fwc/TO-DOC.HTM Übersicht zur Nummerierung der Militärhandbücher]&lt;br /&gt;
* [http://www.hpmemory.org/ressources/resrc_home.htm HP-Memory.org, alte Applications und HP-Journals]&lt;br /&gt;
* [http://www.ebaman.com/index.php/home Ebaman Registrierung per e-Mail erforderlich]&lt;br /&gt;
&lt;br /&gt;
Eine [http://www.slack.com/elec.html Linksammlung zu Messgeräten], sehr ausführlich&lt;br /&gt;
&lt;br /&gt;
== Vermischtes == &lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://forum.sparkfun.com/ Spark Fun Electronics] MicroController Ideas and Support (Englisch) ([[AVR]], [[PIC]], [[MSP]], [[ARM]], OpenOCD)&lt;br /&gt;
* [http://www.edaboard.com/ EDAboard.com] International Electronics Forum Center (Englisch)&lt;br /&gt;
* [http://stsboard.de STS Reparatur Forum] Forum für Radio und Fernsehtechniker&lt;br /&gt;
* [http://pic-projekte.de/phpBB3/ PIC-Forum] Deutschsprachiges PIC-Forum&lt;br /&gt;
* [http://formu.iwenzo.de Elektronik Reparatur Forum] Informationselektroniker Reparatur Forum&lt;br /&gt;
* [http://www.elektrikforum.de Elektrik-Forum] Forum zum Thema Elektroinstallationen&lt;br /&gt;
* [http://www.eeweb.com/electronics-forum/ Electronics Forum] Electrical Engineering Community Forum (Englisch)&lt;br /&gt;
* [http://www.digikey.com/techxchange/community/microcontroller Digi-Key TechXchange Communities &amp;gt; Microcontroller Solutions Community]&lt;br /&gt;
* [http://forum.energymicro.com Forum von Energy Micro]&lt;br /&gt;
&lt;br /&gt;
=== Videocasts und Podcasts ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.eevblog.com/ EEVblog] Electronics Engineering Video Blog von David L. Jones (englisch). &#039;&#039;Anm.: David ist Australier und das hört man. An die Sprechweise kann man sich aber gewöhnen. Und nicht erschrecken, wenn öfter mal ein drastisches Fourletterword auftaucht!&#039;&#039;&lt;br /&gt;
* [http://www.theamphour.com/ The Amp Hour] Podcast mit Chris Gammell und David Jones (englisch)&lt;br /&gt;
* [https://www.youtube.com/watch?v=IIV-P6K2t4M Youtube-Video] Über Ingenieursdienstleister und einen Audi-Personalchef in Erklärungsnot&lt;br /&gt;
&lt;br /&gt;
=== Projektsammlungen ===&lt;br /&gt;
Meist in Englisch. &lt;br /&gt;
* [http://circuitscout.com/ Circuit Scout] - Online Suchmaschine&lt;br /&gt;
* [http://www.epanorama.net ePanorama.net]&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://www.commlinx.info Electronic Schematics] from CommLinx Solutions Pty Ltd&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [http://www.discovercircuits.com Discover Circuits] a collection of 25000+ electronic circuits or schematics&lt;br /&gt;
* [http://www.next.gr/ Next] Electronic Circuit Database&lt;br /&gt;
* [http://www.beyondlogic.org/ BeyondLogic.org] Diverse Mikrocontroller und Interfacing Projekte&lt;br /&gt;
* [http://www.uoguelph.ca/~antoon/circ/circuits.htm Circuits for the Hobbyist] by VA3AVR&lt;br /&gt;
* [http://www.stefpro.de/ StefPro.de] Diverse Projekte und Datenblattsammlung nach Kategorien, Microcontroller, Digital und Analog... Sowie Tutorial &amp;quot;Grundlagen der Bestückung von Platinen&amp;quot; und anderes Wissen&lt;br /&gt;
* [http://www.schaltplaene-online.net/ www.schaltplaene-online.de] Umfangreiche Linksammlung zu Schaltplänen aller Art&lt;br /&gt;
* [http://www.halloweenmonsterlist.info/ MoNsTeRlIsT of Halloween Projects]&lt;br /&gt;
* [http://www.open-innovation-projects.org Open Innovation Projects] - Sammlung von offenen Projekten zu physischen Produkten, darunter etliche Mikrocontroller-Projekte. Man kann selber Projekte hinzufügen.&lt;br /&gt;
* [http://blog.thomasheldt.de/ ThomasHeldt.de Blog] Elektronik Blog mit vielen interessanten Projekten.&lt;br /&gt;
&lt;br /&gt;
=== Referenzen, Beschreibungen, Standards ===&lt;br /&gt;
* Extraseite: [[Datenblätter]]&lt;br /&gt;
* [http://www.technick.net Technik.Net] Pinouts, Circuits and Guides&lt;br /&gt;
* [http://pinouts.ru/ pinout.ru] und [http://www.hardwarebook.info/ hardwarebook.info] - Online handbooks of hardware pinouts, cables schemes and connectors layouts&lt;br /&gt;
* [http://www.networktechinc.com/technote.html Keyboard, Monitor &amp;amp; Mouse Pinouts] for PC, SUN, MAC, USB, FireWire, RS232, Digital Flat Panel and EVC configurations&lt;br /&gt;
* [http://www.q1.fcen.uba.ar/materias/iqi/joygus/tvgames.html Special joysticks used in TV games]&lt;br /&gt;
* [http://microsym.com/editor/assets/intelhex.pdf Intel-Hex-Format (PDF)]&lt;br /&gt;
* [http://home.teleport.com/~brainy/fat32.htm FAT32 Structure Information] - Written by Jack Dobiash&lt;br /&gt;
* [http://www.pjrc.com/tech/8051/ide/fat32.html Understanding FAT32 Filesystems] mit Beispielen (engl.)&lt;br /&gt;
* [http://www.rev-ed.co.uk/docs/picaxe_manual3.pdf Microcontroller Interfacing Circuits] - Revolution Education Ltd.&lt;br /&gt;
* [http://www.digchip.com/application-notes/ Datenbank für &#039;&#039;Application Notes&#039;&#039;] bei www.digchip.com&lt;br /&gt;
* [http://www.pavouk.org/hw/lamp/en_index.html#bigluz20w Compact Fluorescent Lamp (CFL)], Schaltungen von Energiesparlampen&lt;br /&gt;
&lt;br /&gt;
=== Online-Bücher ===&lt;br /&gt;
* [http://www.allaboutcircuits.com/ All About Circuits] - Series of online textbooks covering electricity and electronics. The information provided is great for both students and hobbyists who are looking to expand their knowledge in this field. (Englisch)&lt;br /&gt;
* http://www.computer-books.us/ - überwiegend zu höheren Programmiersprachen. Englisch.&lt;br /&gt;
* [http://www.vias.org/feee/index.html FEEE - Fundamentals of Electrical Engineering and Electronics]&lt;br /&gt;
* [http://www.nrbook.com/a/bookcpdf.php Numerical Recipes in C, Second Edition (1992)]&lt;br /&gt;
* [http://www.specamotor.de/freebook.php Electrical drives for precision engineering designs]  Prof.dr.ir. Compter&lt;br /&gt;
* [http://www.joretronik.de/Web_NT_Buch/Vorwort/Vorwort.html Das neue InterNetzteil- und Konverter-Handbuch] Dipl.-Ing. Jörg Rehrmann&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch/index.html Einstieg in die Elektronik mit (AVR) Mikrocontrollern] Stefan Frings&lt;br /&gt;
&lt;br /&gt;
=== Bedienungsanleitungen / Manuals ===&lt;br /&gt;
* [http://bama.edebris.com/manuals/ BAMA Archiv] &lt;br /&gt;
* [http://www.big-list.com/ Big-List.com] - This is a directory of over 600 dealers in used high technology equipment. Most deal in used electronic test equipment or semiconductor production equipment. Included are dealers in related high technology items, rental companies, equipment auction sites, test equipment manual dealers, foreign (non-U.S.) used equipment dealers, cal labs, and repair services.&lt;br /&gt;
* [http://ko4bb.com/manuals/ KO4BB&#039;s Manuals Repository]&lt;br /&gt;
&lt;br /&gt;
=== Ungewöhnliche Basteleien (Hacks) ===&lt;br /&gt;
Auf eigene Gefahr und nicht immer ganz ernst... Meist in Englisch. &lt;br /&gt;
&lt;br /&gt;
* Metablogs (tägliche News)&lt;br /&gt;
** [http://www.makezine.com/ Makezine]&lt;br /&gt;
** [http://www.hackaday.com/ Hack a Day]&lt;br /&gt;
** [http://www.hackedgadgets.com/ HackedGadgets]&lt;br /&gt;
** [http://www.hacknmod.com/ Hack N&#039; Mod]&lt;br /&gt;
** [http://zedomax.com/blog/category/diy/ Zedomax DIY]&lt;br /&gt;
** [http://digital-diy.com Digital-DIY]&lt;br /&gt;
** [http://dangerousprototypes.com Dangerous Prototypes]&lt;br /&gt;
** [http://www.heise.de/hardware-hacks/ Heise Hardware Hacks]&lt;br /&gt;
&lt;br /&gt;
* Foren&lt;br /&gt;
** [http://www.fingers-welt.de/home.htm Fingers elektrische Welt]&lt;br /&gt;
** [http://forum.hackedgadgets.com/ HackedGadgets Forum]&lt;br /&gt;
** [http://stsboard.de Reparatur Forum]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
domain expired&lt;br /&gt;
** [http://camerahacking.com camerahacking Forum]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Projektsammlungen&lt;br /&gt;
** Final Projects der Kurse [http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/ ECE4760] (Designing with Microcontrollers) und [http://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/ ECE5760] (Advanced Microcontrollers) an der Cornell University &lt;br /&gt;
** [http://www.coolcircuit.com/gadgets/ Cool Circuit] tot -&amp;gt; https://web.archive.org/web/20130116005101/http://www.coolcircuit.com/gadgets/&lt;br /&gt;
** [http://www.electronics-lab.com/blog/ Electronics-Lab.com Blog]&lt;br /&gt;
** [http://blog.energymicro.com/category/hack-a-gecko/ Hack a Gecko Blog] Energy Micro Hacks&lt;br /&gt;
&lt;br /&gt;
* DIY-Anleitungen&lt;br /&gt;
** [http://www.instructables.com/ instructables]&lt;br /&gt;
** [http://www.scitoys.com/ Scitoys] You Can Make With Your Kids&lt;br /&gt;
&lt;br /&gt;
* Mix&lt;br /&gt;
** [http://www.evilmadscientist.com Evil Mad Scientist Laboratories] - u.a. The Flying Spaghetti Monster, on toast ;-)&lt;br /&gt;
** [http://home.earthlink.net/~lenyr/index.html Spark, Bang, Buzz and Other Good Stuff] ([http://www.sparkbangbuzz.com Neue Sachen])&lt;br /&gt;
** [http://www.electricstuff.co.uk/ Mike&#039;s Electric Stuff] - Antique Glass, Tesla coils and high-voltage stuff, Lasers&lt;br /&gt;
** [http://electricity.pbwiki.com/ DHS electricity]&lt;br /&gt;
** [http://www.elephantstaircase.com/wiki/index.php?title=Main_Page Elephant Staircase]&lt;br /&gt;
** [http://mycpu.eu Eine selbstgebaute CPU aus TTL-Gattern]&lt;br /&gt;
** [http://www.knollep.de/ Knolles Bauanleitungen]&lt;br /&gt;
** [http://www.ikalogic.com/index.php ikalogic.com]&lt;br /&gt;
** [http://www.electronicsinfoline.com/ Electronics Infoline]&lt;br /&gt;
** [http://www.uchobby.com/ uC Hobby]&lt;br /&gt;
** [http://elettrolinux.com elettrolinux] - Elektronik und Linux (engl.)&lt;br /&gt;
** [http://electronicfox.at.tf/ electronicfox] - Verschiedene Projekte mit [[AVR]], Fernbedienungen und deren Aufbau sowie Decoder und alten ICs aus dem Recyclinghof&lt;br /&gt;
** [http://www.techfocusmedia.net/archives/fresh-bytes/ Fresh Bytes von Techfocusmedia]&lt;br /&gt;
** [http://stefanfrings.de/esp8266/index.html ESP-8266 Module] Anwendungshinweise von Stefan Frings&lt;br /&gt;
&lt;br /&gt;
=== Zeitschriften über Elektronik und µC ===&lt;br /&gt;
* [http://www.robotrontechnik.de/html/forum/thwb/showtopic.php?threadid=11011 rfe-Datenbank] - ein Projekt von PSblnkd&lt;br /&gt;
* [http://www.elektroniknet.de/ Elektronik - Das Elektronikmagazin für Entwickler]&lt;br /&gt;
* [http://www.eue24.net/ E&amp;amp;E Faszination Elektronik] - Magazin für Elektronik-Entwickler und Elektronik-Interessierte&lt;br /&gt;
* [http://www.embedded.com embedded.com] - Hauptaugenmerk auf die Philosophie drumherum&lt;br /&gt;
* [http://www.siliconchip.com.au/ Silicon Chip] - Freie Artikel unter &#039;&#039;Free Preview&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/ Circuit Cellar] - Freie Artikel unter &#039;&#039;Digital Library&#039;&#039;&lt;br /&gt;
* [http://www.elektronikpraxis.vogel.de/themen/hardwareentwicklung/mikrocontrollerprozessoren/ Elektronikpraxis - Das professionelle Elektronikmagazin]&lt;br /&gt;
* [http://www.funkamateur.de/ FUNKAMATEUR] - Elektronik, Amateurfunk, CB-Funk u. v. a. m.&lt;br /&gt;
* [http://www.edn.com/ EDN] (etwas schwer zu finden, aber lesenswert: die [http://www.edn.com/channel/Design_Ideas.php Design Ideas] und das [http://www.edn.com/archive/ Archiv der Druckausgaben])&lt;br /&gt;
* [http://www.franzis.de/elo-das-magazin ELO - Das Magazin] für Elektronik-Einsteiger&lt;br /&gt;
* [http://techonline.com/ TechOnline]&lt;br /&gt;
* [http://www.elektor.de/ Elektor] &lt;br /&gt;
* [http://www.techbriefs.com/tech-briefs/electronics-techbriefs NASA Tech Briefs] - Electronics &amp;amp; Computers&lt;br /&gt;
* [http://et.nmsu.edu/~etti/ Technology Interface Journal]&lt;br /&gt;
* [http://dev.emcelettronica.com/ Your Electronics Open Source]&lt;br /&gt;
* [http://www.element-14.com element14.com] is an information portal and community specifically built for electronic design engineers.&lt;br /&gt;
* [http://www.itwissen.info ITWissen.info] (gutes Lexikon)&lt;br /&gt;
* [http://www.nutsvolts.com Nuts&#039;n&#039;Volts] Amerikanisches Elektronikmagazin mit Online Blog&lt;br /&gt;
* [http://de.rs-online.com/web/generalDisplay.html?id=eTech eTech] von RS Online&lt;br /&gt;
* [http://www.eeweb.com/ EEWeb], a premier electrical engineering community for hardware designers.&lt;br /&gt;
* [http://www.all-about-test.info/ All-about-Test], ein News- und Informations-Portal über Test- und Messtechnik.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Absolute_Beginner&amp;diff=97739</id>
		<title>Absolute Beginner</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Absolute_Beginner&amp;diff=97739"/>
		<updated>2017-11-19T17:32:27Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Link zu meinem Buch hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Grundlagen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Gestern tat es einen Schlag,&amp;lt;br/&amp;gt;&lt;br /&gt;
wovon ich hier berichten mag.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drosselspulen, Widerstände,&amp;lt;br/&amp;gt;&lt;br /&gt;
alles fällt mir in die Hände.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da bau ich eine Schaltung auf.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ein Kühlblech kommt da auch noch drauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
An Einstellreglern rumgedreht,&amp;lt;br/&amp;gt;&lt;br /&gt;
bis dann plötzlich nichts mehr geht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Elkos hab ich nicht gebraucht,&amp;lt;br/&amp;gt;&lt;br /&gt;
Widerstände abgeraucht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jetzt ist die Bude voller Qualm,&amp;lt;br/&amp;gt;&lt;br /&gt;
zum Himmel schick ich einen Psalm.&amp;lt;br/&amp;gt;&lt;br /&gt;
Transistoren an den Ohren.&amp;lt;br/&amp;gt;&lt;br /&gt;
Dioden an den Hoden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Kabel am Nabel.&amp;lt;br/&amp;gt;&lt;br /&gt;
Phase an der Nase!&amp;lt;br/&amp;gt;&lt;br /&gt;
Herzkammer flimmert; kann nur noch fluchen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Muß mir ein neues Hobby suchen!&amp;lt;br/&amp;gt;&lt;br /&gt;
MfG Paul&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Damit dieses von Paul so plastisch dargestellte Anfängerszenario gar nicht erst eintritt, werden auf dieser Artikelseite von http://www.mikrocontroller.net einige Dinge aufgeführt, die unbedingt notwendig sind, wenn man sich mit Elektronikbasteleien auseinandersetzt. Die Seite richtet sich bewusst an den absoluten Anfänger um so interessierten Leuten den Einstieg in die Welt der Elektronik und damit auch zum Programmieren von Mikrocontrollern möglichst einfach zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Natürlich ist das Programmieren von Mikrocontrollern auch ohne Elektronikkenntnisse machbar, aber die Aussenanbindung eines Mikrocontrollers zu verstehen ist häufig sinnvoll, so z.&amp;amp;nbsp;B. wenn man ein Signal auswerten möchte.&lt;br /&gt;
&lt;br /&gt;
Die Grundlage für diesen Artikel bildet dieser [http://www.mikrocontroller.net/forum/read-1-344257.html#new Thread] aus dem Forum.&lt;br /&gt;
&lt;br /&gt;
==Sicherheit==&lt;br /&gt;
&lt;br /&gt;
Bleibt gesund! Denkt daran, dass nicht nur Strom und  Spannung bei dem neuen interessanten Hobby gefährlich sein können, sondern auch Hitze, Licht (Laser), Schall, Chemikalien (Entwickler, Ätzbäder, Lötrauch) usw. Lieber einmal mehr fragen, als einmal zu wenig. Und vielleicht bewahrt eure Frage euch und den Nächsten vor Schaden!&lt;br /&gt;
&lt;br /&gt;
===Versuchsaufbauten &amp;gt;60V (DC)===&lt;br /&gt;
Tipp aus dem Forum [http://www.mikrocontroller.net/topic/181266#1750311]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Diplomand schrieb:&lt;br /&gt;
&amp;gt; Oder wie geht es auf&#039;er Arbeit zu in Puncto &lt;br /&gt;
&amp;gt; Versuchsaufbauten?&lt;br /&gt;
&lt;br /&gt;
Alles was über 60V (DC) ist muß bei anliegender Spannung&lt;br /&gt;
mindestens unter 1 cm dickes Plexiglas.&lt;br /&gt;
&lt;br /&gt;
Gruß Anja&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
Ohne Lektüre (egal ob in Papierform oder im Internet) wird das mit der Elektronik in Eigenregie nix. &lt;br /&gt;
Möchte man sich ernsthaft mit der Materie beschäftigen, so kommt man nicht umhin, sich mit den Grundlagen der Elektronik zu beschäftigen. Während man im Internet viele Schaltungen findet, die einfach nachzubauen sind, bietet sich für das Grundlagenstudium eher ein Buch an. Da gute Elektronikbücher häufig teuer sind, will ich Dir folgenden Tipp geben: Schau einfach mal in die nächste größere Bibliothek. Wenn Dir ein Buch dort gefällt, kannst Du es jederzeit noch kaufen. Wer sich nicht irgendwann mit den Grundlagen beschäftigt, wird nie über das Stadium herauskommen, in dem er Schaltungen aus dem Internet kopiert. Aber unser aller Ziel ist es doch, auch zu verstehen, weshalb hier jetzt genau der rot-rot-schwarze Widerstand rein muss und was er tut...&lt;br /&gt;
*&#039;&#039;&#039;Fachzeitschriften&#039;&#039;&#039; am Kiosk&lt;br /&gt;
*&#039;&#039;&#039;Internet&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;[http://www.elektronik-kompendium.de/ Das Elektronik Kompendium]&#039;&#039;&#039; Ziel von das ELKO ist es die Themen Elektronik, Computertechnik, Kommunikationstechnik und Netzwerktechnik allgemeinverständlich zu erklären und der Allgemeinheit zu präsentieren. Die Zielgruppe sind vor allem Schüler und Auszubildende, die sich mit Elektronik näher beschäftigen müssen oder wollen. Weiterhin sollen alle privat und beruflich an Elektronik interessierte angesprochen werden.&lt;br /&gt;
**&#039;&#039;&#039;http://www.dse-faq.elektronik-kompendium.de/&#039;&#039;&#039; Es gibt zwar von der Startseite des ELKO einen Link zum FAQ, aber es schadet sicher nicht, es hier explizit aufzuführen.&lt;br /&gt;
**&#039;&#039;&#039;http://www.b-kainka.de/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;http://www.dieelektronikerseite.de/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;http://www.howstuffworks.com/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;Datenblatt (Datasheet)&#039;&#039;&#039; zu den meisten Bauteilen, wird vom Hersteller ein Datasheet angeboten. Es ist sinnvoll, dies wenigstens einmal durchzulesen, auch wenn man am Anfang wenig mit den ganzen Fachbegriffen anfangen kann.  &lt;br /&gt;
**Diverse Application Notes der großen Halbleiterhersteller sind auch immer eine gute Informationsquelle und beschäftigen sich teilweise auch mit sehr grundlegenden Problemen&lt;br /&gt;
*&#039;&#039;&#039;Bücher&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;[http://www.amazon.com/gp/product/0521370957/103-9884703-3518215?v=glance&amp;amp;n=283155 Art Of Electronics]&#039;&#039;&#039; Bitte nur die englische Version nutzen, da die Übersetzung nicht gut gelungen ist.&lt;br /&gt;
** &#039;&#039;&#039;[http://www.amazon.de/exec/obidos/ASIN/3426037920/qid=1146692611/sr=8-1/ref=sr_8_xs_ap_i1_xgl/302-0461878-1759243 Elektronik ohne Geheimnisse]&#039;&#039;&#039; Von der Anfängerschaltung bis zum Radio Franzis-Verlag ISBN 3-426-03792-0&lt;br /&gt;
**&#039;&#039;&#039;Schaltkreisbastelbuch&#039;&#039;&#039; von H.Jakubaschk und das&lt;br /&gt;
**&#039;&#039;&#039;Radiobastelbuch&#039;&#039;&#039; von K.H. Schubert. Das sind sehr alte DDR-Bücher. Aber die sind für Einsteiger äußerst nahrhaft.&lt;br /&gt;
**&#039;&#039;&#039;Tabellenbuch&#039;&#039;&#039; ein beliebiges Elektronik Tabellenbuch, hier findest Du die  mathematischen Grundlagen als Formelsammlung. Es wird Dich als Nachschlagewerk bis zur Rente begleiten.&lt;br /&gt;
** [http://www.generalatomic.com/teil1/index.html Das Telekosmos-Praktikum (Teil 1)]&lt;br /&gt;
** &#039;&#039;&#039;[http://www.amazon.de/Elektronik-nicht-schwer-Experimente-Gleichstrom/dp/3921608325 Elektronik - gar nicht schwer]&#039;&#039;&#039; Es gibt davon verschiedene Bände. Band 1 ist für den absoluten Einstieg gut, allerdings sind die Schaltungen darin für etwas Fortgeschrittene nicht mehr besonders interesssant. Band 2 hingegen ist sowohl für Einsteiger als auch für Fortgeschrittene empfehlenswert!&lt;br /&gt;
** &#039;&#039;&#039;[http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] PDF&lt;br /&gt;
&lt;br /&gt;
==Grundausstattung für das Elektroniklabor==&lt;br /&gt;
In der folgenden Liste werden die wichtigsten Bauteile aufgeführt, die in keinem Elektroniklabor fehlen dürfen. Da es eine Unmenge an Angeboten der einzelnen Bauteile gibt, wird auf der Seite [[Standardbauelemente]] darauf hingewiesen, welche Bauteile sich im Laufe der Zeit als sinnvoll dargestellt haben.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;[[Steckbrett]]&amp;lt;/b&amp;gt; Mit dem Steckbrett (Breadboard) kann man schnell und ohne Lötkolben eine Schaltung zum Testen aufbauen. &lt;br /&gt;
* &amp;lt;b&amp;gt;[[Steckbrücken und Kabel]]&amp;lt;/b&amp;gt; Ein farbcodiertes Steckbrückenset [http://www.ebay.de/sch/items/?_nkw=Steckbr%C3%BCcken+Set] macht das Verkabeln einfacher. Dazu noch ein Sortiment an Kabeln [http://www.ebay.de/sch/items/?_nkw=Jumper+Wires]. Zur Auswahl des richtigen Drahts fürs Steckbrett sind in folgendem Thread nützliche Informationen zu finden: [http://www.mikrocontroller.net/forum/read-1-350462.html#new].&lt;br /&gt;
*&#039;&#039;&#039;Widerstände:&#039;&#039;&#039; 330 Ω, 1 kΩ, 3.3 kΩ, 10 kΩ, 100 kΩ, 1 MΩ (lies: &amp;quot;Ohm&amp;quot;/&amp;quot;Kilo-Ohm&amp;quot;/&amp;quot;Mega-Ohm&amp;quot;). Ob man sich Kohleschicht- oder Metallfilmwiderstände kauft, ist zunächst unerheblich.&lt;br /&gt;
*&#039;&#039;&#039;Potentiometer:&#039;&#039;&#039; 1 kΩ, 10 kΩ, 100 kΩ&lt;br /&gt;
*&#039;&#039;&#039;Elektrolytkondensatoren&#039;&#039;&#039; (&amp;quot;Elkos&amp;quot;): 1 µF, 10 µF, 100 µF, 470 µF, 1000 µF, 2200 µF (lies: &amp;quot;Mikro-Farad&amp;quot;). Eine Spannungsfestigkeit von 25 Volt ist für den Anfang ausreichend.&lt;br /&gt;
*&#039;&#039;&#039;Keramikkondensatoren:&#039;&#039;&#039; 100 nF; 22 pF (letztere für Quarze)&lt;br /&gt;
*&#039;&#039;&#039;Dioden:&#039;&#039;&#039; 1N4148, 1N4007; BAT43 oder BAT85 (Schottky)&lt;br /&gt;
*&#039;&#039;&#039;[[LED]]s&#039;&#039;&#039; verschiedenfarbig, je nach Geschmack. Man sollte zumindest einige Farben haben, um unterschiedliche Betriebszustände u.ä. anzuzeigen.&lt;br /&gt;
*&#039;&#039;&#039;[[Transistor]]en:&#039;&#039;&#039; BC547, BC557 (Dies sind die beiden Standard npn- bzw. pnp-Transistortypen) und  BC327, BC337 (höherer Kollektorstrom, trotzdem Standard)&lt;br /&gt;
*&#039;&#039;&#039;Operationsverstärker (&amp;quot;OPV&amp;quot; oder &amp;quot;OpAmp&amp;quot;):&#039;&#039;&#039; LM324 (der LM741 ist weniger gut geeignet)&lt;br /&gt;
*&#039;&#039;&#039;Universal-Timer-IC:&#039;&#039;&#039; NE555. Wenn man mit 3,3V Mikrocontrollern arbeitet, dann eventuell die nur wenige Cent teureren CMOS-Version wie LM&#039;&#039;&#039;C&#039;&#039;&#039;555, I&#039;&#039;&#039;C&#039;&#039;&#039;M7555, TS555, TM&#039;&#039;&#039;C&#039;&#039;&#039;555, usw. Diese lassen sich mit niedrigeren Betriebsspannungen betreiben (Datenblatt checken!), während der bipolare NE555 etwa mindestens 4,5V benötigt.&lt;br /&gt;
*&#039;&#039;&#039;[[AVR-Tutorial:_Equipment#Spannungsversorgung|Spannungsregler]]:&#039;&#039;&#039; Ein  7805-Festspannungsregler für die Bereitstellung von 5 V ist sinnvoll, wenn man mal eine Schaltung autark betreiben will. Dann benötigt man in den meisten Fällen noch einen geeigneten Trafo mit einem Brückengleichrichter und einem Glättungskondensator oder ein kleines Steckernetzteil als Basisversorgung für den Spannungsregler. Ein regelbares Netzteil mit Anzeige ist ebenfalls einsetzbar, birgt aber eine Gefahr in sich. Einige ICs, darunter Mikrocontroller, haben enge Betriebsgrenzen, in denen sie funktionieren bzw. oberhalb denen sie sterben (siehe unter &#039;&#039;Absolute Maximum Ratings&#039;&#039; im Datenblatt). Irgendwann ist der Stellknopf am Labornetzteil dann doch höhergestellt, als es dem Chip gut tut... &lt;br /&gt;
*&#039;&#039;&#039;Schalter&#039;&#039;&#039; einfache Schiebeschalter (EIN/AUS)&lt;br /&gt;
*&#039;&#039;&#039;Taster: &#039;&#039;&#039; Bedrahtet oder SMD Kurzhubtaster (billiger). Für Verwendung mit einem Mikrocontroller müssen diese softwareseitig [[Entprellung|entprellt]] werden.&lt;br /&gt;
*&#039;&#039;&#039;Lötnägel&#039;&#039;&#039; Sind dazu gedacht, auf Platinen eingelötet zu werden.  Auf Breadboards haben sie nichts verloren, weil sie mit einem Durchmesser von 1 mm dafür zu dick sind.&lt;br /&gt;
* &#039;&#039;&#039;Jumperpins&#039;&#039;&#039;: gibt es als 40polige Leiste, die man mit dem Seitenschneider kürzen kann.&lt;br /&gt;
* &#039;&#039;&#039;Ein Satz Schnellverbinder-Kabel&#039;&#039;&#039; mit Krokodilklemmen an beiden Enden&lt;br /&gt;
*&#039;&#039;&#039;Draht&#039;&#039;&#039;&lt;br /&gt;
** dünne Litze,&lt;br /&gt;
** dünner isolierter Draht (je dünner desto besser), ideal: Wrap-Draht ca. AWG30, leider etwas schwer erhältlich und teuer, (alte 80-polige IDE-Kabel sind meist AWG30)&lt;br /&gt;
** dünner blanker verzinnter Draht (möglichst &amp;lt; 0,5mm, leider etwas schwer erhältlich) oder lötbarer Silberdraht,&lt;br /&gt;
* Ein paar &#039;&#039;&#039;Lochraster-Platinen&#039;&#039;&#039; mit Lötpunkten, falls man doch nicht nur stecken und nachher auseinanderbauen will. &#039;&#039;&#039;Streifenraster-Platinen&#039;&#039;&#039; sparen ein paar Löt- oder Drahtbrücken.&lt;br /&gt;
&lt;br /&gt;
Installationskabel, dicke 230V-Litze oder Klingeldraht sollte man zum Aufbau von Lochraster-Schaltungen nicht verwenden. Leitungen mit größerem Querschnitt kommen nur zum Einsatz, wenn hohe Ströme fließen sollen.&lt;br /&gt;
&lt;br /&gt;
Zur Aufbewahrung der Kleinteile ist ein Kleinteilemagazin oder einige Sortimentkästen sehr zu empfehlen. Man muss sich nicht von vornherein auf spezielle Bauteile festlegen.&lt;br /&gt;
&lt;br /&gt;
Eine weiterreichende Liste von Standard-Bauelementen findet sich [[Standardbauelemente|hier]].&lt;br /&gt;
&lt;br /&gt;
==Werkzeug==&lt;br /&gt;
* Eine eigene &#039;&#039;&#039;Bastelecke&#039;&#039;&#039;, in der ein Aufbau auch mal ein, zwei Wochen [http://www.mikrocontroller.net/topic/15027#104245 liegenbleiben] kann, bis man wieder Lust oder Zeit hat, was daran zu machen. Bau Dir den Schreibtisch vorm PC nicht zu – Du brauchst den Zugang hierher ;-)&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;stabile Unterlage&#039;&#039;&#039;, die nicht leitend ist, z. B. eine Holzplatte. Die nimmt es im Gegensatz zum Wohnzimmertisch nicht übel, wenn der Lötkolben mal umfällt und einen Brandfleck hinterlässt, oder wenn abgeknipste, scharfe Drahtspitzen (Platinenunterseiten!) kratzen. Eine Anti-Statik-Matte (mit angeschlossener Erdung!!) ist auch eine Überlegung wert, sie bewahrt evtl vor unangenehmen Überraschungen und langer Fehlersuche. &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Halterung&#039;&#039;&#039; um Dinge fixieren zu können. Anfangs tut&#039;s die [http://www.ebay.de/sch/items/?_nkw=Dritte+Hand dritte Hand]. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;kleiner Schraubendreher&#039;&#039;&#039; als Allzweckwerkzeug zum Drücken, Klopfen, Justieren, ICs-aus-dem-Sockel-hebeln, Kabel beim Löten Fixieren.  Ach ja, Schrauben drehen kann man damit auch.&lt;br /&gt;
&lt;br /&gt;
* Eine gute, spitze &#039;&#039;&#039;Pinzette&#039;&#039;&#039; zum Greifen und Richten kleiner Bauteile, Drähte einstecken usw. Außerdem eine Klemmpinzette mit flacher Spitze zum Fixieren von Bauteilen.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Seitenschneider&#039;&#039;&#039;, klein, zum Durchtrennen von Drähten. Opas Kneifzange ist ungeeignet, Omas Handarbeitsschere auch.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Spitzzange&#039;&#039;&#039;, klein, für alles, wofür die Pinzette nicht kräftig genug ist. &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Abisolierzange&#039;&#039;&#039;, Bauform vgl. Wasserrohrzange. Die symmetrischen mit dem Loch vorne sind eher für Starkstromleitungen gedacht.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Skalpell&#039;&#039;&#039; als Allzweckwaffe. Wenn man es einmal hat, will man es nicht mehr missen.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Cuttermesser&#039;&#039;&#039; für alles grobe wofür das Skalpell zu schade ist und wo die Abisolierzange und der Seitenschneider versagt.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Grundausrüstung zum Löten&#039;&#039;&#039;. Detaillierte Informationen zum Löten findest Du im Artikel [[Löten_(praktisch)]].&lt;br /&gt;
** &#039;&#039;&#039;Lötkolben&#039;&#039;&#039; mindestens 30 Watt&lt;br /&gt;
** &#039;&#039;&#039; Lötzinn&#039;&#039;&#039; 1 mm&lt;br /&gt;
** &#039;&#039;&#039;Lötschwamm &#039;&#039;&#039;. Ein gut mit Wasser angefeuchteter Baumwoll-Lumpen (gefaltete &amp;quot;Jute-Tasche&amp;quot;) tut es auch. Destillierte Wasser ist auf Dauer besser als Leitungswasser.&lt;br /&gt;
** Eine &#039;&#039;&#039;Entlötpumpe&#039;&#039;&#039; oder &#039;&#039;&#039;Entlötlitze&#039;&#039;&#039; zum Fehler auszubessern. &lt;br /&gt;
&lt;br /&gt;
* Eine kleine &#039;&#039;&#039;(LED-) Taschenlampe&#039;&#039;&#039; und eine Lupe, um Bauteile wie Dioden oder schwach bedruckte IC&#039;s zu beleuchten und um deren Beschriftung erkennen zu können. Das  Tageslicht kann gelegentlich zu &amp;quot;dunkel&amp;quot; sein.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Crimpzange&#039;&#039;&#039; und die entsprechenden Crimp-Kontakte und Leergehäuse. Macht das Basteln auf Dauer einfacher, da sich Kabel mit passender Länge und passendem Ende (Pin oder Buchse) schnell und ohne Löten herstellen lassen. Ausserdem scheiden irgendwelche Verlängerungen oder Isolierbandkonstruktionen als Fehlerquelle aus. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Netzteil mit Strombegrenzung&#039;&#039;&#039; hilft zu verhindern, dass Dir ständig die Bauteile flöten gehen. Oder Du nimmst deine Schaltungen zunächst mit Batterien oder Akkus in Betrieb, dann kostet es &amp;quot;nur&amp;quot; die Schaltung. Denn bei Batterien/Akkus ist auch darauf zu achten, dass bei einem Kurzschluss sehr hohe Ströme fließen können! Als Strombegrenzung für die Schaltung kann bei kleinen Aufbauten eine 6 V/100 mA Glühlampe in Serie benutzt werden ([http://www.mikrocontroller.net/topic/61119#480376 Forenbeitrag]). Bei einem Kurzschluss heizt sich durch den hohen Strom der Faden auf, die Lampe wird hell, der Widerstand des Fadens nimmt zu, und es können nur die 100 mA zur Schaltung kommen. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;[http://de.wikipedia.org/wiki/Multimeter Multimeter]&#039;&#039;&#039; zum Messen von Spannungen, Strömen und Widerständen. Eine Überlegung wert ist der Kauf zweier Multimeter, weil man dann z. B. gleichzeitig Strom und Spannung messen kann. Prüfspitzen in Klemmausführung haben den Vorteil, dass man die Hände frei hat für wichtigere Dinge. [http://de.wikipedia.org/wiki/Digitalmultimeter Digitale Multimeter] sind in der Regel günstiger als die analogen (Beispiel: 4,95 € bei [http://www.pollin.de pollin]). Für den Anfang reicht normalerweise ein günstiges Gerät, später könnte aber dessen mangelnde Genauigkeit doch einigen Frust erzeugen - das ggf gleich ein paar Euro mehr ausgeben. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;[[Oszilloskop]]&#039;&#039;&#039; ist zu Beginn noch nicht unbedingt notwendig, schadet aber nicht. Ein &#039;&#039;&#039;[[Logikanalysator]]&#039;&#039;&#039; ist für Digital-Schaltungen auch schon hilfreich und ggf. billiger. Wenn man sich eine Weile mit der Materie beschäftigt, kommt die Wünsche von ganz alleine. Ein kleiner Ratgeber zur Auswahl von Geräten findet sich hier im Wiki. &#039;&#039;Tip:&#039;&#039;Für I2C, SPI und UART reicht bei niedrigen Raten (bis so 16kHz) oft ein PC-Oszilloskop mit einem etwas veränderten Mikrofonkabel. Das Selber-Bauen eines Logikanalysators ist ein interessantes Projekt (siehe [[Logic_Analyzer]]), erreicht aber oft nicht die gewünschten Funktionen und Bandbreite - oder scheitert schon an dem grundlegenden [http://de.wikipedia.org/wiki/Henne-Ei-Problem Henne-Ei Problem].&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
* Ein &#039;&#039;&#039;Simulationstool&#039;&#039;&#039; ist nützlich. Mit Simulationsprogrammen kann man sich viel Zeit und Frust ersparen. Man weiß bereits vor dem Aufbau, ob eine Schaltung NICHT funktionieren wird. Der Umkehrschluss (&amp;quot;Das funktioniert dann auch in Echt&amp;quot;) ist leider nicht immer möglich.&lt;br /&gt;
:Viele kommerzielle, aber auch kostenlos erhältliche Simulationsprogramme sind Abkömmlinge eines Programms namens &#039;&#039;&#039;[[SPICE]]&#039;&#039;&#039;. Z.B. enthalten die folgenden Programme nicht ganz zufällig je einen SPICE-Kern für die eigentliche Berechnung. Im Gegensatz zum Original-SPICE bieten sie jedoch den Vorteil einer grafischen Benutzeroberfläche. &lt;br /&gt;
** Die &#039;&#039;&#039;[http://www.electronicsworkbench.com/ Electronic Workbench]&#039;&#039;&#039; (aktuelle Versionen heißen &#039;&#039;&#039;NI Multisim&#039;&#039;&#039;, nachdem der Hersteller von National Instruments übernommen wurde) ist in einigen Fachbüchern (s. Franzis Verlag) als abgespeckte Version mit einem geringeren Umfang an simulierbaren Bauteilen beigelegt und als [http://digital.ni.com/worldwide/germany.nsf/web/all/23834AA0D635C68586257124004EF1C9#3 Studentenversion günstiger erhältlich].&lt;br /&gt;
** &#039;&#039;&#039;[http://www.linear.com/designtools/software/#Spice SwitcherCAD III/LTspice]&#039;&#039;&#039; wird vom Hersteller Linear Technology kostenlos abgegeben. Eigentlich zur Unterstützung bei der Entwicklung von Anwendungen mit Linear Technology Produkten gedacht, enthält es doch einen kompletten SPICE-Kern.&lt;br /&gt;
** Das früher sehr populäre &#039;&#039;&#039;PSpice&#039;&#039;&#039; (erste PC SPICE Version, von der es eine kostenlose &#039;&#039;Student Edition&#039;&#039; gab) wurde mittlerweile von Cadence übernommen und in die OrCAD-Produktlinie integriert. Dabei ist die Student Edition weggefallen. Es gibt statt dessen eine &#039;&#039;&#039;[http://www.cadence.com/products/orcad/downloads/orcad_demo/index.aspx OrCAD PCB Demo-CD]&#039;&#039;&#039;, auf der auch eine eingeschränkte PSpice-Version enthalten ist.&lt;br /&gt;
** &#039;&#039;&#039;[http://ngspice.sourceforge.net/screens.html ngspice]&#039;&#039;&#039; ist eine mit diversen Erweiterungen versehene Freie-Software Version von SPICE für diverse Unix Systeme (Solaris, Linux, Mac OS X, etc.) und Windows XP. Es enthält eine graphische Ausgabe, jedoch selber keine graphische, sondern nur eine Texteingabe. Es ist Teil von &#039;&#039;&#039;[http://www.geda.seul.org/ gEDA]&#039;&#039;&#039;, einer Sammlung von freien &#039;&#039;Electronic Design Automation&#039;&#039;-Werkzeugen, zu denen auch &#039;&#039;&#039;gschem&#039;&#039;&#039; als Schaltplan-Editor gehört. Was zur nächsten Kategorie führt:  &lt;br /&gt;
** &#039;&#039;&#039;[http://qucs.sourceforge.net QUCS]&#039;&#039;&#039; ist ein gutes Simulationsprogramm, welches sich nicht nur zu Lernzwecken eignet, sondern auch zur Simulation von &amp;quot;echten&amp;quot; Schaltungen (Bauteilkatalog mit Strg-4 abrufen). Nützlich ist die Einbindung der Graphen direkt in den Schaltungseditor, da man so &amp;quot;alles auf einem Blick hat&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;[http://ktechlab.org/ KTechLab]&#039;&#039;&#039; ist eine Echtzeitsimulation von analogen und digitalen Bauelementen in Kombination mit PIC-Mikrocontrollern.&lt;br /&gt;
** &#039;&#039;&#039;[http://www.falstad.com/circuit/ P. Falstads Circuit Simulator]&#039;&#039;&#039; ist ein Java-Applet, das man direkt aus dem Browser heraus ausführen kann. Die Möglichkeiten sind zwar nicht ganz so umfangreich wie bei den anderen genannten Simulatoren, trotzdem lässt sich mit dem Applet schnell und einfach eine Schaltung simulieren (Vorteil: Programm muss nicht erst installiert werden)&lt;br /&gt;
So kann das gesamte Mikrocontrollerprojekt simuliert werden. Aber auch in die Transistor/Operationsverstärker/Logiktechnik kann man sich mit dem Programm gut&lt;br /&gt;
einarbeiten.&lt;br /&gt;
* Ein &#039;&#039;&#039;Schaltplaneditor&#039;&#039;&#039; (&#039;&#039;schematic capturer&#039;&#039;) ist nützlich z.&amp;amp;nbsp;B. &lt;br /&gt;
** &#039;&#039;&#039;[http://www.abacom-online.de/html/splan.html sEdit ]&#039;&#039;&#039; Software für Windows auch als Freewareversion geeignet.&lt;br /&gt;
**&#039;&#039;&#039;[http://www.cadsoft.de/ Eagle von Cadsoft]&#039;&#039;&#039; Der Quasi-Standard für Hobbyanwender. Es ist zwar etwas gewöhnungsbedürftig in der Bedienung, aber wenn  man erstmal dahintergekommen ist, was sich Cadsoft dabei gedacht hat, kann man damit leben. Und mit der Freeware-Version, Light- oder auch Non-Profit-Version kann man schon einiges machen. Früher oder später wirst eh nicht darum herumkommen, auch Platinen zu machen, und dann kannst Du schon auf eine Basis von Schaltplänen zurückgreifen, die Du vorher nur z.&amp;amp;nbsp;B. auf Lochraster aufgebaut hast und brav vorher wenigstens einen Schaltplan davon gezeichnet hast.&lt;br /&gt;
** Die bereits erwähnte &#039;&#039;&#039;[http://www.cadence.com/products/orcad/downloads/orcad_demo/index.aspx OrCAD PCB Demo-CD]&#039;&#039;&#039; enthält eine Demo-Version von &#039;&#039;&#039;OrCADE Capture&#039;&#039;&#039;.&lt;br /&gt;
** Das schon erwähnte &#039;&#039;&#039;[http://www.geda.seul.org/tools/gschem/index.html gschem]&#039;&#039;&#039; aus der gEDA-Sammlung.&lt;br /&gt;
** Die freie Software &#039;&#039;&#039;[http://www.lis.inpg.fr/realise_au_lis/kicad/ KiCad]&#039;&#039;&#039; für Linux und Windows (siehe auch den Artikel [[KiCAD]]).&lt;br /&gt;
:Siehe den Artikel [[Schaltplaneditoren]] für weitere Informationen zu Schaltplaneditoren.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Layout-Editor&#039;&#039;&#039; ist nützlich, um den Schaltplan dann in eine Vorlage zum Selbstätzen umzusetzen oder die Platine als Datei zum Leiterplattenhersteller zu senden.&lt;br /&gt;
** Das bereits erwähnte &#039;&#039;&#039;[http://www.cadsoft.de/ Eagle von Cadsoft]&#039;&#039;&#039; gilt auch hier als der Standard im Hobbybereich.&lt;br /&gt;
**&#039;&#039;&#039;[http://www.ibfriedrich.com TARGET 3001! ]&#039;&#039;&#039; vom Ing.-Büro Friedrich ist eine komplette Software vom Schaltplan bis zum Layout, inkl. Simulation oder Isolationsfräsen. Die kostenlose [http://www.ibfriedrich.com/download.htm Discover-Version] geht bis 250 Pins. Einen einfachen Einstieg findet man &#039;&#039;&#039;[http://ibfriedrich.dyndns.org/wiki/ibfwikide/index.php?title=Kurzeinführung2 hier]&#039;&#039;&#039;.&lt;br /&gt;
** In der gEDA-Sammlung für Linux findet man &#039;&#039;&#039;[http://www.geda.seul.org/tools/pcb/index.html PCB]&#039;&#039;&#039;, das allerdings noch Ecken und Kanten hat. &lt;br /&gt;
** Das bereits erwähnte &#039;&#039;&#039;[http://www.lis.inpg.fr/realise_au_lis/kicad/ KiCad]&#039;&#039;&#039; ermöglicht ebenfalls die Erstellung von Platinen-Layouts.&lt;br /&gt;
&lt;br /&gt;
* Zum Aufbau auf Platinen mit &#039;&#039;&#039;Lochraster&#039;&#039;&#039; oder &#039;&#039;&#039;Lochstreifen&#039;&#039;&#039; gibt es die Tools&lt;br /&gt;
** [http://www.geocities.com/stripboarddesigner/ Stripboard Designer] (Shareware)&lt;br /&gt;
** [http://veecad.com/ VeeCAD] Stripboard Layout Editor&lt;br /&gt;
** [http://www.abacom-online.de/html/lochmaster.html Lochmaster] (ca. 40€)&lt;br /&gt;
** [http://blackboard.serverpool.org/Home/News.html Blackboard], das kommt [http://www.mikrocontroller.net/topic/open-source-lochraster-layout hier aus dem Forum], ist opensource und kostenlos. Auf [http://www.sebulli.com/BlackBoard/index.html Sebulli] gibt es ein paar ergänzende Bauteil-Libraries.&lt;br /&gt;
** mit einem Zeichenprogramm ([http://www.mikrocontroller.net/topic/112889 Forenbeitrag])&lt;br /&gt;
** Alternativ kann man mit (Kästchen-)Papier und Stift entwerfen...&lt;br /&gt;
&lt;br /&gt;
==Baukästen== &lt;br /&gt;
Elektronikbaukästen bieten die Möglichkeit, das was man gelernt hat, gleich praktisch anzuwenden. Sie beinhalten die notwendigen Bauteile und sind oft didaktisch sinnvoll aufgebaut.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Kosmos XN&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;XN1000&#039;&#039;&#039; Bereits für Kinder geeignet. Prof. Armstrong und der kleine Roboter Robert führen spielend in die Welt der Elektronik ein.&lt;br /&gt;
** &#039;&#039;&#039;XN2000&#039;&#039;&#039; Die Erweiterung. &lt;br /&gt;
** &#039;&#039;&#039;XN3000&#039;&#039;&#039; Nicht mehr auf Kinder, sondern auf Jugendliche ausgerichtet. Relativ anspruchsvoll, aber verständlich.   &lt;br /&gt;
** &#039;&#039;Nachteil:&#039;&#039; relativ teuer&lt;br /&gt;
*&#039;&#039;&#039;Busch-Elektronik-Kästen (Conrad)&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Nachteil:&#039;&#039; Weil die Bauteile auf kleinen Platten befestigt sind, kann man mit ihnen keine eigenen Schaltungen aufbauen.&lt;br /&gt;
*&#039;&#039;&#039;Polytronic A B C ... (ex. DDR)&#039;&#039;&#039; aber nicht um jeden Preis im Kaufhaus kaufen - also Vorstufe zum Steckbrett&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Elektronik 2006 (amazon)&#039;&#039;&#039;  Sehr gut geeignet, da echte ungesockelte Bauelemente die überall nachgekauft werden können.&lt;br /&gt;
**&#039;&#039;Nachteil:&#039;&#039; Steckbrett wird schnell &amp;quot;zu klein&amp;quot;&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Elektronik mit ICs (Franzis)&#039;&#039;&#039;  Ausgezeichnetes Lernpaket für Theorie und Praxis: &#039;&#039;&#039;[http://www.franzis.de/elo-das-magazin/literatur-und-software/experimente/lernpaket-elektronik-mit-ics Lernpaket Elektronik mit ICs]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Besonders schön:&#039;&#039; Es liegt ein großes Breadboard bei&lt;br /&gt;
**&#039;&#039;Und dazu:&#039;&#039; Es werden nur kommerzielle Bauelemente eingesetzt, alles ist also nachbestellbar, Erweiterungen sind kein Problem.&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Sensortechnik (Franzis)&#039;&#039;&#039;  Hervorragendes Lernpaket für angewandte Sensorelektronik: &#039;&#039;&#039;[http://www.elo-web.de/elektronik-lernpakete/mechatronik/elektrotechnik-industrielle-elektronik/lernpaket-sensortechnik Lernpaket Sensortechnik]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Inhalt:&#039;&#039; Alle gängigen Sensoren, Opto-, Thermo-, Hall-Sensor etc.&lt;br /&gt;
**&#039;&#039;Weiterhin:&#039;&#039; Interessante ICs: LM386, 555, Bargraph-Treiber, LEDs etc. etc.&lt;br /&gt;
*&#039;&#039;&#039;NerdKit&#039;&#039;&#039; Steckbrett, AVR Microcontroller, LCD Screen, Temperatursensor, Piezo-Summer und weitere Bauteile. Interessante Projekte finden sich auf der &#039;&#039;&#039;[http://www.nerdkits.com/ Nerdkits Webseite]&#039;&#039;&#039;. &#039;&#039;Die Dokumentation ist englischsprachig.&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Einsteigerbox Elektronik I:&#039;&#039;&#039; &#039;&#039;&#039;[http://www.ehajo.de/starterkits/einsteigerbox-elektronik-1.html/eHaJo Link: Einsteigerbox von EhaJo]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Kleines aber gut durchdachtes Einsteigerpaket&#039;&#039; &lt;br /&gt;
**&#039;&#039;Inklusive hochwertigem Breadboard, Transistoren, Widerständen, Kondensatoren, Batterieclip etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Sinnvolles Wissen ==&lt;br /&gt;
* Es schadet nichts, wenn man das [http://de.wikipedia.org/wiki/Ohmsches_Gesetz  ohmsche Gesetz] und die [http://de.wikipedia.org/wiki/Kirchhoffsche_Regeln kirchhoffschen Regeln] kennt.&lt;br /&gt;
* [http://www.electronic-weblessons.de Electronic Weblessons] - Multimedial aufbereitetes Basiswissen zum Thema Elektronik in Form von WebLessons von Wis-Con (Multimedia, Sprache Deutsch)&lt;br /&gt;
* http://www.tldp.org/HOWTO/html_single/Coffee/ ;)&lt;br /&gt;
&lt;br /&gt;
== Was tun, wenn es brennt? ==&lt;br /&gt;
&lt;br /&gt;
Hier ist eine Liste der üblichen Anfängerfragen. Bitte überprüfe doch all diese Punkte. Falls Du zu einem der Punkte detaillierte Fragen hast, kannst Du Dich auch an die Experten im Forum wenden. Viel Glück bei der Suche!&lt;br /&gt;
*&#039;&#039;&#039;Anschlüsse vergessen&#039;&#039;&#039; Bevor Du die Schaltung das erste Mal an die Spannungsquelle hängst, überprüfe doch folgendes:&lt;br /&gt;
**&#039;&#039;&#039;VCC&#039;&#039;&#039; und &#039;&#039;&#039;GND&#039;&#039;&#039; Wurden die Bauteile mit der Versorgungsspannung verbunden? In aller Eile vergisst man dies leicht.&lt;br /&gt;
**&#039;&#039;&#039;Abblockkondensatoren&#039;&#039;&#039; Für sichere Funktion die Abblockkondensatoren (oft 100nF) nahe an den Pins anschließen. Sie sollen Störungen abfangen.&lt;br /&gt;
*&#039;&#039;&#039;Bauteile richtig herum eingesetzt?&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Wackelkontakt&#039;&#039;&#039; am Breadboard. Die Steckbretter haben leider häufig die Eigenschaft, dass die Kontakte nicht perfekt sind.&lt;br /&gt;
*&#039;&#039;&#039;korrekte Werte&#039;&#039;&#039; Gelegentlich liest man von Newbies, die etwas von 100µF am Quarz schreiben und sich ernsthaft wundern, weshalb nichts schwingt...&lt;br /&gt;
&lt;br /&gt;
===Probleme beim Mikrocontroller===&lt;br /&gt;
*&#039;&#039;&#039;Quarz schwingt nicht&#039;&#039;&#039;. Ein Anzeichen hierfür ist, wenn die Spannung zwischen XTAL1 und GND nicht ungefähr 1/2  VCC beträgt.&lt;br /&gt;
*&#039;&#039;&#039;Steckkontakte&#039;&#039;&#039; sind nicht ok -  Steckbretter haben manchmal schlechte Kontakte. Aus diesem Grund ist es sinnvoll, Mikrocontroller mit Sockel auf eine Platine zu löten.&lt;br /&gt;
*&#039;&#039;&#039;falsche Kondensatoren&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Bauteil beschädigt&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Weblinks ===&lt;br /&gt;
* [http://warmcat.com/milksop/prototypes.html Numbnut&#039;s guide to debugging prototypes] (engl.)&lt;br /&gt;
(Seite ist leider nicht mehr online und auch nicht in web.archive.org. Es gibt eine Kopie auf einer chinesischen Seite =&amp;gt; Selbersuchen)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
*&#039;&#039;&#039;http://www.csd-electronics.de&#039;&#039;&#039; Günstiger Anbieter, führt vieles, was man als Einsteiger braucht, dazu oft günstig. Versandkosten 3,85 bis 4,85 €.&lt;br /&gt;
*&#039;&#039;&#039;http://www.reichelt.de&#039;&#039;&#039; Mittel-günstiger Anbieter, führt leider nicht alles, was das Elektronikerherz begehrt. Der Grund hierfür ist, dass er sich hauptsächlich auf Mainstreamprodukte stützt, die einen großen Absatz finden. Nur so ist der günstige Preis möglich. Mindestbestellwert und Versandkosten nach Deutschland und Österreich sind gewichtabhängig, ab 5,60 oder 11,20 €.&lt;br /&gt;
* &#039;&#039;&#039;http://www.pollin.de&#039;&#039;&#039; Diverse Restposten, sehr günstige Preise aber keine große Auswahl an Standardbauteilen.&lt;br /&gt;
* &#039;&#039;&#039;http://www.conrad.de&#039;&#039;&#039; Filialen in vielen Städten, oft relativ hohe Preise - aber nicht immer. Vergleichen lohnt.&lt;br /&gt;
* &#039;&#039;&#039;http://www.ELV.de&#039;&#039;&#039; Versandkosten 6,95 € (inklusive Zustellgebühr)&lt;br /&gt;
* &#039;&#039;&#039;http://www.segor.de&#039;&#039;&#039; Hat manchmal Teile, die man bei Reichelt, Conrad nicht bekommt. Versandkosten 6,00 € (bei Kleinmengen jedoch 10,00 €)&lt;br /&gt;
* &#039;&#039;&#039;http://www.digikey.de&#039;&#039;&#039; Recht hohe Versandkosten dafür aber fast alles erhältlich auch in grossen Mengen. &lt;br /&gt;
* &#039;&#039;&#039;http://www.guloshop.de&#039;&#039;&#039; nur wenige Artikel, aber fast immer der günstigste Anbieter bei AVR-Standard-Mikrocontrollern. Versandkosten 2,40 bis 4,80 €.&lt;br /&gt;
* &#039;&#039;&#039;http://www.batterie24.de/Lithium-Batterien.html&#039;&#039;&#039; Für Schaltungen/Stromversorgung hochwertige Lithium-Batterien von Saft &amp;amp; Ultralife sowie FGS-Bleiakkus zu günstigen Preisen (z.B. 1 x Saft Lithium-Batterie LS14500 3,6V Mignon AA für 4,40 €).&lt;br /&gt;
&lt;br /&gt;
Der Artikel [[Elektronikversender]] zählt viele weitere Versender auf. Doch sollte man darauf achten, dass gerade sogenannte Distributoren in Deutschland normalerweise nicht an Privatleute verkaufen wollen (eine merkwürdige deutsche Spezialität) und mit Privatleuten auch mal sehr ruppig umgehen. Eine Ausnahme machen einige Distributoren für Studenten, da man sich so erhofft, frühzeitig Kontakt zu späteren gewerblichen Kunden zu bekommen. Eine andere Ausnahme sind normale Versender, die sich zusätzlich als Distributoren betätigen.&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=97406</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=97406"/>
		<updated>2017-09-21T20:21:05Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Label von Link aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series.html STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* STM32T - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* STM32W - nicht mehr in Produktion&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103rc.html STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/resource/en/reference_manual/cd00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [https://static.docs.arm.com/ddi0403/e/DDI0403E_c_armv7m_arm.pdf ARMv7M Architecture Reference Manual] beschreibt detailliert die abstrakte ARMv7M-Architektur, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [https://static.docs.arm.com/100166/0001/arm_cortexm4_processor_trm_100166_0001_00_en.pdf Cortex-M4 Technical Reference Manual] bzw. das [https://static.docs.arm.com/100165/0201/arm_cortexm3_processor_trm_100165_0201_00_en.pdf Cortex-M3 Technical Reference Manual] beschreibt Eigenschaften der Cortex-M3/4 Implementierung der Architektur, insbesondere die Geschwindigkeit der einzelnen Prozessor-Instruktionen.&lt;br /&gt;
* Das [http://www.st.com/resource/en/programming_manual/cd00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/resource/en/programming_manual/cd00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/resource/en/errata_sheet/cd00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/resource/en/application_note/cd00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
Der GCC (in seinen verschiedenen Binärdistributionen) ist der einzige ARM Compiler der [http://de.wikipedia.org/wiki/C%2B%2B11 C++11] unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [http://gnuarmeclipse.livius.net/blog/ GNU ARM Plug-in] (Bei Verwendung vom GCC-ARM-Embedded als Toolchain &amp;quot;Sourcery G++ Lite&amp;quot; auswählen, dieser sieht für eclipse gleich aus) (Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Turtelizer2 oder andere JTAG Programmieradapter&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist der ultimative Compiler für denjenigen, der nur mal schnüffeln will. Doppelklick auf das gewünschte Board, Beispielprogramm (rechts am Rand auswählen), kompilieren und über USB hochladen. Schon blinkt es! Wenn man ein Projekt dann lieber doch lokal bearbeiten möchte (z.B. um einen Debugger zu benutzen) dann kann man die Projekte über die Export-Funktion herunterladen. Es werden verschiedene IDE sowie ein gcc-Kommandozeilenprojekt unterstützt. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [https://atollic.com/pricing/ Atollic TrueStudio Lite] ist eine kostenlose Entwicklungsumgebung für &amp;gt;2800 ARM Prozessoren/µCs mit integrierter Eclipse-IDE und C/C++ Compiler und Debugger. Ohne size limit.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC-Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse-basierten IDEs gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic TrueStudio], auf Eclipse/GCC basierend. Aktuell ist V 5.4, diese hat kein Codesize Limit. Eingeschränkt sind Debug Optionen wie Variablen LiveWatch oder Tracing, was aber auch &#039;bessere&#039; Debugprobes erforderlich macht. Das Semihosting (printf über SWD/JTAG) fällt leider auch unter die Restriktionen der Lite Version. Atollic TrueStudio unterstützt viele verschiedene Hersteller von ARM MCUs, dadurch ist das Paket sehr umfangreich. In der Lite Version muss man sich beim Start für ein paar Sekunden einen Dialog mit dem Upgrade Angebot gefallen lassen.&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.code-red-tech.com Code Red] (GCC basierend)&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeMX Libraries (HAL, LL), nicht mit den alten Standard Peripheral Libraries (SPL).&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei, welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann, befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), Keil, ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link.html ST-LINK],  [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2]&lt;br /&gt;
* Jedes STM32 NUCLEO und DISCOVERY board hat einen ST-LINK für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware benutzt werden kann (ca. 12,- bis 19,-€, je nach Typ). Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Er unterstützt aber nur MCUs von ST. NXP, Atmel oder TI lassen sich damit nicht programmieren. Diese ST-LINK-Variante beherrscht nur SWD, kein JTAG und hat keine Treiber, die den Programmierprozessor vom Zielsystem galvanisch entkoppeln. Der ST-Link in der Adapterversion mit Gehäuse hat diese Nachteile nicht und kostet auch nur um 20€.  Unter Linux kann der Virtuellen COM-Port des ST-LINK/V2 mit Hilfe des cdc-acm Treibers aus dem Kernel angesprochen werden ([https://embeddedmicro.com/forum/viewtopic.php?t=82 siehe hier]). &#039;&#039;&#039;UPDATE:&#039;&#039;&#039; Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können jetzt auch auf J-Link OB geflasht werden. Details und Hinweise dazu [https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board hier].&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
ST-Link Adapter können jetzt auch unter Linux mit neuer Firmware geflasht werden: [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Download]. &lt;br /&gt;
&lt;br /&gt;
Andere [[JTAG]] Adapter wie z.B. der ULink2 von Keil funktionieren nur mit dem Keil Compiler. Leider kann dieser auch kein fremdes Binary oder Hex-File in den Controller schreiben.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [https://github.com/texane/stlink Stlink]&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 1000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (der Link funktioniert nicht mehr, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versand Europaweit im endasmedia.ch Shop&lt;br /&gt;
* STM32F105 Controller für 2.50€ [http://shop.endasmedia.ch/index.php?id_product=8&amp;amp;controller=product&amp;amp;id_lang=1 shop.endasmedia.ch]&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [http://www.hbe-shop.de HBE (Farnell Programm für Private)] &lt;br /&gt;
* [http://www.sander-electronic.de/be00069.html Sander]&lt;br /&gt;
* [http://www.tme.eu/de/katalog/index.phtml#cleanParameters%3D1%26search%3DSTM32F10%26bf_szukaj%3D+ TME] &lt;br /&gt;
* [http://teske-electronics.de/index.php?cPath=3_9_53 Teske electronics]&lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Mouser, Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* Siehe [[:Kategorie:ARM-Boards]]&lt;br /&gt;
* [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=gruppe&amp;amp;id=14 Im Shop von Embedded Projects]&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/ARM/ARM-Cortex-M3 Cortex M3 bei Watterott]&lt;br /&gt;
* [http://www.raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer und Primer2 von Raisonance]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.propox.com/products/t_174.html Propox, Header-Boards für 103R und 103V sowie Trägerplatine dafür]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://olimex.com/dev/index.html STM32 bei Olimex]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [http://www.de.rs-online.com/web/p/products/7458434/ STM32Discovery bei RS-Components] 12,65 € +MwSt.&lt;br /&gt;
* [http://www.segor.de/#Q=STM32 VL DISCOVERY] STM32 Discovery bei Segor&lt;br /&gt;
* [http://www.watterott.com/de/STM32F4Discovery STM32F4DISCOVERY] STM32F4 Cortex M4 Controller mit JTAG-Debugger auf der Platine bei Watterott für 16,66EUR.&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/443910/ STM32F4 Discovery Kit bei Conrad] 17,11 €&lt;br /&gt;
* [http://www.ST.com/stm32l152c-discovery STM32 L1 Discovery] mit kleiner LCD-Anzeige; [http://www.ST.com/web/en/catalog/tools/PF250990 Weitere Informationen dazu]&lt;br /&gt;
* [http://www.mcu-raisonance.com/~open4-development-platform__microcontrollers__tool~tool__T018:g65gu6ghg2n.html/ Open 4 oder auch genannt Evo-Primer]&lt;br /&gt;
* [http://www.wayengineer.com/index.php?main_page=index&amp;amp;cPath=50_66&amp;amp;page=1&amp;amp;sort=3a WayEngineer]&lt;br /&gt;
* [http://thinkembedded.ch/ST-STMicroelectronics:::24.html Im Thinkembedded Shop] in der Schweiz / DiscoveryF4, div. ETT und Olimex Boarde ab 20,18 CHF / 16,15 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://shop.myavr.de/ARM-Produktlinie/STM32F4-Discovery.htm?sp=article.sp.php&amp;amp;artID=200072 Im myAVR Shop] DiscoveryF4 mit möglichem Zubehör 16,45 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://www.keil.com/boards/cortexm.asp Keil/ARM Demoboards]&lt;br /&gt;
* [http://www.phytec.de Phytec]&lt;br /&gt;
* [http://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=37 verschiedene ARM Produkte und Erweiterungen bei myAVR]&lt;br /&gt;
* [http://re.reworld.eu/de/produkte/s64dil-405/index.htm S64DIL-405 STM32Fxxx ARM Cortex M3 Mikrocontrollermodul mit USB-Schnittstelle, Steckbretttauglich] (Leerplatine eignet sich auch für STM32F1xx Prozessoren.)&lt;br /&gt;
* [http://www.amazon.de/STM32F4-DISCOVERY-STM32F429-Cortex-M4-Development/dp/B00HGG0KHY STM32F429 DISCOVERY Cortex M4 mit 2,4&amp;quot; Touch-TFT, 3-Achs Sensor, 64 MBit SDRAM ab ~25 EUR bei Amazon, Ebay u.a.]&lt;br /&gt;
* [https://dsp-sys.de/24-bayerhw-de/26-xynergy-xs-so-dimm-module-mit-cortex-m4-spartan-6-ddr3-ram SO-DIMM Module mit STM32F4, Spartan-6 &amp;amp; DDR3 RAM] Breakout-Board mit CAN (2x isoliert), UART, LAN, SPI, I2C and USB-OTG u.v.m.&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/173753 Diskussion zum Artikel]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/AllItems.aspx Forum auf der ST Homepage] &lt;br /&gt;
* [http://www.stm32circle.com/hom/index.php STM32 Community] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://www.ebv.com/fileadmin/products/Press_Print/Brochures/Product_Brochures/EBV_Cortex%20Collection_V2.pdf Übersicht der Cortex Prozessoren und deren Hersteller (nicht nur ST, von EBV)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/258652 Tutorial]&lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net STM32F4 Quellcode-Librarys und CooCox-Projekte in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/wiki/Main_Page libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=97405</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=97405"/>
		<updated>2017-09-21T20:20:27Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Label eines Weblinks aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* 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?&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 4€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Betriebssystem || [[STM32]] || [[AVR]] || [[PIC]] || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Windows &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.coocox.org/CooCox_CoIDE.htm CooCox, EmBitz, Eclipse] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|Atmel-Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| Linux&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|z.B. [http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| MacOS&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|??&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* [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.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zur STM32F1 Serie]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=96618</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=96618"/>
		<updated>2017-06-15T13:38:31Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Label von Link aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1575 STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32t-series.html STM32T]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32w-series.html STM32W]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF164486 STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00191185.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403c/index.html ARMv7M Architecture Reference Manual] beschreibt detailliert den Prozessorkern, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/web/en/resource/technical/document/application_note/CD00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
Der GCC (in seinen verschiedenen Binärdistributionen) ist der einzige ARM Compiler der [http://de.wikipedia.org/wiki/C%2B%2B11 C++11] unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [http://gnuarmeclipse.livius.net/blog/ GNU ARM Plug-in] (Bei Verwendung vom GCC-ARM-Embedded als Toolchain &amp;quot;Sourcery G++ Lite&amp;quot; auswählen, dieser sieht für eclipse gleich aus) (Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Turtelizer2 oder andere JTAG Programmieradapter&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist der ultimative Compiler für denjenigen, der nur mal schnüffeln will. Doppelklick auf das gewünschte Board, Beispielprogramm (rechts am Rand auswählen), kompilieren und über USB hochladen. Schon blinkt es! Wenn man ein Projekt dann lieber doch lokal bearbeiten möchte (z.B. um einen Debugger zu benutzen) dann kann man die Projekte über die Export-Funktion herunterladen. Es werden verschiedene IDE sowie ein gcc-Kommandozeilenprojekt unterstützt. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC-Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse-basierten IDEs gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic TrueStudio], auf Eclipse/GCC basierend. Aktuell ist V 5.4, diese hat kein Codesize Limit. Eingeschränkt sind Debug Optionen wie Variablen LiveWatch oder Tracing, was aber auch &#039;bessere&#039; Debugprobes erforderlich macht. Das Semihosting (printf über SWD/JTAG) fällt leider auch unter die Restriktionen der Lite Version. Atollic TrueStudio unterstützt viele verschiedene Hersteller von ARM MCUs, dadurch ist das Paket sehr umfangreich. In der Lite Version muss man sich beim Start für ein paar Sekunden einen Dialog mit dem Upgrade Angebot gefallen lassen.&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.code-red-tech.com Code Red] (GCC basierend)&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeFx Libraries, nicht mit den alten Standard Peripheral Libraries.&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
Die Software kann [http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF259242 bei ST heruntergeladen] werden. Sie wird im Windows Executable Format angeboten und erweckt daher den Eindruck, ausschließlich für Windows geeignet zu sein, ist aber tatsächlich Java-basiert und daher seit Version 4.13 vollständig betriebssystem-unabhängig.&lt;br /&gt;
==== STM32CubeMX unter Linux ====&lt;br /&gt;
Ab der Version 4.13 liegt jetzt ein Linux-Installer mit bei.&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann STM32CubeMX installiert werden, indem man das heruntergeladene .zip-Archiv entpackt, und den enthaltenen Installer per Java über ein Terminal startet:&lt;br /&gt;
&amp;lt;pre&amp;gt;java -jar SetupSTM32CubeMX-4.5.0.exe&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Anlegen der Desktop/Startmenü-Shortcuts funktioniert unter Linux nicht richtig und kann daher deaktiviert werden. Um STM32CubeMX nach der Installation zu starten, wechselt man im Terminal in den Installationsort und gibt ein:&lt;br /&gt;
&amp;lt;pre&amp;gt;java -jar STM32CubeMX.exe&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit das funktioniert, muss die Oracle Java Runtime Environment 1.8 installiert sein (Siehe z.B. [http://wiki.ubuntuusers.de/Java/Installation/Oracle_Java/Java_8#Java-8-JRE hier] für Ubuntu). Nicht benötigt wird wine.&lt;br /&gt;
&lt;br /&gt;
Update:&lt;br /&gt;
In der Datei stm32cubemx.zip  md5sum: 86217b9f14b99b1133bda6e87dbd1270&lt;br /&gt;
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF259242?icmp=pf259242_pron_pr_jun2014&amp;amp;sc=stm32cube-pr6#&lt;br /&gt;
befindet sich u.a. SetupSTM32CubeMX-4.13.0.linux (ist ein ELF 64-bit). Mit Ausführen wird cubemx standalone (nicht in Eclipse) im Pfad der Wahl installiert. Es reicht Java 1.7.xx, hier java -version: java version &amp;quot;1.7.0_95&amp;quot;&lt;br /&gt;
OpenJDK Runtime Environment (IcedTea 2.6.4) (suse-24.30.3-x86_64). Das Anlegen von Desktop/StartMenü Icons, Stichworte freedesktop.org, &amp;quot;Desktop Entry&amp;quot;, funktioniert. Man muss aber beachten, dass ein Symlink zum Starten nicht funktioniert. Stattdessen ist eine ausführbare Datei im Pfad anzulegen, z.B. /usr/local/bin/cubemx mit z.B dem Inhalt /array_data01/STM32CubeMX/STM32CubeMX&lt;br /&gt;
&lt;br /&gt;
==== STM32CubeMX unter Mac OS ====&lt;br /&gt;
Mit der Version 4.14 wird ein Setup-Programm für Mac OS angeboten, das sich in der stm32cubemx.zip Datei befindet (siehe auch Update zur Linux-Unterstützung).&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), Keil, ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link.html ST-LINK],  [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2]&lt;br /&gt;
* Jedes STM32 NUCLEO und DISCOVERY board hat einen ST-LINK für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware benutzt werden kann (ca. 12,- bis 19,-€, je nach Typ). Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Er unterstützt aber nur MCUs von ST. NXP, Atmel oder TI lassen sich damit nicht programmieren. Diese ST-LINK-Variante beherrscht nur SWD, kein JTAG und hat keine Treiber, die den Programmierprozessor vom Zielsystem galvanisch entkoppeln. Der ST-Link in der Adapterversion mit Gehäuse hat diese Nachteile nicht und kostet auch nur um 20€.  Unter Linux kann der Virtuellen COM-Port des ST-LINK/V2 mit Hilfe des cdc-acm Treibers aus dem Kernel angesprochen werden ([https://embeddedmicro.com/forum/viewtopic.php?t=82 siehe hier]). &#039;&#039;&#039;UPDATE:&#039;&#039;&#039; Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können jetzt auch auf J-Link OB geflasht werden. Details und Hinweise dazu [https://www.segger.com/jlink-st-link.html hier].&lt;br /&gt;
* [http://www.raisonance.com/~rlink-debugger-programmer__microcontrollers__tool~tool__T018:4cn9ziz4bnx6.html Raisonance RLink]&lt;br /&gt;
* [http://www.amontec.com Amontec] (2016-05: Website OFFLINE)&lt;br /&gt;
* [http://www.hjtag.com H-JTAG] nur noch STD- und PRO-Edition (Cortex-M0, Cortex-M3, kein M4), Personal-Edition (LPT-Port) war für ca. 60€ zu haben, läuft mit ADS, SDT, IAR, Vision und RVDS (möglicher Selbstbau der Personal-Edition siehe [http://nazya.com/freeshipping/single/4929017/orig_desc.html hier])&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
ST-Link Adapter können jetzt auch unter Linux mit neuer Firmware geflasht werden: [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Download]. &lt;br /&gt;
&lt;br /&gt;
Andere [[JTAG]] Adapter wie z.B. der ULink2 von Keil funktionieren nur mit dem Keil Compiler. Leider kann dieser auch kein fremdes Binary oder Hex-File in den Controller schreiben.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/colinkEx.htm unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.oocdlink.com/ OOCDLink]  [_Link ist derzeit nicht verfügbar_]&lt;br /&gt;
* [https://github.com/texane/stlink Stlink]&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
* [http://capitanio.org/mlink/ Linux Demo Code für die Discovery&#039;s ST-Link Programmierung]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 1000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (der Link funktioniert nicht mehr, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versand Europaweit im endasmedia.ch Shop&lt;br /&gt;
* STM32F105 Controller für 2.50€ [http://shop.endasmedia.ch/index.php?id_product=8&amp;amp;controller=product&amp;amp;id_lang=1 shop.endasmedia.ch]&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [http://www.hbe-shop.de HBE (Farnell Programm für Private)] &lt;br /&gt;
* [http://www.sander-electronic.de/be00069.html Sander]&lt;br /&gt;
* [http://www.tme.eu/de/katalog/index.phtml#cleanParameters%3D1%26search%3DSTM32F10%26bf_szukaj%3D+ TME] &lt;br /&gt;
* [http://teske-electronics.de/index.php?cPath=3_9_53 Teske electronics]&lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Mouser, Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* Siehe [[:Kategorie:ARM-Boards]]&lt;br /&gt;
* [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=gruppe&amp;amp;id=14 Im Shop von Embedded Projects]&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/ARM/ARM-Cortex-M3 Cortex M3 bei Watterott]&lt;br /&gt;
* [http://www.raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer und Primer2 von Raisonance]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.propox.com/products/t_174.html Propox, Header-Boards für 103R und 103V sowie Trägerplatine dafür]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://olimex.com/dev/index.html STM32 bei Olimex]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [http://www.de.rs-online.com/web/p/products/7458434/ STM32Discovery bei RS-Components] 12,65 € +MwSt.&lt;br /&gt;
* [http://www.segor.de/#Q=STM32 VL DISCOVERY] STM32 Discovery bei Segor&lt;br /&gt;
* [http://www.watterott.com/de/STM32F4Discovery STM32F4DISCOVERY] STM32F4 Cortex M4 Controller mit JTAG-Debugger auf der Platine bei Watterott für 16,66EUR.&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/443910/ STM32F4 Discovery Kit bei Conrad] 17,11 €&lt;br /&gt;
* [http://www.ST.com/stm32l152c-discovery STM32 L1 Discovery] mit kleiner LCD-Anzeige; [http://www.ST.com/web/en/catalog/tools/PF250990 Weitere Informationen dazu]&lt;br /&gt;
* [http://www.mcu-raisonance.com/~open4-development-platform__microcontrollers__tool~tool__T018:g65gu6ghg2n.html/ Open 4 oder auch genannt Evo-Primer]&lt;br /&gt;
* [http://www.wayengineer.com/index.php?main_page=index&amp;amp;cPath=50_66&amp;amp;page=1&amp;amp;sort=3a WayEngineer]&lt;br /&gt;
* [http://thinkembedded.ch/ST-STMicroelectronics:::24.html Im Thinkembedded Shop] in der Schweiz / DiscoveryF4, div. ETT und Olimex Boarde ab 20,18 CHF / 16,15 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://shop.myavr.de/ARM-Produktlinie/STM32F4-Discovery.htm?sp=article.sp.php&amp;amp;artID=200072 Im myAVR Shop] DiscoveryF4 mit möglichem Zubehör 16,45 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://www.keil.com/boards/cortexm.asp Keil/ARM Demoboards]&lt;br /&gt;
* [http://www.phytec.de Phytec]&lt;br /&gt;
* [http://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=37 verschiedene ARM Produkte und Erweiterungen bei myAVR]&lt;br /&gt;
* [http://re.reworld.eu/de/produkte/s64dil-405/index.htm S64DIL-405 STM32Fxxx ARM Cortex M3 Mikrocontrollermodul mit USB-Schnittstelle, Steckbretttauglich] (Leerplatine eignet sich auch für STM32F1xx Prozessoren.)&lt;br /&gt;
* [http://www.amazon.de/STM32F4-DISCOVERY-STM32F429-Cortex-M4-Development/dp/B00HGG0KHY STM32F429 DISCOVERY Cortex M4 mit 2,4&amp;quot; Touch-TFT, 3-Achs Sensor, 64 MBit SDRAM ab ~25 EUR bei Amazon, Ebay u.a.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/173753 Diskussion zum Artikel]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/AllItems.aspx Forum auf der ST Homepage] &lt;br /&gt;
* [http://www.stm32circle.com/hom/index.php STM32 Community] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://www.ebv.com/fileadmin/products/Press_Print/Brochures/Product_Brochures/EBV_Cortex%20Collection_V2.pdf Übersicht der Cortex Prozessoren und deren Hersteller (nicht nur ST, von EBV)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/258652 Tutorial]&lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net STM32F4 Quellcode-Librarys und CooCox-Projekte in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/wiki/Main_Page libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zu ARM Cortex M3 Mikrocontrollern der STM32F1 Serie]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=96598</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=96598"/>
		<updated>2017-06-10T21:18:41Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Weblinks, Foren, Communities, Tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* 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?&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 4€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Betriebssystem || [[STM32]] || [[AVR]] || [[PIC]] || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Windows &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.coocox.org/CooCox_CoIDE.htm CooCox, EmBitz, Eclipse] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|Atmel-Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| Linux&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|z.B. [http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| MacOS&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|??&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* [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.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zu ARM Cortex M3 Mikrocontrollern der STM32F1 Serie]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=96597</id>
		<title>STM32 für Einsteiger</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32_f%C3%BCr_Einsteiger&amp;diff=96597"/>
		<updated>2017-06-10T21:18:11Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Weblink hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wiederkehrend hier im Forum &amp;quot;Mit welchem Mikrocontroller anfangen?&amp;quot;. 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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Bild:STM32F407SB.jpg|thumb|right|340px|STM32F417 auf einem Selbstbau-Board]]&lt;br /&gt;
&lt;br /&gt;
= Eigene Fähigkeiten und Wünsche =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel geht davon aus, dass bereits Elektronikkenntnisse vorhanden sind. Wenn nicht dann sollte man erst einmal den Artikel &amp;quot;[[Absolute Beginner]]&amp;quot; durcharbeiten, sowie die anderen Artikel aus der Kategorie &amp;quot;[http://www.mikrocontroller.net/articles/Kategorie:Grundlagen Grundlagen]&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Zu erst einmal die Randbedingungen, mit der man sich selbst zu erst einmal einschätzen sollte:&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Fähigkeit || [[Cortex]] || [[AVR]]  || [[Arduino]] || colspan=&amp;quot;3&amp;quot; | [[PIC]] || [[MSP430]]&lt;br /&gt;
|-&lt;br /&gt;
| Bitbreite, jedoch unwichtig für Einsteiger || align=&amp;quot;center&amp;quot; | 32-bit || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 8-bit || align=&amp;quot;center&amp;quot; | 8-bit (PIC18) || align=&amp;quot;center&amp;quot; | 16-bit (PIC24) || align=&amp;quot;center&amp;quot; | 32-bit (PIC32) || align=&amp;quot;center&amp;quot; | 16-bit&lt;br /&gt;
|-&lt;br /&gt;
| Neueinsteiger, kaum Elektronikkenntnisse, noch nie programmiert &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;AVR_TUT1&amp;quot;&amp;gt;[http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht], RoboterNetz: AVR-Einstieg leicht gemacht&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_TUT2&amp;quot;&amp;gt;[http://www.avr-asm-tutorial.net/avr_de/], Tutorial für das Erlernen der Assemblersprache von AVR-Einchip-Prozessoren&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist SD-Card oder Grafik-Display&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &amp;lt;ref name=&amp;quot;PIC_SD&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2680&amp;amp;dDocName=en537999], Microchip Memory Disk Drive File System for PIC18 PIC24 dsPIC PIC32&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot;&amp;gt;[http://www.microchip.com/pagehandler/en-us/technology/graphics/], Microchip Graphics Library&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_SD&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;PIC_LCD&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist TCP/IP Netzwerk&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC_TCP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2505&amp;amp;param=en535724], Microchip TCP/IP stack&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Wunsch ist Kamera und Video-/Bildbearbeitung&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| Möchte die Erkenntnisse beruflich nutzen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
| Strom sparende Anwendungen &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt; 300 nA Sleep&amp;lt;ref name=&amp;quot;STM_Power&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295], [[STM32]] L1 series of ultra-low-power MCUs&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;230 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;br&amp;gt;100 nA Sleep&amp;lt;ref name=&amp;quot;AVR_Power1&amp;quot;&amp;gt;[http://www.atmel.com/technologies/lowpower/default.aspx], Atmel picoPower Technology&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;AVR_Power2&amp;quot;&amp;gt;[http:/www.futurlec.com/News/Atmel/PicoPower.shtml], Atmel Releases New picoPower AVR Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;340 μA/MHz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | X&amp;lt;br&amp;gt;9 nA Sleep&amp;lt;ref name=&amp;quot;PIC_XLPvsTI&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39989A.pdf], The Truth about Power Consumption in PIC® MCUs with &lt;br /&gt;
XLP Technology vs. TI’s MSP430&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;PIC_XLP&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/30009941F.pdf], nanoWatt XLP eXtreme Low Power PIC® Microcontrollers&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;35 μA/MHz || align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;br&amp;gt; 100 nA Sleep&amp;lt;ref name=&amp;quot;TI_Power1&amp;quot;&amp;gt;[http://www.ti.com/lit/wp/slay015/slay015.pdf], Texas Instruments: Ultra-Low Power Comparison: MSP430 vs. Microchip XLP&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;TI_Power2&amp;quot;&amp;gt;[http://www.ti.com/ww/mx/multimedia/webcasts/Aspectos_Generales_MSP430.pdf], Texas Instruments: Meet MSP430&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;100 μA/MHz &lt;br /&gt;
|-&lt;br /&gt;
| Multithreading, RTOS, Schedulern &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;AVR_RTOS1&amp;quot;&amp;gt;[http://www.freertos.org/a00098.html], Atmel AVR freeRTOS port&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;AVR_RTOS2&amp;quot;&amp;gt;[http://www.femtoos.org/], Femto OS: RTOS for small MCU&#039;s like AVR&amp;lt;/ref&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &amp;lt;ref name=&amp;quot;PIC_RTOS2&amp;quot;&amp;gt;[http://www.freertos.org/a00097.html], Microchip PICmicro (PIC18) freeRTOS Port&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;PIC_RTOS3&amp;quot;&amp;gt;[http://www.pumpkininc.com/], Salvo RTOS&amp;lt;/ref&amp;gt;|| align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot;&amp;gt;[http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en531543&amp;amp;redirects=rtos], 3rd Party RTOS selection guide&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | X&amp;lt;ref name=&amp;quot;PIC_RTOS&amp;quot; /&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;TI_RTOS&amp;quot;&amp;gt;[http://processors.wiki.ti.com/index.php/MSP430_Real_Time_Operating_Systems_Overview], TI Wiki: MSP430 Real Time Operating Systems Overview&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Besonders große, speicherintensive Programme&amp;lt;br&amp;gt;z.B. Grafiken, Fonts &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 2MB Flash&amp;lt;br&amp;gt;bis 256kB SRAM &amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | bis 256kB Flash&amp;lt;br&amp;gt;bis 16kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 128kB Flash&amp;lt;br&amp;gt;bis 4kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 98kB SRAM || bis 2MB Flash&amp;lt;br&amp;gt;bis 512kB SRAM &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | bis 512KB Flash&amp;lt;br&amp;gt;bis 66kB SRAM &lt;br /&gt;
|-&lt;br /&gt;
| Sehr viel PWM mit komplexem Timing&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | AT90Spwm &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | X || align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
|-&lt;br /&gt;
| Deutschsprachige Community &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | O &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X &amp;lt;ref name=&amp;quot;PIC-Projekte&amp;quot;&amp;gt;[http://pic-projekte.de/], pic-projekte.de&amp;lt;/ref&amp;gt; &amp;lt;ref name=&amp;quot;SPRUT&amp;quot;&amp;gt;[http://www.sprut.de/], sprut.de&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | - || align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | - &lt;br /&gt;
|-&lt;br /&gt;
| Anzahl möglicher HW-Breakpoints &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4 bis 6 &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 bis 5 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;&amp;gt;[http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en556761.pdf], PIC Hardware Breakpoints (Seite 6)&amp;lt;/ref&amp;gt; || align=&amp;quot;center&amp;quot; | 1 bis 10 &amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt; || align=&amp;quot;center&amp;quot; | 6&amp;lt;ref name=&amp;quot;PIC_HWBP&amp;quot;/&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2 &lt;br /&gt;
|}&lt;br /&gt;
* X = ja&lt;br /&gt;
* O = Teilweise, Einschränkungen&lt;br /&gt;
* - = nicht empfohlen&lt;br /&gt;
Nur um nicht zu verwirren, auch wenn Teile &amp;quot;nicht empfohlen&amp;quot; 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.&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref name=&amp;quot;STM32Ueb&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/mmc/FM141/SC1169], Übersicht aller verfügbaren [[STM32]] µC von ST&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der STM32 ist in der Tat nicht der beste in der Kategorie &amp;quot;Stromsparend&amp;quot;, jedoch um eine Alternative mit Cortex-Mx Kern auf zu zeigen:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;EFM32&amp;quot; von Silabs&amp;lt;ref name=&amp;quot;EFM32&amp;quot;&amp;gt;[http://www.silabs.com/products/mcu/lowpower/Pages/efm32-energy-modes.aspx], EFM32, der Stromsparende mit Cortex-Mx Kern&amp;lt;/ref&amp;gt; benötigt nur 0,9 µA im Sleep Mode.&lt;br /&gt;
&lt;br /&gt;
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. &amp;lt;ref name=&amp;quot;PIC_codeswitch&amp;quot;&amp;gt;[http://www.elektor.nl/Uploads/Files/PIC24FIntro_5f082806.pdf], Microchip: Introduction to the 16-bit PIC24F Microcontroller Family&amp;lt;/ref&amp;gt; Hardwaretechnisch sind verschiedene Modelle gleicher Familie zudem auch meist Pin-Kompatibel &amp;lt;ref name=&amp;quot;PIC_PinCompatibility&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/00148m.pdf], Microchip: 2007 Product Selector Guide (Seite 114 ff.)&amp;lt;/ref&amp;gt; sodass ohne Design-Änderung zwischen verschiedenen Modellen gewechselt werden kann.&lt;br /&gt;
Ein Wechsel zwischen den Familien ist Architekturbedingt aufwendiger, vor allem von 8-Bit auf 16/32-Bit. &amp;lt;ref name=&amp;quot;PIC_8to16Migration&amp;quot;&amp;gt;[http://ww1.microchip.com/downloads/en/DeviceDoc/39764a.pdf], Microchip: PIC18F to PIC24F Migration: An Overview&amp;lt;/ref&amp;gt; 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 &amp;lt;ref name=&amp;quot;PIC_16to32Migration&amp;quot;&amp;gt;[http://www.embedded.com/design/mcus-processors-and-socs/4007683/Practical-migration-from-8-16-to-32-bit-PIC], Artikel: Practical migration from 8-/16- to 32-bit PIC&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;[[Arduino]]&amp;quot; ist kein eigenständiger Prozessor, sondern ein fertiges Board mit einer &amp;quot;[[Arduino]]&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unwichtige Randbedingungen =&lt;br /&gt;
&lt;br /&gt;
Oftmals werden fälschlicherweise Argumente für oder gegen eine µC-Familie ausgesprochen, die in der Praxis &#039;&#039;&#039;zum Einstieg&#039;&#039;&#039; (bei konkreten Anwendungen kann das anders aussehen) eher unwichtig sind.&lt;br /&gt;
&lt;br /&gt;
* Spannungsversorgung 3,3V / 5V (Wobei z.B Atmel XMega keine 5V Tolerante Eingänge besitzt)&lt;br /&gt;
* 8 (z.B. [[AVR]]), 16 (z.B. [[MSP430]]) oder 32 (z.B. [[STM32]]) Bit&lt;br /&gt;
* Prozessorkern Cortex-M0/M3/M4, MIPS, ARM7/9/..., AVR-RISC, PIC-RISC, 8051, ...&lt;br /&gt;
* Interrupt System mit mehr oder weniger Features&lt;br /&gt;
* Programmiersprache (Assembler, Basic, C, C++, Pascal)&lt;br /&gt;
* Programmierumgebung - ist ohnehin Geschmackssache&lt;br /&gt;
* Assembler verstehen (Sollte nur theoretisch verstanden werden, ein Programm sollte in einer Hochsprache geschrieben sein)&lt;br /&gt;
* DIL Gehäuse - steckbretttauglich ([[STM32]]-Prozessoren gibt es auch fertig gelötet auf einem steckbretttauglichen Board)&lt;br /&gt;
* Programmieradapter - solange er auch debuggen kann&lt;br /&gt;
* 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?&lt;br /&gt;
&lt;br /&gt;
= Kosten =&lt;br /&gt;
&lt;br /&gt;
Grobe Abschätzung was das alles denn kosten wird. Hier sind nur einige Beispiele gezeigt (Einzelpreise bei Bezugsquellen in Deutschland).&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Board || [[STM32]] || [[AVR]] || PIC18/24/32 || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;STM32F4DISCOVERY&amp;quot;&amp;gt;[http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419], ST STM32F4DISCOVERY Demoboard&amp;lt;/ref&amp;gt; 9..20€ (incl. Programmieradapter und Debugger) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 5..500€, z.B. [[Arduino]] || align=&amp;quot;center&amp;quot;| &amp;lt;ref name=&amp;quot;PICDEMOBOARD&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductDetails.aspx?Catalog=BuyMicrochip&amp;amp;Category=Starter%20Kits&amp;amp;mid=1&amp;amp;lmid=610], Microchip Demoboard&amp;lt;/ref&amp;gt; durchschnittlich 18€ .. 50€ (Für 16 und 32bit auch mit integriertem Debugger + Programmer)  &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;MSP430DEMOBOARD&amp;quot;&amp;gt;[http://www.ti.com/tool/msp-exp430fr5739], MSP430 Demoboard&amp;lt;/ref&amp;gt; ~35€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€&lt;br /&gt;
|-&lt;br /&gt;
| Steckbrettaugliches Board &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder &amp;lt;ref name=&amp;quot;STM32F405Board&amp;quot;&amp;gt;[http://re.reworld.eu/de/produkte/s64dil-405/index.htm], S64DIL-405 mit STM32F405&amp;lt;/ref&amp;gt;S64DIL-405 30€, STM32F103C8 4€ (China)&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC oder Microstick&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | DIP IC&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab ca. 1.50€ (Pro Mini, China)&lt;br /&gt;
|-&lt;br /&gt;
| Einzelchip (Einzelstückpreise)&lt;br /&gt;
| align=&amp;quot;center&amp;quot;| 2..15€ nur SMD (TSSOP..LQFP..BGA) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,6–5€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|0,5-15€ SMD + DIP &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|?? &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|siehe AVR&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0€ da Bootloader (ROM) UART / USB usw. unterstützt&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ab 4€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| Programmieradapter mit Debugger &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | s.o. oder z.B &amp;lt;ref name=&amp;quot;JLINKEDU&amp;quot;&amp;gt;[http://www.segger.com/j-link-edu.html], Segger J-LINK EDU&amp;lt;/ref&amp;gt; Segger J-LINK EDU 50€ (sehr schnell und unterstützt viele Prozessoren) &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;AVRDragon&amp;quot;&amp;gt;[http://www.atmel.com/tools/AVRDRAGON.aspx], Atmel AVR Dragon&amp;lt;/ref&amp;gt; AVR Dragon 40€&amp;lt;br&amp;gt;&amp;lt;ref name=&amp;quot;JTAGICE3&amp;quot;&amp;gt;[http://www.atmel.com/tools/JTAGICE3.aspx], AT JTAG ICE3&amp;lt;/ref&amp;gt; AT JTAG ICE3  99€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;ref name=&amp;quot;PICKIT3&amp;quot;&amp;gt;[http://www.microchipdirect.com/ProductSearch.aspx?keywords=PG164130], Microchip PICkit 3&amp;lt;/ref&amp;gt; PICkit 3 30€&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | z.B. Dragon 50€ &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20€ (Man muss DebugWire aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programmierumgebungen=&lt;br /&gt;
&lt;br /&gt;
Bei den Programmierumgebungen gibt es zu allen Prozessorfamilien kostenlose und Leistungsfähige Software&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
! Betriebssystem || [[STM32]] || [[AVR]] || [[PIC]] || [[MSP430]] || [[Arduino]]&lt;br /&gt;
|-&lt;br /&gt;
| Windows &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.coocox.org/CooCox_CoIDE.htm CooCox, EmBitz, Eclipse] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|Atmel-Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| Linux&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|z.B. [http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|-&lt;br /&gt;
| MacOS&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://eclipse.org/downloads/ Eclipse IDE for C/C++ Developers] &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|??&lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[http://www.microchip.com/pagehandler/en-us/family/mplabx/ MPLAB X] (IDE inklusive compiler) &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|TI Code Composer Studio &lt;br /&gt;
| align=&amp;quot;center&amp;quot;|[[Arduino]] IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* [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.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Dokumentation=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 [http://www.mikrocontroller.net/articles/STM32#Struktur_der_Dokumentation: hier] beschrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;Bei den PICs ist die Dokumentation wiederum anders strukturiert, [http://www.mikrocontroller.net/articles/PIC#Dokumenatation siehe im PIC Artikel].&lt;br /&gt;
&lt;br /&gt;
Für die [[STM32]], [[AVR]] und [[PIC]] Mikrocontroller gibt es zudem viele, auch deutschsprachige Einsteigerhilfestellungen und Tutorials.&lt;br /&gt;
&lt;br /&gt;
Parallel zur Dokumentation sollte man sich auch die Demo-Beispiele der Hersteller anschauen, dann wird vieles gleich verständlicher.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Funktionen gibt es im Artikel: [[STM32]]&lt;br /&gt;
&lt;br /&gt;
= Die Arbeit mit dem [[STM32]]=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Und mal ganz ehrlich die Diskussion, welcher µc einfacher zu konfigurieren ist, ist doch absoluter Unsinn. Der Weg ist immer der Gleiche:&lt;br /&gt;
*1. Blick ins Datenblatt, welche Register für diese Funktion benötigt werden.&lt;br /&gt;
*2. Werte ermitteln, die in die Register eingetragen werden.&lt;br /&gt;
*3. Werte ins Register schreiben. Da machte es GAR KEINEN UNTERSCHIED, ob es ein [[AVR]], 8051/2, [[ARM]],...... ist.&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, es gibt Unterschiede. Die Register haben anderen Namen, andere Adressen, andere Bitbedeutungen,...&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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])&lt;br /&gt;
&amp;lt;br&amp;gt;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&amp;amp;levelid=SS1577&amp;amp;parentid=1743&amp;amp;resourcetype=SW ST-Demo-Codebeispiele] ebenfalls auf diesen Lib&#039;s basieren und somit wird der Wechsel innerhalb des [[STM32]] deutlich vereinfacht.&lt;br /&gt;
&amp;lt;br&amp;gt;STM32F4xx Library von ST: [http://www.st.com/web/en/catalog/tools/PF257901# &amp;quot;STSW-STM32065 STM32F4 DSP and standard peripherals library&amp;quot;] incl. Dokumentation und Demo-Projekte zu allen CPU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Programmiersprachen =&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;&#039;eine&#039;&#039;&#039; Adresse 42, und nicht 2 wie z.B. beim [[AVR]] (Flash, RAM &amp;amp; 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 &amp;quot;rohe Leistung&amp;quot;, d.h. mehr Flash/RAM-Speicher und höhere Taktfrequenzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Folgerung&#039;&#039;&#039;: Die Programmierung in Hochsprachen ist &#039;&#039;&#039;bequemer als bei 8-Bittern&#039;&#039;&#039;, 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 &amp;quot;herauszuquetschen&amp;quot;, wenn man will).&lt;br /&gt;
&lt;br /&gt;
= Weitere Randbedingungen für die Entscheidung=&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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)?&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
Ein paar Forenbeiträge:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/317792#3481048 &amp;quot;Klein anfangen!&amp;quot; heisst die Devise]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/312330#3483218 Einen 8-Bitter nehme ich nur noch aus &amp;quot;Nostalgiegründen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Übersicht CPU Funktionalitäten=&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt ist kurz gezeigt welche Möglichkeiten die CPUs bei den oben empfohlenen Einsteigerboards haben&lt;br /&gt;
&lt;br /&gt;
=== STM32F407 - vom STM32F4DISCOVERY Board ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:STM32F407.png|mini|x400px]]&lt;br /&gt;
| [[Datei:stm32f4_discovery2.png|mini|x400px]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber Blockdiagramm STM32F407]&lt;br /&gt;
| [http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419 STM32F4DISCOVERY Demoboard]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;AHB1&amp;quot; &amp;gt; &amp;quot;ABH/APB1-Bridge&amp;quot; &amp;gt; &amp;quot;APB1&amp;quot;. 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 &amp;quot;Bridge&amp;quot; managt ganz alleine das Handling und generiert automatisch Wait-Befehle für die CPU.&lt;br /&gt;
&amp;lt;br&amp;gt;Die &amp;quot;AHB-Bus-Matrix&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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]].)&lt;br /&gt;
&lt;br /&gt;
=== [[AVR]] ([[Arduino]])===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[AVR]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== PIC18, PIC24, PIC32===&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[PIC]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== MSP430 - vom MSP-EXP430FR5739 Experimentier-Board===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:MSP430FR5739.gif|mini|450px]]&lt;br /&gt;
| [[Datei:MSP-EXP430FR5739.jpg|mini|x350px]]&lt;br /&gt;
|-&lt;br /&gt;
| Blockdiagramm MSP430FR5739&lt;br /&gt;
| MSP-EXP430FR5739 Demoboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details können im Artikel [[MSP430]] gelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== LPC1x d.h. Cortex -M0 &amp;amp; -M3 Familie von NXP ===&lt;br /&gt;
Details können aus dem Leitartikel [[LPC1xxx]] und den darin verlinkten Artikeln entnommen werden.&lt;br /&gt;
&lt;br /&gt;
= Tipps und Tricks bei der Programmierung=&lt;br /&gt;
&lt;br /&gt;
===Interruptcontroller vom Cortex-M3/M4===&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Nested Vectored Interrupt Controller&amp;quot; (NVIC) ist eine Funktion der ARMv7M Architektur und ist über die CMSIS verwendbar.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; und &amp;quot;subpriority&amp;quot; unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 Bit zu 2 Bit Unterteilung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 Bits für pre-emption priority&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann &amp;quot;pre-emption priority&amp;quot; den Wert 0..3 und &amp;quot;subpriority&amp;quot; auch 0..3 erhalten. Um so kleiner die Zahl ist um so höherwertig ist der Interrupt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;br&amp;gt;ISR1 Pre 2 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR2 Pre 1 / Sub 1&lt;br /&gt;
&amp;lt;br&amp;gt;ISR3 Pre 1 / Sub 2&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pre-emption priority&amp;quot; Wertigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, ISR1 ebenfalls nicht.&lt;br /&gt;
&lt;br /&gt;
Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR2 bearbeitet, anschließend ISR3 da beide die gleiche &amp;quot;pre-emption priority&amp;quot; haben fällt die Entscheidung anhand der &amp;quot;subpriority&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel Interrupt Konfiguration für USART1 mittels CMSIS-Funktionen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NVIC_InitTypeDef NVIC_InitSt;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannel = USART1_IRQn;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 3; // &amp;lt;&amp;lt; Tiefe Prio&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelSubPriority = 1;&lt;br /&gt;
NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;
NVIC_Init(&amp;amp;NVIC_InitSt);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taktzeitberechnung und Überwachung===&lt;br /&gt;
&lt;br /&gt;
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?&lt;br /&gt;
&amp;lt;br&amp;gt;Der ARMv7M -Kern hat dafür extra einen Takt-Zähler in der DWT-Einheit implementiert, den man mittels der CMSIS nutzen kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; // Für die Standard-Typen uint32_t etc.&lt;br /&gt;
#include &amp;lt;stm32f4xx.h&amp;gt; // Hier die Header-Datei der CMSIS für die jeweilige Familie verwenden.&lt;br /&gt;
&lt;br /&gt;
// DWT-Einheit aktivieren&lt;br /&gt;
inline void DWT_Enable() {&lt;br /&gt;
  CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;&lt;br /&gt;
}&lt;br /&gt;
// Takt-Zähler - Messen der Anzahl der Befehle des Prozessors:&lt;br /&gt;
inline void DWT_CycCounterEn () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000001;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterDis () {&lt;br /&gt;
  DWT-&amp;gt;CTRL = 0x40000000;&lt;br /&gt;
}&lt;br /&gt;
inline uint32_t DWT_CycCounterRead () {&lt;br /&gt;
  return DWT-&amp;gt;CYCCNT;&lt;br /&gt;
}&lt;br /&gt;
inline void DWT_CycCounterClear () {&lt;br /&gt;
  DWT-&amp;gt;CYCCNT = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  // ... Programmcode ...&lt;br /&gt;
&lt;br /&gt;
  // Systick-Zähler benutzen&lt;br /&gt;
  DWT_Enable(); // DWT-Einheit aktivieren&lt;br /&gt;
  DWT_CycCounterEn (); // Zähler aktivieren&lt;br /&gt;
  DWT_CycCounterClear (); // Zähler löschen&lt;br /&gt;
  // ... Programmbearbeitung ...&lt;br /&gt;
  uint32_t iZ = DWT_CycCounterRead (); // Zähler auslesen&lt;br /&gt;
  &lt;br /&gt;
  // ... weiterer Programmcode ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In iZ steht nun wie viele Maschinentakte der Prozessor für die Bearbeitung benötigt hat und kann mit folgender Formel umgerechnet werden:&lt;br /&gt;
&lt;br /&gt;
Zeit in µSec = iZ / CPU-Takt in MHz&lt;br /&gt;
&lt;br /&gt;
= FAQ - Anfängerfragen=&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Mit diesem kann ich dann den µC auch programmieren? - Ja, programmieren und debuggen.&lt;br /&gt;
* 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 &amp;quot;Der 10-polige JTAG Stecker von mmvisual&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities, Tutorials =&lt;br /&gt;
* [[STM32]] Hauptartikel, [http://www.mikrocontroller.net/articles/STM32#Weblinks.2C_Foren.2C_Communities.2C_Tutorials dortige Linksammlung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319328 Diskussion zum Artikel]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [[STM32 Eclipse Installation]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [[LPC1xxx für Umsteiger]]&lt;br /&gt;
* [[http://stefanfrings.de/stm32/index.html Notizen zu ARM Cortex M3 Mikrocontrollern der STM32F1 Serie]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=96519</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=96519"/>
		<updated>2017-06-01T19:18:42Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Weblink hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1575 STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32t-series.html STM32T]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32w-series.html STM32W]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF164486 STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00191185.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403c/index.html ARMv7M Architecture Reference Manual] beschreibt detailliert den Prozessorkern, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/web/en/resource/technical/document/application_note/CD00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
Der GCC (in seinen verschiedenen Binärdistributionen) ist der einzige ARM Compiler der [http://de.wikipedia.org/wiki/C%2B%2B11 C++11] unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [http://gnuarmeclipse.livius.net/blog/ GNU ARM Plug-in] (Bei Verwendung vom GCC-ARM-Embedded als Toolchain &amp;quot;Sourcery G++ Lite&amp;quot; auswählen, dieser sieht für eclipse gleich aus) (Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Turtelizer2 oder andere JTAG Programmieradapter&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist der ultimative Compiler für denjenigen, der nur mal schnüffeln will. Doppelklick auf das gewünschte Board, Beispielprogramm (rechts am Rand auswählen), kompilieren und über USB hochladen. Schon blinkt es! Wenn man ein Projekt dann lieber doch lokal bearbeiten möchte (z.B. um einen Debugger zu benutzen) dann kann man die Projekte über die Export-Funktion herunterladen. Es werden verschiedene IDE sowie ein gcc-Kommandozeilenprojekt unterstützt. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC-Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse-basierten IDEs gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic TrueStudio], auf Eclipse/GCC basierend. Aktuell ist V 5.4, diese hat kein Codesize Limit. Eingeschränkt sind Debug Optionen wie Variablen LiveWatch oder Tracing, was aber auch &#039;bessere&#039; Debugprobes erforderlich macht. Das Semihosting (printf über SWD/JTAG) fällt leider auch unter die Restriktionen der Lite Version. Atollic TrueStudio unterstützt viele verschiedene Hersteller von ARM MCUs, dadurch ist das Paket sehr umfangreich. In der Lite Version muss man sich beim Start für ein paar Sekunden einen Dialog mit dem Upgrade Angebot gefallen lassen.&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.code-red-tech.com Code Red] (GCC basierend)&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeFx Libraries, nicht mit den alten Standard Peripheral Libraries.&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
Die Software kann [http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF259242 bei ST heruntergeladen] werden. Sie wird im Windows Executable Format angeboten und erweckt daher den Eindruck, ausschließlich für Windows geeignet zu sein, ist aber tatsächlich Java-basiert und daher seit Version 4.13 vollständig betriebssystem-unabhängig.&lt;br /&gt;
==== STM32CubeMX unter Linux ====&lt;br /&gt;
Ab der Version 4.13 liegt jetzt ein Linux-Installer mit bei.&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann STM32CubeMX installiert werden, indem man das heruntergeladene .zip-Archiv entpackt, und den enthaltenen Installer per Java über ein Terminal startet:&lt;br /&gt;
&amp;lt;pre&amp;gt;java -jar SetupSTM32CubeMX-4.5.0.exe&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Anlegen der Desktop/Startmenü-Shortcuts funktioniert unter Linux nicht richtig und kann daher deaktiviert werden. Um STM32CubeMX nach der Installation zu starten, wechselt man im Terminal in den Installationsort und gibt ein:&lt;br /&gt;
&amp;lt;pre&amp;gt;java -jar STM32CubeMX.exe&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit das funktioniert, muss die Oracle Java Runtime Environment 1.8 installiert sein (Siehe z.B. [http://wiki.ubuntuusers.de/Java/Installation/Oracle_Java/Java_8#Java-8-JRE hier] für Ubuntu). Nicht benötigt wird wine.&lt;br /&gt;
&lt;br /&gt;
Update:&lt;br /&gt;
In der Datei stm32cubemx.zip  md5sum: 86217b9f14b99b1133bda6e87dbd1270&lt;br /&gt;
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF259242?icmp=pf259242_pron_pr_jun2014&amp;amp;sc=stm32cube-pr6#&lt;br /&gt;
befindet sich u.a. SetupSTM32CubeMX-4.13.0.linux (ist ein ELF 64-bit). Mit Ausführen wird cubemx standalone (nicht in Eclipse) im Pfad der Wahl installiert. Es reicht Java 1.7.xx, hier java -version: java version &amp;quot;1.7.0_95&amp;quot;&lt;br /&gt;
OpenJDK Runtime Environment (IcedTea 2.6.4) (suse-24.30.3-x86_64). Das Anlegen von Desktop/StartMenü Icons, Stichworte freedesktop.org, &amp;quot;Desktop Entry&amp;quot;, funktioniert. Man muss aber beachten, dass ein Symlink zum Starten nicht funktioniert. Stattdessen ist eine ausführbare Datei im Pfad anzulegen, z.B. /usr/local/bin/cubemx mit z.B dem Inhalt /array_data01/STM32CubeMX/STM32CubeMX&lt;br /&gt;
&lt;br /&gt;
==== STM32CubeMX unter Mac OS ====&lt;br /&gt;
Mit der Version 4.14 wird ein Setup-Programm für Mac OS angeboten, das sich in der stm32cubemx.zip Datei befindet (siehe auch Update zur Linux-Unterstützung).&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), Keil, ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link.html ST-LINK],  [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2]&lt;br /&gt;
* Jedes STM32 NUCLEO und DISCOVERY board hat einen ST-LINK für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware benutzt werden kann (ca. 12,- bis 19,-€, je nach Typ). Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Er unterstützt aber nur MCUs von ST. NXP, Atmel oder TI lassen sich damit nicht programmieren. Diese ST-LINK-Variante beherrscht nur SWD, kein JTAG und hat keine Treiber, die den Programmierprozessor vom Zielsystem galvanisch entkoppeln. Der ST-Link in der Adapterversion mit Gehäuse hat diese Nachteile nicht und kostet auch nur um 20€.  Unter Linux kann der Virtuellen COM-Port des ST-LINK/V2 mit Hilfe des cdc-acm Treibers aus dem Kernel angesprochen werden ([https://embeddedmicro.com/forum/viewtopic.php?t=82 siehe hier]). &#039;&#039;&#039;UPDATE:&#039;&#039;&#039; Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können jetzt auch auf J-Link OB geflasht werden. Details und Hinweise dazu [https://www.segger.com/jlink-st-link.html hier].&lt;br /&gt;
* [http://www.raisonance.com/~rlink-debugger-programmer__microcontrollers__tool~tool__T018:4cn9ziz4bnx6.html Raisonance RLink]&lt;br /&gt;
* [http://www.amontec.com Amontec] (2016-05: Website OFFLINE)&lt;br /&gt;
* [http://www.hjtag.com H-JTAG] nur noch STD- und PRO-Edition (Cortex-M0, Cortex-M3, kein M4), Personal-Edition (LPT-Port) war für ca. 60€ zu haben, läuft mit ADS, SDT, IAR, Vision und RVDS (möglicher Selbstbau der Personal-Edition siehe [http://nazya.com/freeshipping/single/4929017/orig_desc.html hier])&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
ST-Link Adapter können jetzt auch unter Linux mit neuer Firmware geflasht werden: [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Download]. &lt;br /&gt;
&lt;br /&gt;
Andere [[JTAG]] Adapter wie z.B. der ULink2 von Keil funktionieren nur mit dem Keil Compiler. Leider kann dieser auch kein fremdes Binary oder Hex-File in den Controller schreiben.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/colinkEx.htm unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.oocdlink.com/ OOCDLink]  [_Link ist derzeit nicht verfügbar_]&lt;br /&gt;
* [https://github.com/texane/stlink Stlink]&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
* [http://capitanio.org/mlink/ Linux Demo Code für die Discovery&#039;s ST-Link Programmierung]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 1000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (der Link funktioniert nicht mehr, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versand Europaweit im endasmedia.ch Shop&lt;br /&gt;
* STM32F105 Controller für 2.50€ [http://shop.endasmedia.ch/index.php?id_product=8&amp;amp;controller=product&amp;amp;id_lang=1 shop.endasmedia.ch]&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [http://www.hbe-shop.de HBE (Farnell Programm für Private)] &lt;br /&gt;
* [http://www.sander-electronic.de/be00069.html Sander]&lt;br /&gt;
* [http://www.tme.eu/de/katalog/index.phtml#cleanParameters%3D1%26search%3DSTM32F10%26bf_szukaj%3D+ TME] &lt;br /&gt;
* [http://teske-electronics.de/index.php?cPath=3_9_53 Teske electronics]&lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Mouser, Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* Siehe [[:Kategorie:ARM-Boards]]&lt;br /&gt;
* [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=gruppe&amp;amp;id=14 Im Shop von Embedded Projects]&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/ARM/ARM-Cortex-M3 Cortex M3 bei Watterott]&lt;br /&gt;
* [http://www.raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer und Primer2 von Raisonance]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.propox.com/products/t_174.html Propox, Header-Boards für 103R und 103V sowie Trägerplatine dafür]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://olimex.com/dev/index.html STM32 bei Olimex]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [http://www.de.rs-online.com/web/p/products/7458434/ STM32Discovery bei RS-Components] 12,65 € +MwSt.&lt;br /&gt;
* [http://www.segor.de/#Q=STM32 VL DISCOVERY] STM32 Discovery bei Segor&lt;br /&gt;
* [http://www.watterott.com/de/STM32F4Discovery STM32F4DISCOVERY] STM32F4 Cortex M4 Controller mit JTAG-Debugger auf der Platine bei Watterott für 16,66EUR.&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/443910/ STM32F4 Discovery Kit bei Conrad] 17,11 €&lt;br /&gt;
* [http://www.ST.com/stm32l152c-discovery STM32 L1 Discovery] mit kleiner LCD-Anzeige; [http://www.ST.com/web/en/catalog/tools/PF250990 Weitere Informationen dazu]&lt;br /&gt;
* [http://www.mcu-raisonance.com/~open4-development-platform__microcontrollers__tool~tool__T018:g65gu6ghg2n.html/ Open 4 oder auch genannt Evo-Primer]&lt;br /&gt;
* [http://www.wayengineer.com/index.php?main_page=index&amp;amp;cPath=50_66&amp;amp;page=1&amp;amp;sort=3a WayEngineer]&lt;br /&gt;
* [http://thinkembedded.ch/ST-STMicroelectronics:::24.html Im Thinkembedded Shop] in der Schweiz / DiscoveryF4, div. ETT und Olimex Boarde ab 20,18 CHF / 16,15 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://shop.myavr.de/ARM-Produktlinie/STM32F4-Discovery.htm?sp=article.sp.php&amp;amp;artID=200072 Im myAVR Shop] DiscoveryF4 mit möglichem Zubehör 16,45 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://www.keil.com/boards/cortexm.asp Keil/ARM Demoboards]&lt;br /&gt;
* [http://www.phytec.de Phytec]&lt;br /&gt;
* [http://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=37 verschiedene ARM Produkte und Erweiterungen bei myAVR]&lt;br /&gt;
* [http://re.reworld.eu/de/produkte/s64dil-405/index.htm S64DIL-405 STM32Fxxx ARM Cortex M3 Mikrocontrollermodul mit USB-Schnittstelle, Steckbretttauglich] (Leerplatine eignet sich auch für STM32F1xx Prozessoren.)&lt;br /&gt;
* [http://www.amazon.de/STM32F4-DISCOVERY-STM32F429-Cortex-M4-Development/dp/B00HGG0KHY STM32F429 DISCOVERY Cortex M4 mit 2,4&amp;quot; Touch-TFT, 3-Achs Sensor, 64 MBit SDRAM ab ~25 EUR bei Amazon, Ebay u.a.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/173753 Diskussion zum Artikel]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/AllItems.aspx Forum auf der ST Homepage] &lt;br /&gt;
* [http://www.stm32circle.com/hom/index.php STM32 Community] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://www.ebv.com/fileadmin/products/Press_Print/Brochures/Product_Brochures/EBV_Cortex%20Collection_V2.pdf Übersicht der Cortex Prozessoren und deren Hersteller (nicht nur ST, von EBV)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/258652 Tutorial]&lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net STM32F4 Quellcode-Librarys und CooCox-Projekte in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/wiki/Main_Page libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html STM32F1 Notizen von Stefan Frings]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95993</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95993"/>
		<updated>2017-04-22T17:45:27Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Power-/Sleep-Modes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:ESP8266.jpg|thumb|300px|ESP8266, Funkmodul]]&lt;br /&gt;
Das [[ESP8266]] von dem Hersteller Espressif ist ein programmierbarer WLAN-SoC mit [[UART]]- und [[SPI]]-Schnittstelle. &#039;&#039;&#039;WLAN&#039;&#039;&#039;-Funkmodule mit ESP8266 sind ab 3€ verfügbar. Die UART-Schnitttstelle ermöglicht eine einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
Laut Hersteller &amp;lt;ref&amp;gt;[http://espressif.com/en/products/esp8266 &#039;&#039;Herstellerseite -  unter Details&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;. :&lt;br /&gt;
* 802.11 b/g/n&lt;br /&gt;
* Wi-Fi Direct (P2P), soft-AP&lt;br /&gt;
* Integrated TCP/IP protocol stack&lt;br /&gt;
* Integrated TR switch, balun, LNA, power amplifier and matching network&lt;br /&gt;
* Integrated PLLs, regulators, DCXO and power management units&lt;br /&gt;
* +19.5dBm output power in 802.11b mode&lt;br /&gt;
* Power down leakage current of &amp;lt;20µA (bei 2,5V, Flash-Chip nicht mit gerechnet)&lt;br /&gt;
* Integrated low power 32-bit CPU could be used as application processor&lt;br /&gt;
* SDIO 1.1/2.0, SPI, UART&lt;br /&gt;
* STBC, 1×1 MIMO, 2×1 MIMO&lt;br /&gt;
* A-MPDU &amp;amp; A-MSDU aggregation &amp;amp; 0.4ms guard interval&lt;br /&gt;
* Wake up and transmit packets in &amp;lt; 2ms&lt;br /&gt;
* Standby power consumption of &amp;lt; 1.0mW (DTIM3)&lt;br /&gt;
* VCC: 2,5...3,6V (Achtung: Eingänge sind &#039;&#039;&#039;NICHT 5V TOLERANT&#039;&#039;&#039;!)&lt;br /&gt;
Weiterhin:&lt;br /&gt;
* GPIOs, ADC&lt;br /&gt;
&lt;br /&gt;
=== Datendurchsatz/Performanz ===&lt;br /&gt;
[https://www.mikrocontroller.net/topic/342240?page=single#3857630 Beitrag im Forum mit Tests: TCP: bis zu 7 MBit/s]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=7&amp;amp;t=24 Beitrag Espressif-Forum: UART loopback: 4.5 Mbps]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?t=2187 Beitrag Espressif-Forum: 300kbps senden und empfangen im TCP passhrough Modus]&amp;lt;br/&amp;gt;&lt;br /&gt;
200-300k Byte/s Senden und Empfangen via TCP und UDP mit C Programm und SDK 1.5.4 (Bei stefanus zuhause)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Bei Verwendung der AT-Firmware (v1.1.0.0 aus SDK 1.5.4) mit einem seriell angeschlossenen Mikrocontroller dauert die Antwort auf ein kurzes Kommando (vom PC an den µC und zurück) typischerweise 100-200ms.&lt;br /&gt;
&lt;br /&gt;
=== Power-/Sleep-Modes ===&lt;br /&gt;
Der Stromverbrauch des ESP8266 ist abhängig von vielen Faktoren, er lässt sich aber durch geschickte Programmierung durchaus deutlich senken.&amp;lt;br/&amp;gt;&lt;br /&gt;
So ist es nicht notwendig, dass das WIFI-Modem oder der Mikrocontroller ständig läuft, um z.B. eine WLAN-Türklingel zu realisieren. Im &amp;quot;Deep-Sleep&amp;quot; würde der ESP8266 dann nur wenige µA verbrauchen, bis er über einen Timer zurückgesetzt wird und die Meldung absetzt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Stefanus hat 25µA gemessen: [https://www.mikrocontroller.net/topic/425023?goto=4985619#4985619]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=6&amp;amp;t=133 Detailierte Übersicht der verschieden Modi und deren Stromverbrauch von Espressif] (nicht mehr aktuell!)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WLAN-Module mit ESP8266 ==&lt;br /&gt;
Es existieren ca. 11 Varianten von chinesischen Herstellern. Beispielsweise mit PCB- oder Keramik-Antenne oder mit u.fl.&lt;br /&gt;
&lt;br /&gt;
* Die Firmware aus SDK 0.9.1 unterstützt bis zu vier gleichzeitige TCP- oder UDP-Verbindungen. &lt;br /&gt;
* Die Firmware aus SDK 1.5.4 unterstützt bis zu fünf gleichzeitige TCP- oder UDP-Verbindungen.&lt;br /&gt;
&lt;br /&gt;
Sie kann sich in vorhandene WLAN-Netze einbuchen, aber auch selbst Access-Point mit DHCP-Server sein. Der Access-Point ist zu Android kompatibel (mit 4.1.2 getestet).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Firmware enthält jedoch keinen Router. Mehrere Computer, die mit dem Modul als Access-Point verbunden sind, können keine Verbindung zueinander aufbauen. Das Feature nennt sich AP-Isolation.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#Produktbeschreibung: [[http://playground.boxtec.ch/doku.php/wireless/esp8266]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung einiger ESP8266-Module ===&lt;br /&gt;
====ESP8266-01====&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:ESP8266-PinBelegung1.jpg|Pinbelegung - Groß mit PCB-Antenne&lt;br /&gt;
Datei:ESP8266-PinBelegung2.jpg|Pinbelegung - Klein mit Keramik-Antenne&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Quelle &amp;lt;ref&amp;gt;[http://pan.baidu.com/share/link?shareid=727869034&amp;amp;uk=1900861665 &#039;&#039;Seller Information&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
====ESP8266-07====&lt;br /&gt;
Achtung, beim ESP8266-07-Modul sind einige mit vertauschten Beschriftungen von GPIO4 und GPIO5 unterwegs!!.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ESP8266-12E====&lt;br /&gt;
Das ESP12E-Modul gehört vermutlich wegen der vielen Ports zu den beliebtesten Modulen.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/?projekt-download=2967 Pinbelegung (PDF)]&lt;br /&gt;
Für dieses Modul gibt es auch ein spezielles Adapter-Projekt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Adapter-ESP12E.jpeg|miniatur|zentriert]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ Projekt: ESP-12E Adapter und ESP12E Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Möglichkeiten der Nutzung und Programmierung ==&lt;br /&gt;
===== Benutzung einer Firmware =====&lt;br /&gt;
Verschiedene Projekte betreiben die Entwicklung einer Firmware. Man kann die Firmware &amp;quot;einfach nur&amp;quot; flashen und benutzen oder sich auch aktiv an der Entwicklung beteiligen. Es gibt unter anderem folgende Projekte:&lt;br /&gt;
* AT-Befehle: Firmware, mit welcher das Modul über UART angesprochen wird.&lt;br /&gt;
* Micropython: Firmware, die das Ablaufen von Python-Scripts ermöglicht ([https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html Tutorial])&lt;br /&gt;
* NodeMCU: Firmware, die das Ablaufen von Lua-Scripts ermöglicht ([https://github.com/nodemcu/nodemcu-firmware Github])&lt;br /&gt;
* smartJS: Firmware, die das Ausführen von Javascript erlaubt ([https://github.com/cesanta/smart.js Github])&lt;br /&gt;
* Arduino core for ESP8266 WiFi chip: Programmierumgebung &amp;amp; Firmware, die das Ausführen von C-Programmen ermöglicht, im Stil der bekannten Arduino-Plattform. [https://github.com/esp8266/Arduino Github - ink. Anleitung]&lt;br /&gt;
* ESP8266 Basic: Firmware, die das Ausführen von Basic-Programmen und das Editieren über WLAN erlaubt [http://www.esp8266basic.com/]&lt;br /&gt;
* Sming: Einfach zu nutzendes Framework, ähnlich wie Arduino, allerdings mit einem einfachen Makefile pro Projekt und mit Eclipse-Projekten.([https://github.com/SmingHub/Sming Github])&lt;br /&gt;
* ESP-Lisp (BETA): A small fast lisp interpeter for a ESP8266 ([https://github.com/yesco/esp-lisp Github])&lt;br /&gt;
* ESP8266Forth:  Forth for the ESP8266 NodeMCU Amica ([https://github.com/CraigLindley/ESP8266Forth Github])&lt;br /&gt;
* Forthright: Forth for ESP-8266 ([https://github.com/niclash/forthright Github])&lt;br /&gt;
* Punyforth:  FORTH inspired programming language for the ESP8266 ([https://github.com/zeroflag/punyforth Github])&lt;br /&gt;
* ESP-LINK: Wifi-Serial Bridge w/REST&amp;amp;MQTT([https://github.com/jeelabs/esp-link Github])&lt;br /&gt;
&lt;br /&gt;
===== Erstellen (Kompilieren) einer Firmware =====&lt;br /&gt;
Für die Erstellung einer individuellen Firmware gibt es zwei Möglichkeiten:&lt;br /&gt;
* Software Development Kit (SDK): Erstellen einer Firmware mit einer GCC-Toolchain&lt;br /&gt;
* Arduino IDE: Erstellen einer Firmware mit einer Arduino-IDE&lt;br /&gt;
Projekte, die eine Firmware für das ESP8266 entwickeln (siehe vorheriger Abschnitt), benutzen eine dieser beiden Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== Firmware flashen/updaten ===&lt;br /&gt;
Typischerweise wird eine kompilierte Firmware per UART-Bootloader des ESP8266-SoC auf einen Flash-Chip eines ESP8266-Moduls geladen. Von dort startet der ESP8266-SoC anschließend die Firmware.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433 Flash-Download-Tool vom Hersteller] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/themadinventor/esptool Python-Tool zum Flashen (von Fredrik Ahlberg)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/3s1d/esp_prog Extension zum Tool von Fredrik Ahlberg] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=2#3857075 Tool zum Flashen (von Christian Klippel)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://web.archive.org/web/20150502082616/http://defcon-cc.dyndns.org/wiki/ESP8266#Update Anleitung, extern] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=3#3810559 Anleitung, Forum]&lt;br /&gt;
&lt;br /&gt;
Der Hersteller veröffentlicht regelmäßig [http://bbs.espressif.com/viewforum.php?f=5 Firmwareupdates] als Bestandteil des esp_iot_sdk. Die Firmware-Dateien befinden sich im Verzeichnis bin. Das Update wird beispielsweise für Firmware 0.9.5 folgendermaßen durchgeführt: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python esptool.py --baud 9600 --port com6 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Flashgröße muss man die Firmware ab Version 1.0.1 selbst compilieren. Siehe Diskussion [http://www.esp8266.com/viewtopic.php?p=16515 hier] und [http://bbs.espressif.com/viewtopic.php?f=16&amp;amp;t=400 hier].&lt;br /&gt;
&lt;br /&gt;
=== Nutzung ohne Firmware ===&lt;br /&gt;
Es ist wohl sogar möglich den ESP8266 als SDIO-WLAN-Modul an einem Raspberry Pi zu betreiben. Verwendet wird dabei der Linuxtreiber des ESP8089. Der ESP8266 bootet dann nicht die Firmware aus dem Flash sondern über SDIO.    &lt;br /&gt;
&lt;br /&gt;
https://hackaday.io/project/8678-rpi-wifi&lt;br /&gt;
&lt;br /&gt;
== AT-Befehle für eine Firmware auf Basis des SDK-Beispiels &amp;quot;AT&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als AP&lt;br /&gt;
&lt;br /&gt;
Da wir nicht wissen, in welchem Modus sich das Modul gerade befindet, fragen wir diesen mit dem &lt;br /&gt;
Befehl AT+CWMODE? ab. Das Modul antwortet mit &lt;br /&gt;
&lt;br /&gt;
    AT+CWMODE?&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;+CWMODE:1&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
In diesem Fall ist das Modul aktuell im Modus 1 (Station) eingestellt. Also ändern wir den Modus auf 2 (AP)&lt;br /&gt;
mit dem Befehl AT+CWMODE=2. Nach diesem Befehl ist ein Reset des Moduls erforderlich, damit die Änderung &lt;br /&gt;
sichtbar wird. Mit dem Befehl AT+RST führen wir diesen durch. Das Modul startet neu und die Stromaufnahme&lt;br /&gt;
steigt auf ca 80 mA. Das Modul ist jetzt als WLAN-AP im Wireless-LAN sichtbar. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir noch einstellen, dass wir mehrere Verbindungen gleichzeitig haben wollen, sowie den TCP-Server starten und einstellen. Mit dem Befehl AT+CIPMUX=1 sagen wir dem Modul, dass wir mehrere Verbindungen haben wollen. Und mit dem Befehl AT+CIPSERVER=1,2526 starten wir den TCP-Server und lassen ihn auf Port 2526 laufen. Sobald sich ein Client verbindet, sendet das Modul &#039;Link&#039; + LF + CR. Beim Trennen einer Verbindung vom Client kommt &#039;Unlink&#039; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir uns über einen TCP-Socket auf Port 2526 mit dem Modul verbinden und Daten austauschen. Empfangene Daten werden folgendermaßen angezeigt. Gesendet wurde  &amp;quot;Hallo Leute&amp;quot; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     +IPD,0,11:Hallo Leute&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+IPD kommt immer, 0 ist die erste Verbindung. Wenn 2 Geräte gleichzeitig eine Verbindung aufgebaut haben, steht dort eine 1. 11 Zeichen wurden empfangen, dann kommen die Daten.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten vom Modul zum Client geht man folgenderweise vor. Erstmal sagen wir dem Modul, wieviele Daten wir an welche Verbindung schicken wollen. Mit dem Befehl AT+CIPSEND=0,5 z. B. sagen wir dem Modul wir möchten 5 Bytes an Verbindung 0 senden. Nach diesem Befehl werden die nächsten 5 Zeichen direkt an die Verbindung weitergereicht.&lt;br /&gt;
Sollte keine aktive Verbindung bestehen, sendet das Modul &lt;br /&gt;
     AT+CIPSEND=0,5&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;link is not&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
ansonsten kommt &lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt; &amp;gt;&lt;br /&gt;
und man kann Daten senden. Nach dem Absenden der Daten &#039;Leute&#039; + LF + CR sendet das Modul &lt;br /&gt;
    Leute&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    SEND OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als Station&lt;br /&gt;
&lt;br /&gt;
== Software Development Kit (SDK) ==&lt;br /&gt;
Mit dem SDK können eigene Applikationen programmiert und die im SDK vorhandenen Beispiele &amp;quot;AT&amp;quot; und &amp;quot;IoT&amp;quot; verändert werden. Das SDK wird vom Hersteller zur Verfügung gestellt (Stand 25.10.2014). Passend zum SDK existiert eine virtuelle Maschine mit eingerichtetem gcc zum Kompilieren. Insbesondere der nun verfügbare gcc basiert auf einer Community-Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine + Anleitung/HOWTO für das Setup sowie für das Kompilieren]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Mit dem SDK wird der Mikrocontroller programmiert, der sich direkt auf dem ESP8266-SoC-Chip befindet. Dies ist nicht zu verwechseln mit Programmieranleitungen zur UART-Ansteuerung des ESP8266-SoC (meist mit AT-Firmware) mit einem anderen Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
==Checkliste bei Problemen mit dem Modul/Compiler/SDK==&lt;br /&gt;
Bitte berücksichtige bei der Frage nach Hilfestellung zu Deinem Problem die folgende Checkliste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit der AT-Firmware/UART-Ansteuerung mit Mikrocontroller&#039;&#039;&#039;&lt;br /&gt;
# Was nutzt Du für die Stromversorgung?&amp;lt;br/&amp;gt;(Ganz knapp benennen, so dass Rückschlüsse auf Spannung und Stromstärke möglich sind)&lt;br /&gt;
# Welche Firmware-Version verwendest Du und von woher hast Du sie?&lt;br /&gt;
# Welchen Mikrocontroller verwendest Du?&lt;br /&gt;
# Welche Baudrate verwendest Du?&lt;br /&gt;
# &amp;quot;Sieht&amp;quot; das Modul den AP, &amp;quot;sieht&amp;quot; der PC das Modul?&lt;br /&gt;
# Funktioniert ein Connect?&lt;br /&gt;
# Welche AT-Befehlssequenz verwendest Du und was antwortet das Modul?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit dem SDK/Compiler&#039;&#039;&#039;&lt;br /&gt;
# Benutzt Du die neuste, offizielle VM?&amp;lt;br/&amp;gt;(Diese ist ausgelegt für das neueste SDK)&lt;br /&gt;
# Benutzt Du das neueste, offizielle SDK? Welche Version benutzt Du?&amp;lt;br/&amp;gt;(Es werden regelmäßig Bugfixes und Erweiterungen eingepflegt)&lt;br /&gt;
# Kannst Du die SDK-Beispiele (IoT,AT) entsprechend der offiziellen Anleitung kompilieren, flashen und läuft es?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://en.wikipedia.org/wiki/ESP8266 ESP8266-Eintrag auf en.wikipedia.org]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.esp8266.com/ ESP8266-Community-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://github.com/esp8266 ESP8266 Github mit Wiki und Source-Code-Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://hackaday.com/tag/esp8266/ Hackaday-Posts zu ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://espressif.com/en/products/esp8266/ ESP8266-Seite des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/ ESP8266-Forum des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller-elektronik.de/nodemcu-esp8266-tutorial-wlan-board-arduino-ide/ ESP8266 und NodeMCU - Tutorial mit Farbdisplay und Temperatursensor]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/348772 Topic neu im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240 Topic alt im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342878 Sammelbestellungen im mikrocontroller.net-Forum]&lt;br /&gt;
&lt;br /&gt;
[http://esp8266-server.de/ Universelle I2C-Steuerung mittels WLAN-TCP/IP und Webinterface mit ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://blog.thomasheldt.de/ Viele Projekte und Informationen zum ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/wlan_io/ Projekt I/O-Schnittstellenmodul mit WLAN] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/esp8266/ Dokumentation zum ESP8266 mit Arduino Code-Beispielen] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dokumente === &lt;br /&gt;
[http://neilkolban.com/tech/esp8266/ Kolban’s book on the ESP8266] Sehr empfehlenswert!&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Anleitung/HOWTO für das Setup der virtuellen Maschine (SDK) sowie für das Kompilieren]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://nurdspace.nl/ESP8266 Übersetztes Datenblatt]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/w/Wi07c AT Instructions Set (English)] und [http://www.electrodragon.com/w/Wi07c#First_time_use_guide Anleitung zum Betrieb an einem Arduino (inkl. Code)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://thomaspfeifer.net/esp8266_wlan_seriell_modul_at_kommandos.htm Beschreibung der AT-Kommandos mit Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/229016/Espressif_IoT_AT____v0.1.5.906.pdf Espressif AT Instruction Set(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/document/pdf/ESP8266%20Specifications(Chinese).pdf ESP8266 Specifications(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://nodemcu.readthedocs.org/en/dev/ NodeMCU-Documentation]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://cknodemcu.wordpress.com/2015/11/24/building-an-iot-node-for-less-than-15/ Building an IoT Node for less than 15$] (Paper, Kindle via Amazon)&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linux-Maschine mit eingerichtetem gcc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://onedrive.live.com/#cid=C4DDF72E6EEA3826&amp;amp;id=C4DDF72E6EEA3826%21631 Dateien (Xplorer+SDK+PDF+etc.)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/230185/esp8266_config_v050.exe Config-Tool] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen ===&lt;br /&gt;
[http://espressif.com/en/company/contact/buy-a-sample/ Offizieller Espressif-Vertriebskanal] (Sample Purchase)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?SearchText=ESP8266 aliexpress.com] ~ 2€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.banggood.com/?zf=283997 banggood.com] ~ 3.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ebay.de/ Ebay]&lt;br /&gt;
ab 3€ inkl. Versand, Einzelstückpreis: ESP-01/02/03/04/05&amp;lt;br/&amp;gt;&lt;br /&gt;
(Suchbegriff: ESP8266, Option Artikelstandort: &amp;quot;Weltweit&amp;quot;)&amp;lt;br/&amp;gt;&lt;br /&gt;
(10 Stück ab 27 EUR inkl. Versand; Suchbegriff: 10pcs ESP8266)&amp;lt;br/&amp;gt;&lt;br /&gt;
ab 3.20€ inkl. Versand, Einzelstückpreis: ESP-07/08/09/11&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/?s=esp8266&amp;amp;post_type=product electrodragon.com] ~ 3.50€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.it-wns.de/themes/suche/index.php?suchekategorie=&amp;amp;sucheallgemein=esp8266 IT-WNS.de] (ESP-01/02/03/06/07/12E) je 3.99€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/depot/WiFi-Serial-Transceiver-Module-w-ESP8266-p-1994.html seeedstudio.com] ~ 5.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://shop.in-circuit.de/index.php?cPath=21 In-Circuit.de] ESP-ADC-DIL-Modul mit ESP8266EX 9.90€ Einzelpreis&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.watterott.com/index.php?page=search&amp;amp;desc=off&amp;amp;sdesc=off&amp;amp;keywords=ESP8266 watterott.com] ab ~ 4€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ramser-elektro.at/shop/module-sensoren-adapter-und-co/esp8266-esp12f-wlan-modul www.ramser-elektro.at] ESP12F mit 16mBit Flash ~ 4.90€ (ab 35€ Versandkostenfrei)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anderes==&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/ESP8266-CPCB PCB für Community-Modul (Vorschlag)]&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ ESP8266 - ESP12E mit Arduino IDE programmieren]&lt;br /&gt;
*[http://fkainka.de/esp8266-in-der-arduino-ide/ ESP8266 mit Arduino-IDE programmieren]&lt;br /&gt;
*[http://www.arduinesp.com Arduino-IDE-Integration (ab 1.6.x)]&lt;br /&gt;
*[https://cknodemcu.wordpress.com/ NodeMCU (Lua) Anwendungen]&lt;br /&gt;
*[http://www.mikrocontroller-elektronik.de/esp8266-chip-buecher-projekte-wlan-chip Interessante deutsche Bücher zum ESP8266]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--von [[axhieb]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;br /&gt;
[[Kategorie:Wlan]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95992</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95992"/>
		<updated>2017-04-22T17:44:22Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Link zur Messung der Stromaufnahme hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:ESP8266.jpg|thumb|300px|ESP8266, Funkmodul]]&lt;br /&gt;
Das [[ESP8266]] von dem Hersteller Espressif ist ein programmierbarer WLAN-SoC mit [[UART]]- und [[SPI]]-Schnittstelle. &#039;&#039;&#039;WLAN&#039;&#039;&#039;-Funkmodule mit ESP8266 sind ab 3€ verfügbar. Die UART-Schnitttstelle ermöglicht eine einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
Laut Hersteller &amp;lt;ref&amp;gt;[http://espressif.com/en/products/esp8266 &#039;&#039;Herstellerseite -  unter Details&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;. :&lt;br /&gt;
* 802.11 b/g/n&lt;br /&gt;
* Wi-Fi Direct (P2P), soft-AP&lt;br /&gt;
* Integrated TCP/IP protocol stack&lt;br /&gt;
* Integrated TR switch, balun, LNA, power amplifier and matching network&lt;br /&gt;
* Integrated PLLs, regulators, DCXO and power management units&lt;br /&gt;
* +19.5dBm output power in 802.11b mode&lt;br /&gt;
* Power down leakage current of &amp;lt;20µA (bei 2,5V, Flash-Chip nicht mit gerechnet)&lt;br /&gt;
* Integrated low power 32-bit CPU could be used as application processor&lt;br /&gt;
* SDIO 1.1/2.0, SPI, UART&lt;br /&gt;
* STBC, 1×1 MIMO, 2×1 MIMO&lt;br /&gt;
* A-MPDU &amp;amp; A-MSDU aggregation &amp;amp; 0.4ms guard interval&lt;br /&gt;
* Wake up and transmit packets in &amp;lt; 2ms&lt;br /&gt;
* Standby power consumption of &amp;lt; 1.0mW (DTIM3)&lt;br /&gt;
* VCC: 2,5...3,6V (Achtung: Eingänge sind &#039;&#039;&#039;NICHT 5V TOLERANT&#039;&#039;&#039;!)&lt;br /&gt;
Weiterhin:&lt;br /&gt;
* GPIOs, ADC&lt;br /&gt;
&lt;br /&gt;
=== Datendurchsatz/Performanz ===&lt;br /&gt;
[https://www.mikrocontroller.net/topic/342240?page=single#3857630 Beitrag im Forum mit Tests: TCP: bis zu 7 MBit/s]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=7&amp;amp;t=24 Beitrag Espressif-Forum: UART loopback: 4.5 Mbps]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?t=2187 Beitrag Espressif-Forum: 300kbps senden und empfangen im TCP passhrough Modus]&amp;lt;br/&amp;gt;&lt;br /&gt;
200-300k Byte/s Senden und Empfangen via TCP und UDP mit C Programm und SDK 1.5.4 (Bei stefanus zuhause)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Bei Verwendung der AT-Firmware (v1.1.0.0 aus SDK 1.5.4) mit einem seriell angeschlossenen Mikrocontroller dauert die Antwort auf ein kurzes Kommando (vom PC an den µC und zurück) typischerweise 100-200ms.&lt;br /&gt;
&lt;br /&gt;
=== Power-/Sleep-Modes ===&lt;br /&gt;
Der Stromverbrauch des ESP8266 ist abhängig von vielen Faktoren, er lässt sich aber durch geschickte Programmierung durchaus deutlich senken.&amp;lt;br/&amp;gt;&lt;br /&gt;
So ist es nicht notwendig, dass das WIFI-Modem oder der Mikrocontroller ständig läuft, um z.B. eine WLAN-Türklingel zu realisieren. Im &amp;quot;Deep-Sleep&amp;quot; würde der ESP8266 dann nur wenige µA verbrauchen, bis er über einen Timer zurückgesetzt wird und die Meldung absetzt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Stefanus hat 25µA gemessen: [https://www.mikrocontroller.net/topic/425023?goto=4985619]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=6&amp;amp;t=133 Detailierte Übersicht der verschieden Modi und deren Stromverbrauch von Espressif] (nicht mehr aktuell!)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WLAN-Module mit ESP8266 ==&lt;br /&gt;
Es existieren ca. 11 Varianten von chinesischen Herstellern. Beispielsweise mit PCB- oder Keramik-Antenne oder mit u.fl.&lt;br /&gt;
&lt;br /&gt;
* Die Firmware aus SDK 0.9.1 unterstützt bis zu vier gleichzeitige TCP- oder UDP-Verbindungen. &lt;br /&gt;
* Die Firmware aus SDK 1.5.4 unterstützt bis zu fünf gleichzeitige TCP- oder UDP-Verbindungen.&lt;br /&gt;
&lt;br /&gt;
Sie kann sich in vorhandene WLAN-Netze einbuchen, aber auch selbst Access-Point mit DHCP-Server sein. Der Access-Point ist zu Android kompatibel (mit 4.1.2 getestet).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Firmware enthält jedoch keinen Router. Mehrere Computer, die mit dem Modul als Access-Point verbunden sind, können keine Verbindung zueinander aufbauen. Das Feature nennt sich AP-Isolation.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#Produktbeschreibung: [[http://playground.boxtec.ch/doku.php/wireless/esp8266]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung einiger ESP8266-Module ===&lt;br /&gt;
====ESP8266-01====&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:ESP8266-PinBelegung1.jpg|Pinbelegung - Groß mit PCB-Antenne&lt;br /&gt;
Datei:ESP8266-PinBelegung2.jpg|Pinbelegung - Klein mit Keramik-Antenne&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Quelle &amp;lt;ref&amp;gt;[http://pan.baidu.com/share/link?shareid=727869034&amp;amp;uk=1900861665 &#039;&#039;Seller Information&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
====ESP8266-07====&lt;br /&gt;
Achtung, beim ESP8266-07-Modul sind einige mit vertauschten Beschriftungen von GPIO4 und GPIO5 unterwegs!!.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ESP8266-12E====&lt;br /&gt;
Das ESP12E-Modul gehört vermutlich wegen der vielen Ports zu den beliebtesten Modulen.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/?projekt-download=2967 Pinbelegung (PDF)]&lt;br /&gt;
Für dieses Modul gibt es auch ein spezielles Adapter-Projekt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Adapter-ESP12E.jpeg|miniatur|zentriert]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ Projekt: ESP-12E Adapter und ESP12E Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Möglichkeiten der Nutzung und Programmierung ==&lt;br /&gt;
===== Benutzung einer Firmware =====&lt;br /&gt;
Verschiedene Projekte betreiben die Entwicklung einer Firmware. Man kann die Firmware &amp;quot;einfach nur&amp;quot; flashen und benutzen oder sich auch aktiv an der Entwicklung beteiligen. Es gibt unter anderem folgende Projekte:&lt;br /&gt;
* AT-Befehle: Firmware, mit welcher das Modul über UART angesprochen wird.&lt;br /&gt;
* Micropython: Firmware, die das Ablaufen von Python-Scripts ermöglicht ([https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html Tutorial])&lt;br /&gt;
* NodeMCU: Firmware, die das Ablaufen von Lua-Scripts ermöglicht ([https://github.com/nodemcu/nodemcu-firmware Github])&lt;br /&gt;
* smartJS: Firmware, die das Ausführen von Javascript erlaubt ([https://github.com/cesanta/smart.js Github])&lt;br /&gt;
* Arduino core for ESP8266 WiFi chip: Programmierumgebung &amp;amp; Firmware, die das Ausführen von C-Programmen ermöglicht, im Stil der bekannten Arduino-Plattform. [https://github.com/esp8266/Arduino Github - ink. Anleitung]&lt;br /&gt;
* ESP8266 Basic: Firmware, die das Ausführen von Basic-Programmen und das Editieren über WLAN erlaubt [http://www.esp8266basic.com/]&lt;br /&gt;
* Sming: Einfach zu nutzendes Framework, ähnlich wie Arduino, allerdings mit einem einfachen Makefile pro Projekt und mit Eclipse-Projekten.([https://github.com/SmingHub/Sming Github])&lt;br /&gt;
* ESP-Lisp (BETA): A small fast lisp interpeter for a ESP8266 ([https://github.com/yesco/esp-lisp Github])&lt;br /&gt;
* ESP8266Forth:  Forth for the ESP8266 NodeMCU Amica ([https://github.com/CraigLindley/ESP8266Forth Github])&lt;br /&gt;
* Forthright: Forth for ESP-8266 ([https://github.com/niclash/forthright Github])&lt;br /&gt;
* Punyforth:  FORTH inspired programming language for the ESP8266 ([https://github.com/zeroflag/punyforth Github])&lt;br /&gt;
* ESP-LINK: Wifi-Serial Bridge w/REST&amp;amp;MQTT([https://github.com/jeelabs/esp-link Github])&lt;br /&gt;
&lt;br /&gt;
===== Erstellen (Kompilieren) einer Firmware =====&lt;br /&gt;
Für die Erstellung einer individuellen Firmware gibt es zwei Möglichkeiten:&lt;br /&gt;
* Software Development Kit (SDK): Erstellen einer Firmware mit einer GCC-Toolchain&lt;br /&gt;
* Arduino IDE: Erstellen einer Firmware mit einer Arduino-IDE&lt;br /&gt;
Projekte, die eine Firmware für das ESP8266 entwickeln (siehe vorheriger Abschnitt), benutzen eine dieser beiden Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== Firmware flashen/updaten ===&lt;br /&gt;
Typischerweise wird eine kompilierte Firmware per UART-Bootloader des ESP8266-SoC auf einen Flash-Chip eines ESP8266-Moduls geladen. Von dort startet der ESP8266-SoC anschließend die Firmware.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433 Flash-Download-Tool vom Hersteller] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/themadinventor/esptool Python-Tool zum Flashen (von Fredrik Ahlberg)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/3s1d/esp_prog Extension zum Tool von Fredrik Ahlberg] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=2#3857075 Tool zum Flashen (von Christian Klippel)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://web.archive.org/web/20150502082616/http://defcon-cc.dyndns.org/wiki/ESP8266#Update Anleitung, extern] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=3#3810559 Anleitung, Forum]&lt;br /&gt;
&lt;br /&gt;
Der Hersteller veröffentlicht regelmäßig [http://bbs.espressif.com/viewforum.php?f=5 Firmwareupdates] als Bestandteil des esp_iot_sdk. Die Firmware-Dateien befinden sich im Verzeichnis bin. Das Update wird beispielsweise für Firmware 0.9.5 folgendermaßen durchgeführt: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python esptool.py --baud 9600 --port com6 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Flashgröße muss man die Firmware ab Version 1.0.1 selbst compilieren. Siehe Diskussion [http://www.esp8266.com/viewtopic.php?p=16515 hier] und [http://bbs.espressif.com/viewtopic.php?f=16&amp;amp;t=400 hier].&lt;br /&gt;
&lt;br /&gt;
=== Nutzung ohne Firmware ===&lt;br /&gt;
Es ist wohl sogar möglich den ESP8266 als SDIO-WLAN-Modul an einem Raspberry Pi zu betreiben. Verwendet wird dabei der Linuxtreiber des ESP8089. Der ESP8266 bootet dann nicht die Firmware aus dem Flash sondern über SDIO.    &lt;br /&gt;
&lt;br /&gt;
https://hackaday.io/project/8678-rpi-wifi&lt;br /&gt;
&lt;br /&gt;
== AT-Befehle für eine Firmware auf Basis des SDK-Beispiels &amp;quot;AT&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als AP&lt;br /&gt;
&lt;br /&gt;
Da wir nicht wissen, in welchem Modus sich das Modul gerade befindet, fragen wir diesen mit dem &lt;br /&gt;
Befehl AT+CWMODE? ab. Das Modul antwortet mit &lt;br /&gt;
&lt;br /&gt;
    AT+CWMODE?&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;+CWMODE:1&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
In diesem Fall ist das Modul aktuell im Modus 1 (Station) eingestellt. Also ändern wir den Modus auf 2 (AP)&lt;br /&gt;
mit dem Befehl AT+CWMODE=2. Nach diesem Befehl ist ein Reset des Moduls erforderlich, damit die Änderung &lt;br /&gt;
sichtbar wird. Mit dem Befehl AT+RST führen wir diesen durch. Das Modul startet neu und die Stromaufnahme&lt;br /&gt;
steigt auf ca 80 mA. Das Modul ist jetzt als WLAN-AP im Wireless-LAN sichtbar. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir noch einstellen, dass wir mehrere Verbindungen gleichzeitig haben wollen, sowie den TCP-Server starten und einstellen. Mit dem Befehl AT+CIPMUX=1 sagen wir dem Modul, dass wir mehrere Verbindungen haben wollen. Und mit dem Befehl AT+CIPSERVER=1,2526 starten wir den TCP-Server und lassen ihn auf Port 2526 laufen. Sobald sich ein Client verbindet, sendet das Modul &#039;Link&#039; + LF + CR. Beim Trennen einer Verbindung vom Client kommt &#039;Unlink&#039; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir uns über einen TCP-Socket auf Port 2526 mit dem Modul verbinden und Daten austauschen. Empfangene Daten werden folgendermaßen angezeigt. Gesendet wurde  &amp;quot;Hallo Leute&amp;quot; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     +IPD,0,11:Hallo Leute&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+IPD kommt immer, 0 ist die erste Verbindung. Wenn 2 Geräte gleichzeitig eine Verbindung aufgebaut haben, steht dort eine 1. 11 Zeichen wurden empfangen, dann kommen die Daten.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten vom Modul zum Client geht man folgenderweise vor. Erstmal sagen wir dem Modul, wieviele Daten wir an welche Verbindung schicken wollen. Mit dem Befehl AT+CIPSEND=0,5 z. B. sagen wir dem Modul wir möchten 5 Bytes an Verbindung 0 senden. Nach diesem Befehl werden die nächsten 5 Zeichen direkt an die Verbindung weitergereicht.&lt;br /&gt;
Sollte keine aktive Verbindung bestehen, sendet das Modul &lt;br /&gt;
     AT+CIPSEND=0,5&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;link is not&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
ansonsten kommt &lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt; &amp;gt;&lt;br /&gt;
und man kann Daten senden. Nach dem Absenden der Daten &#039;Leute&#039; + LF + CR sendet das Modul &lt;br /&gt;
    Leute&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    SEND OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als Station&lt;br /&gt;
&lt;br /&gt;
== Software Development Kit (SDK) ==&lt;br /&gt;
Mit dem SDK können eigene Applikationen programmiert und die im SDK vorhandenen Beispiele &amp;quot;AT&amp;quot; und &amp;quot;IoT&amp;quot; verändert werden. Das SDK wird vom Hersteller zur Verfügung gestellt (Stand 25.10.2014). Passend zum SDK existiert eine virtuelle Maschine mit eingerichtetem gcc zum Kompilieren. Insbesondere der nun verfügbare gcc basiert auf einer Community-Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine + Anleitung/HOWTO für das Setup sowie für das Kompilieren]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Mit dem SDK wird der Mikrocontroller programmiert, der sich direkt auf dem ESP8266-SoC-Chip befindet. Dies ist nicht zu verwechseln mit Programmieranleitungen zur UART-Ansteuerung des ESP8266-SoC (meist mit AT-Firmware) mit einem anderen Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
==Checkliste bei Problemen mit dem Modul/Compiler/SDK==&lt;br /&gt;
Bitte berücksichtige bei der Frage nach Hilfestellung zu Deinem Problem die folgende Checkliste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit der AT-Firmware/UART-Ansteuerung mit Mikrocontroller&#039;&#039;&#039;&lt;br /&gt;
# Was nutzt Du für die Stromversorgung?&amp;lt;br/&amp;gt;(Ganz knapp benennen, so dass Rückschlüsse auf Spannung und Stromstärke möglich sind)&lt;br /&gt;
# Welche Firmware-Version verwendest Du und von woher hast Du sie?&lt;br /&gt;
# Welchen Mikrocontroller verwendest Du?&lt;br /&gt;
# Welche Baudrate verwendest Du?&lt;br /&gt;
# &amp;quot;Sieht&amp;quot; das Modul den AP, &amp;quot;sieht&amp;quot; der PC das Modul?&lt;br /&gt;
# Funktioniert ein Connect?&lt;br /&gt;
# Welche AT-Befehlssequenz verwendest Du und was antwortet das Modul?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit dem SDK/Compiler&#039;&#039;&#039;&lt;br /&gt;
# Benutzt Du die neuste, offizielle VM?&amp;lt;br/&amp;gt;(Diese ist ausgelegt für das neueste SDK)&lt;br /&gt;
# Benutzt Du das neueste, offizielle SDK? Welche Version benutzt Du?&amp;lt;br/&amp;gt;(Es werden regelmäßig Bugfixes und Erweiterungen eingepflegt)&lt;br /&gt;
# Kannst Du die SDK-Beispiele (IoT,AT) entsprechend der offiziellen Anleitung kompilieren, flashen und läuft es?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://en.wikipedia.org/wiki/ESP8266 ESP8266-Eintrag auf en.wikipedia.org]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.esp8266.com/ ESP8266-Community-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://github.com/esp8266 ESP8266 Github mit Wiki und Source-Code-Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://hackaday.com/tag/esp8266/ Hackaday-Posts zu ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://espressif.com/en/products/esp8266/ ESP8266-Seite des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/ ESP8266-Forum des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller-elektronik.de/nodemcu-esp8266-tutorial-wlan-board-arduino-ide/ ESP8266 und NodeMCU - Tutorial mit Farbdisplay und Temperatursensor]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/348772 Topic neu im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240 Topic alt im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342878 Sammelbestellungen im mikrocontroller.net-Forum]&lt;br /&gt;
&lt;br /&gt;
[http://esp8266-server.de/ Universelle I2C-Steuerung mittels WLAN-TCP/IP und Webinterface mit ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://blog.thomasheldt.de/ Viele Projekte und Informationen zum ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/wlan_io/ Projekt I/O-Schnittstellenmodul mit WLAN] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/esp8266/ Dokumentation zum ESP8266 mit Arduino Code-Beispielen] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dokumente === &lt;br /&gt;
[http://neilkolban.com/tech/esp8266/ Kolban’s book on the ESP8266] Sehr empfehlenswert!&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Anleitung/HOWTO für das Setup der virtuellen Maschine (SDK) sowie für das Kompilieren]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://nurdspace.nl/ESP8266 Übersetztes Datenblatt]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/w/Wi07c AT Instructions Set (English)] und [http://www.electrodragon.com/w/Wi07c#First_time_use_guide Anleitung zum Betrieb an einem Arduino (inkl. Code)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://thomaspfeifer.net/esp8266_wlan_seriell_modul_at_kommandos.htm Beschreibung der AT-Kommandos mit Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/229016/Espressif_IoT_AT____v0.1.5.906.pdf Espressif AT Instruction Set(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/document/pdf/ESP8266%20Specifications(Chinese).pdf ESP8266 Specifications(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://nodemcu.readthedocs.org/en/dev/ NodeMCU-Documentation]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://cknodemcu.wordpress.com/2015/11/24/building-an-iot-node-for-less-than-15/ Building an IoT Node for less than 15$] (Paper, Kindle via Amazon)&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linux-Maschine mit eingerichtetem gcc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://onedrive.live.com/#cid=C4DDF72E6EEA3826&amp;amp;id=C4DDF72E6EEA3826%21631 Dateien (Xplorer+SDK+PDF+etc.)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/230185/esp8266_config_v050.exe Config-Tool] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen ===&lt;br /&gt;
[http://espressif.com/en/company/contact/buy-a-sample/ Offizieller Espressif-Vertriebskanal] (Sample Purchase)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?SearchText=ESP8266 aliexpress.com] ~ 2€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.banggood.com/?zf=283997 banggood.com] ~ 3.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ebay.de/ Ebay]&lt;br /&gt;
ab 3€ inkl. Versand, Einzelstückpreis: ESP-01/02/03/04/05&amp;lt;br/&amp;gt;&lt;br /&gt;
(Suchbegriff: ESP8266, Option Artikelstandort: &amp;quot;Weltweit&amp;quot;)&amp;lt;br/&amp;gt;&lt;br /&gt;
(10 Stück ab 27 EUR inkl. Versand; Suchbegriff: 10pcs ESP8266)&amp;lt;br/&amp;gt;&lt;br /&gt;
ab 3.20€ inkl. Versand, Einzelstückpreis: ESP-07/08/09/11&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/?s=esp8266&amp;amp;post_type=product electrodragon.com] ~ 3.50€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.it-wns.de/themes/suche/index.php?suchekategorie=&amp;amp;sucheallgemein=esp8266 IT-WNS.de] (ESP-01/02/03/06/07/12E) je 3.99€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/depot/WiFi-Serial-Transceiver-Module-w-ESP8266-p-1994.html seeedstudio.com] ~ 5.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://shop.in-circuit.de/index.php?cPath=21 In-Circuit.de] ESP-ADC-DIL-Modul mit ESP8266EX 9.90€ Einzelpreis&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.watterott.com/index.php?page=search&amp;amp;desc=off&amp;amp;sdesc=off&amp;amp;keywords=ESP8266 watterott.com] ab ~ 4€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ramser-elektro.at/shop/module-sensoren-adapter-und-co/esp8266-esp12f-wlan-modul www.ramser-elektro.at] ESP12F mit 16mBit Flash ~ 4.90€ (ab 35€ Versandkostenfrei)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anderes==&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/ESP8266-CPCB PCB für Community-Modul (Vorschlag)]&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ ESP8266 - ESP12E mit Arduino IDE programmieren]&lt;br /&gt;
*[http://fkainka.de/esp8266-in-der-arduino-ide/ ESP8266 mit Arduino-IDE programmieren]&lt;br /&gt;
*[http://www.arduinesp.com Arduino-IDE-Integration (ab 1.6.x)]&lt;br /&gt;
*[https://cknodemcu.wordpress.com/ NodeMCU (Lua) Anwendungen]&lt;br /&gt;
*[http://www.mikrocontroller-elektronik.de/esp8266-chip-buecher-projekte-wlan-chip Interessante deutsche Bücher zum ESP8266]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--von [[axhieb]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;br /&gt;
[[Kategorie:Wlan]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95987</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95987"/>
		<updated>2017-04-22T17:29:48Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: /* Datendurchsatz/Performanz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:ESP8266.jpg|thumb|300px|ESP8266, Funkmodul]]&lt;br /&gt;
Das [[ESP8266]] von dem Hersteller Espressif ist ein programmierbarer WLAN-SoC mit [[UART]]- und [[SPI]]-Schnittstelle. &#039;&#039;&#039;WLAN&#039;&#039;&#039;-Funkmodule mit ESP8266 sind ab 3€ verfügbar. Die UART-Schnitttstelle ermöglicht eine einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
Laut Hersteller &amp;lt;ref&amp;gt;[http://espressif.com/en/products/esp8266 &#039;&#039;Herstellerseite -  unter Details&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;. :&lt;br /&gt;
* 802.11 b/g/n&lt;br /&gt;
* Wi-Fi Direct (P2P), soft-AP&lt;br /&gt;
* Integrated TCP/IP protocol stack&lt;br /&gt;
* Integrated TR switch, balun, LNA, power amplifier and matching network&lt;br /&gt;
* Integrated PLLs, regulators, DCXO and power management units&lt;br /&gt;
* +19.5dBm output power in 802.11b mode&lt;br /&gt;
* Power down leakage current of &amp;lt;20µA (bei 2,5V, Flash-Chip nicht mit gerechnet)&lt;br /&gt;
* Integrated low power 32-bit CPU could be used as application processor&lt;br /&gt;
* SDIO 1.1/2.0, SPI, UART&lt;br /&gt;
* STBC, 1×1 MIMO, 2×1 MIMO&lt;br /&gt;
* A-MPDU &amp;amp; A-MSDU aggregation &amp;amp; 0.4ms guard interval&lt;br /&gt;
* Wake up and transmit packets in &amp;lt; 2ms&lt;br /&gt;
* Standby power consumption of &amp;lt; 1.0mW (DTIM3)&lt;br /&gt;
* VCC: 2,5...3,6V (Achtung: Eingänge sind &#039;&#039;&#039;NICHT 5V TOLERANT&#039;&#039;&#039;!)&lt;br /&gt;
Weiterhin:&lt;br /&gt;
* GPIOs, ADC&lt;br /&gt;
&lt;br /&gt;
=== Datendurchsatz/Performanz ===&lt;br /&gt;
[https://www.mikrocontroller.net/topic/342240?page=single#3857630 Beitrag im Forum mit Tests: TCP: bis zu 7 MBit/s]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=7&amp;amp;t=24 Beitrag Espressif-Forum: UART loopback: 4.5 Mbps]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?t=2187 Beitrag Espressif-Forum: 300kbps senden und empfangen im TCP passhrough Modus]&amp;lt;br/&amp;gt;&lt;br /&gt;
200-300k Byte/s Senden und Empfangen via TCP und UDP mit C Programm und SDK 1.5.4 (Bei stefanus zuhause)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Bei Verwendung der AT-Firmware (v1.1.0.0 aus SDK 1.5.4) mit einem seriell angeschlossenen Mikrocontroller dauert die Antwort auf ein kurzes Kommando (vom PC an den µC und zurück) typischerweise 100-200ms.&lt;br /&gt;
&lt;br /&gt;
=== Power-/Sleep-Modes ===&lt;br /&gt;
Der Stromverbrauch des ESP8266 ist abhängig von vielen Faktoren, er lässt sich aber durch geschickte Programmierung durchaus deutlich senken.&amp;lt;br/&amp;gt;&lt;br /&gt;
So ist es nicht notwendig, dass das WIFI-Modem oder der Mikrocontroller ständig läuft, um z.B. eine WLAN-Türklingel zu realisieren. Im &amp;quot;Deep-Sleep&amp;quot; würde der ESP8266 dann nur wenige µA verbrauchen, bis er über einen Timer zurückgesetzt wird und die Meldung absetzt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=6&amp;amp;t=133 Detailierte Übersicht der verschieden Modi und deren Stromverbrauch von Espressif] (nicht mehr aktuell!)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WLAN-Module mit ESP8266 ==&lt;br /&gt;
Es existieren ca. 11 Varianten von chinesischen Herstellern. Beispielsweise mit PCB- oder Keramik-Antenne oder mit u.fl.&lt;br /&gt;
&lt;br /&gt;
* Die Firmware aus SDK 0.9.1 unterstützt bis zu vier gleichzeitige TCP- oder UDP-Verbindungen. &lt;br /&gt;
* Die Firmware aus SDK 1.5.4 unterstützt bis zu fünf gleichzeitige TCP- oder UDP-Verbindungen.&lt;br /&gt;
&lt;br /&gt;
Sie kann sich in vorhandene WLAN-Netze einbuchen, aber auch selbst Access-Point mit DHCP-Server sein. Der Access-Point ist zu Android kompatibel (mit 4.1.2 getestet).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Firmware enthält jedoch keinen Router. Mehrere Computer, die mit dem Modul als Access-Point verbunden sind, können keine Verbindung zueinander aufbauen. Das Feature nennt sich AP-Isolation.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#Produktbeschreibung: [[http://playground.boxtec.ch/doku.php/wireless/esp8266]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung einiger ESP8266-Module ===&lt;br /&gt;
====ESP8266-01====&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:ESP8266-PinBelegung1.jpg|Pinbelegung - Groß mit PCB-Antenne&lt;br /&gt;
Datei:ESP8266-PinBelegung2.jpg|Pinbelegung - Klein mit Keramik-Antenne&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Quelle &amp;lt;ref&amp;gt;[http://pan.baidu.com/share/link?shareid=727869034&amp;amp;uk=1900861665 &#039;&#039;Seller Information&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
====ESP8266-07====&lt;br /&gt;
Achtung, beim ESP8266-07-Modul sind einige mit vertauschten Beschriftungen von GPIO4 und GPIO5 unterwegs!!.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ESP8266-12E====&lt;br /&gt;
Das ESP12E-Modul gehört vermutlich wegen der vielen Ports zu den beliebtesten Modulen.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/?projekt-download=2967 Pinbelegung (PDF)]&lt;br /&gt;
Für dieses Modul gibt es auch ein spezielles Adapter-Projekt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Adapter-ESP12E.jpeg|miniatur|zentriert]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ Projekt: ESP-12E Adapter und ESP12E Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Möglichkeiten der Nutzung und Programmierung ==&lt;br /&gt;
===== Benutzung einer Firmware =====&lt;br /&gt;
Verschiedene Projekte betreiben die Entwicklung einer Firmware. Man kann die Firmware &amp;quot;einfach nur&amp;quot; flashen und benutzen oder sich auch aktiv an der Entwicklung beteiligen. Es gibt unter anderem folgende Projekte:&lt;br /&gt;
* AT-Befehle: Firmware, mit welcher das Modul über UART angesprochen wird.&lt;br /&gt;
* Micropython: Firmware, die das Ablaufen von Python-Scripts ermöglicht ([https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html Tutorial])&lt;br /&gt;
* NodeMCU: Firmware, die das Ablaufen von Lua-Scripts ermöglicht ([https://github.com/nodemcu/nodemcu-firmware Github])&lt;br /&gt;
* smartJS: Firmware, die das Ausführen von Javascript erlaubt ([https://github.com/cesanta/smart.js Github])&lt;br /&gt;
* Arduino core for ESP8266 WiFi chip: Programmierumgebung &amp;amp; Firmware, die das Ausführen von C-Programmen ermöglicht, im Stil der bekannten Arduino-Plattform. [https://github.com/esp8266/Arduino Github - ink. Anleitung]&lt;br /&gt;
* ESP8266 Basic: Firmware, die das Ausführen von Basic-Programmen und das Editieren über WLAN erlaubt [http://www.esp8266basic.com/]&lt;br /&gt;
* Sming: Einfach zu nutzendes Framework, ähnlich wie Arduino, allerdings mit einem einfachen Makefile pro Projekt und mit Eclipse-Projekten.([https://github.com/SmingHub/Sming Github])&lt;br /&gt;
* ESP-Lisp (BETA): A small fast lisp interpeter for a ESP8266 ([https://github.com/yesco/esp-lisp Github])&lt;br /&gt;
* ESP8266Forth:  Forth for the ESP8266 NodeMCU Amica ([https://github.com/CraigLindley/ESP8266Forth Github])&lt;br /&gt;
* Forthright: Forth for ESP-8266 ([https://github.com/niclash/forthright Github])&lt;br /&gt;
* Punyforth:  FORTH inspired programming language for the ESP8266 ([https://github.com/zeroflag/punyforth Github])&lt;br /&gt;
* ESP-LINK: Wifi-Serial Bridge w/REST&amp;amp;MQTT([https://github.com/jeelabs/esp-link Github])&lt;br /&gt;
&lt;br /&gt;
===== Erstellen (Kompilieren) einer Firmware =====&lt;br /&gt;
Für die Erstellung einer individuellen Firmware gibt es zwei Möglichkeiten:&lt;br /&gt;
* Software Development Kit (SDK): Erstellen einer Firmware mit einer GCC-Toolchain&lt;br /&gt;
* Arduino IDE: Erstellen einer Firmware mit einer Arduino-IDE&lt;br /&gt;
Projekte, die eine Firmware für das ESP8266 entwickeln (siehe vorheriger Abschnitt), benutzen eine dieser beiden Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== Firmware flashen/updaten ===&lt;br /&gt;
Typischerweise wird eine kompilierte Firmware per UART-Bootloader des ESP8266-SoC auf einen Flash-Chip eines ESP8266-Moduls geladen. Von dort startet der ESP8266-SoC anschließend die Firmware.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433 Flash-Download-Tool vom Hersteller] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/themadinventor/esptool Python-Tool zum Flashen (von Fredrik Ahlberg)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/3s1d/esp_prog Extension zum Tool von Fredrik Ahlberg] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=2#3857075 Tool zum Flashen (von Christian Klippel)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://web.archive.org/web/20150502082616/http://defcon-cc.dyndns.org/wiki/ESP8266#Update Anleitung, extern] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=3#3810559 Anleitung, Forum]&lt;br /&gt;
&lt;br /&gt;
Der Hersteller veröffentlicht regelmäßig [http://bbs.espressif.com/viewforum.php?f=5 Firmwareupdates] als Bestandteil des esp_iot_sdk. Die Firmware-Dateien befinden sich im Verzeichnis bin. Das Update wird beispielsweise für Firmware 0.9.5 folgendermaßen durchgeführt: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python esptool.py --baud 9600 --port com6 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Flashgröße muss man die Firmware ab Version 1.0.1 selbst compilieren. Siehe Diskussion [http://www.esp8266.com/viewtopic.php?p=16515 hier] und [http://bbs.espressif.com/viewtopic.php?f=16&amp;amp;t=400 hier].&lt;br /&gt;
&lt;br /&gt;
=== Nutzung ohne Firmware ===&lt;br /&gt;
Es ist wohl sogar möglich den ESP8266 als SDIO-WLAN-Modul an einem Raspberry Pi zu betreiben. Verwendet wird dabei der Linuxtreiber des ESP8089. Der ESP8266 bootet dann nicht die Firmware aus dem Flash sondern über SDIO.    &lt;br /&gt;
&lt;br /&gt;
https://hackaday.io/project/8678-rpi-wifi&lt;br /&gt;
&lt;br /&gt;
== AT-Befehle für eine Firmware auf Basis des SDK-Beispiels &amp;quot;AT&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als AP&lt;br /&gt;
&lt;br /&gt;
Da wir nicht wissen, in welchem Modus sich das Modul gerade befindet, fragen wir diesen mit dem &lt;br /&gt;
Befehl AT+CWMODE? ab. Das Modul antwortet mit &lt;br /&gt;
&lt;br /&gt;
    AT+CWMODE?&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;+CWMODE:1&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
In diesem Fall ist das Modul aktuell im Modus 1 (Station) eingestellt. Also ändern wir den Modus auf 2 (AP)&lt;br /&gt;
mit dem Befehl AT+CWMODE=2. Nach diesem Befehl ist ein Reset des Moduls erforderlich, damit die Änderung &lt;br /&gt;
sichtbar wird. Mit dem Befehl AT+RST führen wir diesen durch. Das Modul startet neu und die Stromaufnahme&lt;br /&gt;
steigt auf ca 80 mA. Das Modul ist jetzt als WLAN-AP im Wireless-LAN sichtbar. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir noch einstellen, dass wir mehrere Verbindungen gleichzeitig haben wollen, sowie den TCP-Server starten und einstellen. Mit dem Befehl AT+CIPMUX=1 sagen wir dem Modul, dass wir mehrere Verbindungen haben wollen. Und mit dem Befehl AT+CIPSERVER=1,2526 starten wir den TCP-Server und lassen ihn auf Port 2526 laufen. Sobald sich ein Client verbindet, sendet das Modul &#039;Link&#039; + LF + CR. Beim Trennen einer Verbindung vom Client kommt &#039;Unlink&#039; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir uns über einen TCP-Socket auf Port 2526 mit dem Modul verbinden und Daten austauschen. Empfangene Daten werden folgendermaßen angezeigt. Gesendet wurde  &amp;quot;Hallo Leute&amp;quot; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     +IPD,0,11:Hallo Leute&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+IPD kommt immer, 0 ist die erste Verbindung. Wenn 2 Geräte gleichzeitig eine Verbindung aufgebaut haben, steht dort eine 1. 11 Zeichen wurden empfangen, dann kommen die Daten.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten vom Modul zum Client geht man folgenderweise vor. Erstmal sagen wir dem Modul, wieviele Daten wir an welche Verbindung schicken wollen. Mit dem Befehl AT+CIPSEND=0,5 z. B. sagen wir dem Modul wir möchten 5 Bytes an Verbindung 0 senden. Nach diesem Befehl werden die nächsten 5 Zeichen direkt an die Verbindung weitergereicht.&lt;br /&gt;
Sollte keine aktive Verbindung bestehen, sendet das Modul &lt;br /&gt;
     AT+CIPSEND=0,5&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;link is not&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
ansonsten kommt &lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt; &amp;gt;&lt;br /&gt;
und man kann Daten senden. Nach dem Absenden der Daten &#039;Leute&#039; + LF + CR sendet das Modul &lt;br /&gt;
    Leute&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    SEND OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als Station&lt;br /&gt;
&lt;br /&gt;
== Software Development Kit (SDK) ==&lt;br /&gt;
Mit dem SDK können eigene Applikationen programmiert und die im SDK vorhandenen Beispiele &amp;quot;AT&amp;quot; und &amp;quot;IoT&amp;quot; verändert werden. Das SDK wird vom Hersteller zur Verfügung gestellt (Stand 25.10.2014). Passend zum SDK existiert eine virtuelle Maschine mit eingerichtetem gcc zum Kompilieren. Insbesondere der nun verfügbare gcc basiert auf einer Community-Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine + Anleitung/HOWTO für das Setup sowie für das Kompilieren]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Mit dem SDK wird der Mikrocontroller programmiert, der sich direkt auf dem ESP8266-SoC-Chip befindet. Dies ist nicht zu verwechseln mit Programmieranleitungen zur UART-Ansteuerung des ESP8266-SoC (meist mit AT-Firmware) mit einem anderen Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
==Checkliste bei Problemen mit dem Modul/Compiler/SDK==&lt;br /&gt;
Bitte berücksichtige bei der Frage nach Hilfestellung zu Deinem Problem die folgende Checkliste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit der AT-Firmware/UART-Ansteuerung mit Mikrocontroller&#039;&#039;&#039;&lt;br /&gt;
# Was nutzt Du für die Stromversorgung?&amp;lt;br/&amp;gt;(Ganz knapp benennen, so dass Rückschlüsse auf Spannung und Stromstärke möglich sind)&lt;br /&gt;
# Welche Firmware-Version verwendest Du und von woher hast Du sie?&lt;br /&gt;
# Welchen Mikrocontroller verwendest Du?&lt;br /&gt;
# Welche Baudrate verwendest Du?&lt;br /&gt;
# &amp;quot;Sieht&amp;quot; das Modul den AP, &amp;quot;sieht&amp;quot; der PC das Modul?&lt;br /&gt;
# Funktioniert ein Connect?&lt;br /&gt;
# Welche AT-Befehlssequenz verwendest Du und was antwortet das Modul?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit dem SDK/Compiler&#039;&#039;&#039;&lt;br /&gt;
# Benutzt Du die neuste, offizielle VM?&amp;lt;br/&amp;gt;(Diese ist ausgelegt für das neueste SDK)&lt;br /&gt;
# Benutzt Du das neueste, offizielle SDK? Welche Version benutzt Du?&amp;lt;br/&amp;gt;(Es werden regelmäßig Bugfixes und Erweiterungen eingepflegt)&lt;br /&gt;
# Kannst Du die SDK-Beispiele (IoT,AT) entsprechend der offiziellen Anleitung kompilieren, flashen und läuft es?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://en.wikipedia.org/wiki/ESP8266 ESP8266-Eintrag auf en.wikipedia.org]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.esp8266.com/ ESP8266-Community-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://github.com/esp8266 ESP8266 Github mit Wiki und Source-Code-Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://hackaday.com/tag/esp8266/ Hackaday-Posts zu ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://espressif.com/en/products/esp8266/ ESP8266-Seite des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/ ESP8266-Forum des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller-elektronik.de/nodemcu-esp8266-tutorial-wlan-board-arduino-ide/ ESP8266 und NodeMCU - Tutorial mit Farbdisplay und Temperatursensor]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/348772 Topic neu im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240 Topic alt im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342878 Sammelbestellungen im mikrocontroller.net-Forum]&lt;br /&gt;
&lt;br /&gt;
[http://esp8266-server.de/ Universelle I2C-Steuerung mittels WLAN-TCP/IP und Webinterface mit ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://blog.thomasheldt.de/ Viele Projekte und Informationen zum ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/wlan_io/ Projekt I/O-Schnittstellenmodul mit WLAN] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/esp8266/ Dokumentation zum ESP8266 mit Arduino Code-Beispielen] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dokumente === &lt;br /&gt;
[http://neilkolban.com/tech/esp8266/ Kolban’s book on the ESP8266] Sehr empfehlenswert!&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Anleitung/HOWTO für das Setup der virtuellen Maschine (SDK) sowie für das Kompilieren]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://nurdspace.nl/ESP8266 Übersetztes Datenblatt]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/w/Wi07c AT Instructions Set (English)] und [http://www.electrodragon.com/w/Wi07c#First_time_use_guide Anleitung zum Betrieb an einem Arduino (inkl. Code)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://thomaspfeifer.net/esp8266_wlan_seriell_modul_at_kommandos.htm Beschreibung der AT-Kommandos mit Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/229016/Espressif_IoT_AT____v0.1.5.906.pdf Espressif AT Instruction Set(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/document/pdf/ESP8266%20Specifications(Chinese).pdf ESP8266 Specifications(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://nodemcu.readthedocs.org/en/dev/ NodeMCU-Documentation]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://cknodemcu.wordpress.com/2015/11/24/building-an-iot-node-for-less-than-15/ Building an IoT Node for less than 15$] (Paper, Kindle via Amazon)&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linux-Maschine mit eingerichtetem gcc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://onedrive.live.com/#cid=C4DDF72E6EEA3826&amp;amp;id=C4DDF72E6EEA3826%21631 Dateien (Xplorer+SDK+PDF+etc.)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/230185/esp8266_config_v050.exe Config-Tool] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen ===&lt;br /&gt;
[http://espressif.com/en/company/contact/buy-a-sample/ Offizieller Espressif-Vertriebskanal] (Sample Purchase)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?SearchText=ESP8266 aliexpress.com] ~ 2€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.banggood.com/?zf=283997 banggood.com] ~ 3.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ebay.de/ Ebay]&lt;br /&gt;
ab 3€ inkl. Versand, Einzelstückpreis: ESP-01/02/03/04/05&amp;lt;br/&amp;gt;&lt;br /&gt;
(Suchbegriff: ESP8266, Option Artikelstandort: &amp;quot;Weltweit&amp;quot;)&amp;lt;br/&amp;gt;&lt;br /&gt;
(10 Stück ab 27 EUR inkl. Versand; Suchbegriff: 10pcs ESP8266)&amp;lt;br/&amp;gt;&lt;br /&gt;
ab 3.20€ inkl. Versand, Einzelstückpreis: ESP-07/08/09/11&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/?s=esp8266&amp;amp;post_type=product electrodragon.com] ~ 3.50€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.it-wns.de/themes/suche/index.php?suchekategorie=&amp;amp;sucheallgemein=esp8266 IT-WNS.de] (ESP-01/02/03/06/07/12E) je 3.99€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/depot/WiFi-Serial-Transceiver-Module-w-ESP8266-p-1994.html seeedstudio.com] ~ 5.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://shop.in-circuit.de/index.php?cPath=21 In-Circuit.de] ESP-ADC-DIL-Modul mit ESP8266EX 9.90€ Einzelpreis&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.watterott.com/index.php?page=search&amp;amp;desc=off&amp;amp;sdesc=off&amp;amp;keywords=ESP8266 watterott.com] ab ~ 4€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ramser-elektro.at/shop/module-sensoren-adapter-und-co/esp8266-esp12f-wlan-modul www.ramser-elektro.at] ESP12F mit 16mBit Flash ~ 4.90€ (ab 35€ Versandkostenfrei)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anderes==&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/ESP8266-CPCB PCB für Community-Modul (Vorschlag)]&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ ESP8266 - ESP12E mit Arduino IDE programmieren]&lt;br /&gt;
*[http://fkainka.de/esp8266-in-der-arduino-ide/ ESP8266 mit Arduino-IDE programmieren]&lt;br /&gt;
*[http://www.arduinesp.com Arduino-IDE-Integration (ab 1.6.x)]&lt;br /&gt;
*[https://cknodemcu.wordpress.com/ NodeMCU (Lua) Anwendungen]&lt;br /&gt;
*[http://www.mikrocontroller-elektronik.de/esp8266-chip-buecher-projekte-wlan-chip Interessante deutsche Bücher zum ESP8266]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--von [[axhieb]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;br /&gt;
[[Kategorie:Wlan]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95985</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95985"/>
		<updated>2017-04-22T17:26:10Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Meine falsche Angabe zum Datendurchsatz korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:ESP8266.jpg|thumb|300px|ESP8266, Funkmodul]]&lt;br /&gt;
Das [[ESP8266]] von dem Hersteller Espressif ist ein programmierbarer WLAN-SoC mit [[UART]]- und [[SPI]]-Schnittstelle. &#039;&#039;&#039;WLAN&#039;&#039;&#039;-Funkmodule mit ESP8266 sind ab 3€ verfügbar. Die UART-Schnitttstelle ermöglicht eine einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
Laut Hersteller &amp;lt;ref&amp;gt;[http://espressif.com/en/products/esp8266 &#039;&#039;Herstellerseite -  unter Details&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;. :&lt;br /&gt;
* 802.11 b/g/n&lt;br /&gt;
* Wi-Fi Direct (P2P), soft-AP&lt;br /&gt;
* Integrated TCP/IP protocol stack&lt;br /&gt;
* Integrated TR switch, balun, LNA, power amplifier and matching network&lt;br /&gt;
* Integrated PLLs, regulators, DCXO and power management units&lt;br /&gt;
* +19.5dBm output power in 802.11b mode&lt;br /&gt;
* Power down leakage current of &amp;lt;20µA (bei 2,5V, Flash-Chip nicht mit gerechnet)&lt;br /&gt;
* Integrated low power 32-bit CPU could be used as application processor&lt;br /&gt;
* SDIO 1.1/2.0, SPI, UART&lt;br /&gt;
* STBC, 1×1 MIMO, 2×1 MIMO&lt;br /&gt;
* A-MPDU &amp;amp; A-MSDU aggregation &amp;amp; 0.4ms guard interval&lt;br /&gt;
* Wake up and transmit packets in &amp;lt; 2ms&lt;br /&gt;
* Standby power consumption of &amp;lt; 1.0mW (DTIM3)&lt;br /&gt;
* VCC: 2,5...3,6V (Achtung: Eingänge sind &#039;&#039;&#039;NICHT 5V TOLERANT&#039;&#039;&#039;!)&lt;br /&gt;
Weiterhin:&lt;br /&gt;
* GPIOs, ADC&lt;br /&gt;
&lt;br /&gt;
=== Datendurchsatz/Performanz ===&lt;br /&gt;
[https://www.mikrocontroller.net/topic/342240?page=single#3857630 Beitrag im Forum mit Tests: TCP: bis zu 7 MBit/s]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=7&amp;amp;t=24 Beitrag Espressif-Forum: UART loopback: 4.5 Mbps]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?t=2187 Beitrag Espressif-Forum: 300kbps senden und empfangen im TCP passt-hrough Modus]&amp;lt;br/&amp;gt;&lt;br /&gt;
200-300k Byte/s Senden und Empfangen via TCP und UDP mit C Programm und SDK 1.5.4 (User stefanus)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Bei Verwendung der AT-Firmware (v1.1.0.0 aus SDK 1.5.4) mit einem seriell angeschlossenen Mikrocontroller dauert die Antwort auf ein kurzes Kommando (vom PC an den µC und zurück) typischerweise 100-200ms.&lt;br /&gt;
&lt;br /&gt;
=== Power-/Sleep-Modes ===&lt;br /&gt;
Der Stromverbrauch des ESP8266 ist abhängig von vielen Faktoren, er lässt sich aber durch geschickte Programmierung durchaus deutlich senken.&amp;lt;br/&amp;gt;&lt;br /&gt;
So ist es nicht notwendig, dass das WIFI-Modem oder der Mikrocontroller ständig läuft, um z.B. eine WLAN-Türklingel zu realisieren. Im &amp;quot;Deep-Sleep&amp;quot; würde der ESP8266 dann nur wenige µA verbrauchen, bis er über einen Timer zurückgesetzt wird und die Meldung absetzt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=6&amp;amp;t=133 Detailierte Übersicht der verschieden Modi und deren Stromverbrauch von Espressif] (nicht mehr aktuell!)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WLAN-Module mit ESP8266 ==&lt;br /&gt;
Es existieren ca. 11 Varianten von chinesischen Herstellern. Beispielsweise mit PCB- oder Keramik-Antenne oder mit u.fl.&lt;br /&gt;
&lt;br /&gt;
* Die Firmware aus SDK 0.9.1 unterstützt bis zu vier gleichzeitige TCP- oder UDP-Verbindungen. &lt;br /&gt;
* Die Firmware aus SDK 1.5.4 unterstützt bis zu fünf gleichzeitige TCP- oder UDP-Verbindungen.&lt;br /&gt;
&lt;br /&gt;
Sie kann sich in vorhandene WLAN-Netze einbuchen, aber auch selbst Access-Point mit DHCP-Server sein. Der Access-Point ist zu Android kompatibel (mit 4.1.2 getestet).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Firmware enthält jedoch keinen Router. Mehrere Computer, die mit dem Modul als Access-Point verbunden sind, können keine Verbindung zueinander aufbauen. Das Feature nennt sich AP-Isolation.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#Produktbeschreibung: [[http://playground.boxtec.ch/doku.php/wireless/esp8266]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung einiger ESP8266-Module ===&lt;br /&gt;
====ESP8266-01====&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:ESP8266-PinBelegung1.jpg|Pinbelegung - Groß mit PCB-Antenne&lt;br /&gt;
Datei:ESP8266-PinBelegung2.jpg|Pinbelegung - Klein mit Keramik-Antenne&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Quelle &amp;lt;ref&amp;gt;[http://pan.baidu.com/share/link?shareid=727869034&amp;amp;uk=1900861665 &#039;&#039;Seller Information&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
====ESP8266-07====&lt;br /&gt;
Achtung, beim ESP8266-07-Modul sind einige mit vertauschten Beschriftungen von GPIO4 und GPIO5 unterwegs!!.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ESP8266-12E====&lt;br /&gt;
Das ESP12E-Modul gehört vermutlich wegen der vielen Ports zu den beliebtesten Modulen.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/?projekt-download=2967 Pinbelegung (PDF)]&lt;br /&gt;
Für dieses Modul gibt es auch ein spezielles Adapter-Projekt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Adapter-ESP12E.jpeg|miniatur|zentriert]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ Projekt: ESP-12E Adapter und ESP12E Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Möglichkeiten der Nutzung und Programmierung ==&lt;br /&gt;
===== Benutzung einer Firmware =====&lt;br /&gt;
Verschiedene Projekte betreiben die Entwicklung einer Firmware. Man kann die Firmware &amp;quot;einfach nur&amp;quot; flashen und benutzen oder sich auch aktiv an der Entwicklung beteiligen. Es gibt unter anderem folgende Projekte:&lt;br /&gt;
* AT-Befehle: Firmware, mit welcher das Modul über UART angesprochen wird.&lt;br /&gt;
* Micropython: Firmware, die das Ablaufen von Python-Scripts ermöglicht ([https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html Tutorial])&lt;br /&gt;
* NodeMCU: Firmware, die das Ablaufen von Lua-Scripts ermöglicht ([https://github.com/nodemcu/nodemcu-firmware Github])&lt;br /&gt;
* smartJS: Firmware, die das Ausführen von Javascript erlaubt ([https://github.com/cesanta/smart.js Github])&lt;br /&gt;
* Arduino core for ESP8266 WiFi chip: Programmierumgebung &amp;amp; Firmware, die das Ausführen von C-Programmen ermöglicht, im Stil der bekannten Arduino-Plattform. [https://github.com/esp8266/Arduino Github - ink. Anleitung]&lt;br /&gt;
* ESP8266 Basic: Firmware, die das Ausführen von Basic-Programmen und das Editieren über WLAN erlaubt [http://www.esp8266basic.com/]&lt;br /&gt;
* Sming: Einfach zu nutzendes Framework, ähnlich wie Arduino, allerdings mit einem einfachen Makefile pro Projekt und mit Eclipse-Projekten.([https://github.com/SmingHub/Sming Github])&lt;br /&gt;
* ESP-Lisp (BETA): A small fast lisp interpeter for a ESP8266 ([https://github.com/yesco/esp-lisp Github])&lt;br /&gt;
* ESP8266Forth:  Forth for the ESP8266 NodeMCU Amica ([https://github.com/CraigLindley/ESP8266Forth Github])&lt;br /&gt;
* Forthright: Forth for ESP-8266 ([https://github.com/niclash/forthright Github])&lt;br /&gt;
* Punyforth:  FORTH inspired programming language for the ESP8266 ([https://github.com/zeroflag/punyforth Github])&lt;br /&gt;
* ESP-LINK: Wifi-Serial Bridge w/REST&amp;amp;MQTT([https://github.com/jeelabs/esp-link Github])&lt;br /&gt;
&lt;br /&gt;
===== Erstellen (Kompilieren) einer Firmware =====&lt;br /&gt;
Für die Erstellung einer individuellen Firmware gibt es zwei Möglichkeiten:&lt;br /&gt;
* Software Development Kit (SDK): Erstellen einer Firmware mit einer GCC-Toolchain&lt;br /&gt;
* Arduino IDE: Erstellen einer Firmware mit einer Arduino-IDE&lt;br /&gt;
Projekte, die eine Firmware für das ESP8266 entwickeln (siehe vorheriger Abschnitt), benutzen eine dieser beiden Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== Firmware flashen/updaten ===&lt;br /&gt;
Typischerweise wird eine kompilierte Firmware per UART-Bootloader des ESP8266-SoC auf einen Flash-Chip eines ESP8266-Moduls geladen. Von dort startet der ESP8266-SoC anschließend die Firmware.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433 Flash-Download-Tool vom Hersteller] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/themadinventor/esptool Python-Tool zum Flashen (von Fredrik Ahlberg)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/3s1d/esp_prog Extension zum Tool von Fredrik Ahlberg] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=2#3857075 Tool zum Flashen (von Christian Klippel)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://web.archive.org/web/20150502082616/http://defcon-cc.dyndns.org/wiki/ESP8266#Update Anleitung, extern] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=3#3810559 Anleitung, Forum]&lt;br /&gt;
&lt;br /&gt;
Der Hersteller veröffentlicht regelmäßig [http://bbs.espressif.com/viewforum.php?f=5 Firmwareupdates] als Bestandteil des esp_iot_sdk. Die Firmware-Dateien befinden sich im Verzeichnis bin. Das Update wird beispielsweise für Firmware 0.9.5 folgendermaßen durchgeführt: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python esptool.py --baud 9600 --port com6 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Flashgröße muss man die Firmware ab Version 1.0.1 selbst compilieren. Siehe Diskussion [http://www.esp8266.com/viewtopic.php?p=16515 hier] und [http://bbs.espressif.com/viewtopic.php?f=16&amp;amp;t=400 hier].&lt;br /&gt;
&lt;br /&gt;
=== Nutzung ohne Firmware ===&lt;br /&gt;
Es ist wohl sogar möglich den ESP8266 als SDIO-WLAN-Modul an einem Raspberry Pi zu betreiben. Verwendet wird dabei der Linuxtreiber des ESP8089. Der ESP8266 bootet dann nicht die Firmware aus dem Flash sondern über SDIO.    &lt;br /&gt;
&lt;br /&gt;
https://hackaday.io/project/8678-rpi-wifi&lt;br /&gt;
&lt;br /&gt;
== AT-Befehle für eine Firmware auf Basis des SDK-Beispiels &amp;quot;AT&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als AP&lt;br /&gt;
&lt;br /&gt;
Da wir nicht wissen, in welchem Modus sich das Modul gerade befindet, fragen wir diesen mit dem &lt;br /&gt;
Befehl AT+CWMODE? ab. Das Modul antwortet mit &lt;br /&gt;
&lt;br /&gt;
    AT+CWMODE?&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;+CWMODE:1&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
In diesem Fall ist das Modul aktuell im Modus 1 (Station) eingestellt. Also ändern wir den Modus auf 2 (AP)&lt;br /&gt;
mit dem Befehl AT+CWMODE=2. Nach diesem Befehl ist ein Reset des Moduls erforderlich, damit die Änderung &lt;br /&gt;
sichtbar wird. Mit dem Befehl AT+RST führen wir diesen durch. Das Modul startet neu und die Stromaufnahme&lt;br /&gt;
steigt auf ca 80 mA. Das Modul ist jetzt als WLAN-AP im Wireless-LAN sichtbar. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir noch einstellen, dass wir mehrere Verbindungen gleichzeitig haben wollen, sowie den TCP-Server starten und einstellen. Mit dem Befehl AT+CIPMUX=1 sagen wir dem Modul, dass wir mehrere Verbindungen haben wollen. Und mit dem Befehl AT+CIPSERVER=1,2526 starten wir den TCP-Server und lassen ihn auf Port 2526 laufen. Sobald sich ein Client verbindet, sendet das Modul &#039;Link&#039; + LF + CR. Beim Trennen einer Verbindung vom Client kommt &#039;Unlink&#039; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir uns über einen TCP-Socket auf Port 2526 mit dem Modul verbinden und Daten austauschen. Empfangene Daten werden folgendermaßen angezeigt. Gesendet wurde  &amp;quot;Hallo Leute&amp;quot; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     +IPD,0,11:Hallo Leute&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+IPD kommt immer, 0 ist die erste Verbindung. Wenn 2 Geräte gleichzeitig eine Verbindung aufgebaut haben, steht dort eine 1. 11 Zeichen wurden empfangen, dann kommen die Daten.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten vom Modul zum Client geht man folgenderweise vor. Erstmal sagen wir dem Modul, wieviele Daten wir an welche Verbindung schicken wollen. Mit dem Befehl AT+CIPSEND=0,5 z. B. sagen wir dem Modul wir möchten 5 Bytes an Verbindung 0 senden. Nach diesem Befehl werden die nächsten 5 Zeichen direkt an die Verbindung weitergereicht.&lt;br /&gt;
Sollte keine aktive Verbindung bestehen, sendet das Modul &lt;br /&gt;
     AT+CIPSEND=0,5&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;link is not&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
ansonsten kommt &lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt; &amp;gt;&lt;br /&gt;
und man kann Daten senden. Nach dem Absenden der Daten &#039;Leute&#039; + LF + CR sendet das Modul &lt;br /&gt;
    Leute&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    SEND OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als Station&lt;br /&gt;
&lt;br /&gt;
== Software Development Kit (SDK) ==&lt;br /&gt;
Mit dem SDK können eigene Applikationen programmiert und die im SDK vorhandenen Beispiele &amp;quot;AT&amp;quot; und &amp;quot;IoT&amp;quot; verändert werden. Das SDK wird vom Hersteller zur Verfügung gestellt (Stand 25.10.2014). Passend zum SDK existiert eine virtuelle Maschine mit eingerichtetem gcc zum Kompilieren. Insbesondere der nun verfügbare gcc basiert auf einer Community-Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine + Anleitung/HOWTO für das Setup sowie für das Kompilieren]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Mit dem SDK wird der Mikrocontroller programmiert, der sich direkt auf dem ESP8266-SoC-Chip befindet. Dies ist nicht zu verwechseln mit Programmieranleitungen zur UART-Ansteuerung des ESP8266-SoC (meist mit AT-Firmware) mit einem anderen Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
==Checkliste bei Problemen mit dem Modul/Compiler/SDK==&lt;br /&gt;
Bitte berücksichtige bei der Frage nach Hilfestellung zu Deinem Problem die folgende Checkliste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit der AT-Firmware/UART-Ansteuerung mit Mikrocontroller&#039;&#039;&#039;&lt;br /&gt;
# Was nutzt Du für die Stromversorgung?&amp;lt;br/&amp;gt;(Ganz knapp benennen, so dass Rückschlüsse auf Spannung und Stromstärke möglich sind)&lt;br /&gt;
# Welche Firmware-Version verwendest Du und von woher hast Du sie?&lt;br /&gt;
# Welchen Mikrocontroller verwendest Du?&lt;br /&gt;
# Welche Baudrate verwendest Du?&lt;br /&gt;
# &amp;quot;Sieht&amp;quot; das Modul den AP, &amp;quot;sieht&amp;quot; der PC das Modul?&lt;br /&gt;
# Funktioniert ein Connect?&lt;br /&gt;
# Welche AT-Befehlssequenz verwendest Du und was antwortet das Modul?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit dem SDK/Compiler&#039;&#039;&#039;&lt;br /&gt;
# Benutzt Du die neuste, offizielle VM?&amp;lt;br/&amp;gt;(Diese ist ausgelegt für das neueste SDK)&lt;br /&gt;
# Benutzt Du das neueste, offizielle SDK? Welche Version benutzt Du?&amp;lt;br/&amp;gt;(Es werden regelmäßig Bugfixes und Erweiterungen eingepflegt)&lt;br /&gt;
# Kannst Du die SDK-Beispiele (IoT,AT) entsprechend der offiziellen Anleitung kompilieren, flashen und läuft es?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://en.wikipedia.org/wiki/ESP8266 ESP8266-Eintrag auf en.wikipedia.org]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.esp8266.com/ ESP8266-Community-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://github.com/esp8266 ESP8266 Github mit Wiki und Source-Code-Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://hackaday.com/tag/esp8266/ Hackaday-Posts zu ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://espressif.com/en/products/esp8266/ ESP8266-Seite des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/ ESP8266-Forum des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller-elektronik.de/nodemcu-esp8266-tutorial-wlan-board-arduino-ide/ ESP8266 und NodeMCU - Tutorial mit Farbdisplay und Temperatursensor]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/348772 Topic neu im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240 Topic alt im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342878 Sammelbestellungen im mikrocontroller.net-Forum]&lt;br /&gt;
&lt;br /&gt;
[http://esp8266-server.de/ Universelle I2C-Steuerung mittels WLAN-TCP/IP und Webinterface mit ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://blog.thomasheldt.de/ Viele Projekte und Informationen zum ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/wlan_io/ Projekt I/O-Schnittstellenmodul mit WLAN] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/esp8266/ Dokumentation zum ESP8266 mit Arduino Code-Beispielen] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dokumente === &lt;br /&gt;
[http://neilkolban.com/tech/esp8266/ Kolban’s book on the ESP8266] Sehr empfehlenswert!&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Anleitung/HOWTO für das Setup der virtuellen Maschine (SDK) sowie für das Kompilieren]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://nurdspace.nl/ESP8266 Übersetztes Datenblatt]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/w/Wi07c AT Instructions Set (English)] und [http://www.electrodragon.com/w/Wi07c#First_time_use_guide Anleitung zum Betrieb an einem Arduino (inkl. Code)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://thomaspfeifer.net/esp8266_wlan_seriell_modul_at_kommandos.htm Beschreibung der AT-Kommandos mit Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/229016/Espressif_IoT_AT____v0.1.5.906.pdf Espressif AT Instruction Set(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/document/pdf/ESP8266%20Specifications(Chinese).pdf ESP8266 Specifications(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://nodemcu.readthedocs.org/en/dev/ NodeMCU-Documentation]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://cknodemcu.wordpress.com/2015/11/24/building-an-iot-node-for-less-than-15/ Building an IoT Node for less than 15$] (Paper, Kindle via Amazon)&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linux-Maschine mit eingerichtetem gcc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://onedrive.live.com/#cid=C4DDF72E6EEA3826&amp;amp;id=C4DDF72E6EEA3826%21631 Dateien (Xplorer+SDK+PDF+etc.)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/230185/esp8266_config_v050.exe Config-Tool] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen ===&lt;br /&gt;
[http://espressif.com/en/company/contact/buy-a-sample/ Offizieller Espressif-Vertriebskanal] (Sample Purchase)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?SearchText=ESP8266 aliexpress.com] ~ 2€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.banggood.com/?zf=283997 banggood.com] ~ 3.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ebay.de/ Ebay]&lt;br /&gt;
ab 3€ inkl. Versand, Einzelstückpreis: ESP-01/02/03/04/05&amp;lt;br/&amp;gt;&lt;br /&gt;
(Suchbegriff: ESP8266, Option Artikelstandort: &amp;quot;Weltweit&amp;quot;)&amp;lt;br/&amp;gt;&lt;br /&gt;
(10 Stück ab 27 EUR inkl. Versand; Suchbegriff: 10pcs ESP8266)&amp;lt;br/&amp;gt;&lt;br /&gt;
ab 3.20€ inkl. Versand, Einzelstückpreis: ESP-07/08/09/11&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/?s=esp8266&amp;amp;post_type=product electrodragon.com] ~ 3.50€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.it-wns.de/themes/suche/index.php?suchekategorie=&amp;amp;sucheallgemein=esp8266 IT-WNS.de] (ESP-01/02/03/06/07/12E) je 3.99€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/depot/WiFi-Serial-Transceiver-Module-w-ESP8266-p-1994.html seeedstudio.com] ~ 5.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://shop.in-circuit.de/index.php?cPath=21 In-Circuit.de] ESP-ADC-DIL-Modul mit ESP8266EX 9.90€ Einzelpreis&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.watterott.com/index.php?page=search&amp;amp;desc=off&amp;amp;sdesc=off&amp;amp;keywords=ESP8266 watterott.com] ab ~ 4€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ramser-elektro.at/shop/module-sensoren-adapter-und-co/esp8266-esp12f-wlan-modul www.ramser-elektro.at] ESP12F mit 16mBit Flash ~ 4.90€ (ab 35€ Versandkostenfrei)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anderes==&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/ESP8266-CPCB PCB für Community-Modul (Vorschlag)]&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ ESP8266 - ESP12E mit Arduino IDE programmieren]&lt;br /&gt;
*[http://fkainka.de/esp8266-in-der-arduino-ide/ ESP8266 mit Arduino-IDE programmieren]&lt;br /&gt;
*[http://www.arduinesp.com Arduino-IDE-Integration (ab 1.6.x)]&lt;br /&gt;
*[https://cknodemcu.wordpress.com/ NodeMCU (Lua) Anwendungen]&lt;br /&gt;
*[http://www.mikrocontroller-elektronik.de/esp8266-chip-buecher-projekte-wlan-chip Interessante deutsche Bücher zum ESP8266]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--von [[axhieb]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;br /&gt;
[[Kategorie:Wlan]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95979</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95979"/>
		<updated>2017-04-22T16:16:01Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: Anzahl gleichzeitiger Verbindungen aktualisiert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:ESP8266.jpg|thumb|300px|ESP8266, Funkmodul]]&lt;br /&gt;
Das [[ESP8266]] von dem Hersteller Espressif ist ein programmierbarer WLAN-SoC mit [[UART]]- und [[SPI]]-Schnittstelle. &#039;&#039;&#039;WLAN&#039;&#039;&#039;-Funkmodule mit ESP8266 sind ab 3€ verfügbar. Die UART-Schnitttstelle ermöglicht eine einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
Laut Hersteller &amp;lt;ref&amp;gt;[http://espressif.com/en/products/esp8266 &#039;&#039;Herstellerseite -  unter Details&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;. :&lt;br /&gt;
* 802.11 b/g/n&lt;br /&gt;
* Wi-Fi Direct (P2P), soft-AP&lt;br /&gt;
* Integrated TCP/IP protocol stack&lt;br /&gt;
* Integrated TR switch, balun, LNA, power amplifier and matching network&lt;br /&gt;
* Integrated PLLs, regulators, DCXO and power management units&lt;br /&gt;
* +19.5dBm output power in 802.11b mode&lt;br /&gt;
* Power down leakage current of &amp;lt;20µA (bei 2,5V, Flash-Chip nicht mit gerechnet)&lt;br /&gt;
* Integrated low power 32-bit CPU could be used as application processor&lt;br /&gt;
* SDIO 1.1/2.0, SPI, UART&lt;br /&gt;
* STBC, 1×1 MIMO, 2×1 MIMO&lt;br /&gt;
* A-MPDU &amp;amp; A-MSDU aggregation &amp;amp; 0.4ms guard interval&lt;br /&gt;
* Wake up and transmit packets in &amp;lt; 2ms&lt;br /&gt;
* Standby power consumption of &amp;lt; 1.0mW (DTIM3)&lt;br /&gt;
* VCC: 2,5...3,6V (Achtung: Eingänge sind &#039;&#039;&#039;NICHT 5V TOLERANT&#039;&#039;&#039;!)&lt;br /&gt;
Weiterhin:&lt;br /&gt;
* GPIOs, ADC&lt;br /&gt;
&lt;br /&gt;
=== Datendurchsatz/Performanz ===&lt;br /&gt;
[https://www.mikrocontroller.net/topic/342240?page=single#3857630 Beitrag im Forum mit Tests: TCP: bis zu 7 MBit/s]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=7&amp;amp;t=24 Beitrag Espressif-Forum: UART loopback: 4.5 Mbps]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?t=2187 Beitrag Espressif-Forum: 3Mbps senden und empfangen] (Anmerkung von stefanus: diese Werte stimmen mit meinen Versuchen überein, SDK 1.5.4).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Bei Verwendung der AT-Firmware (v1.1.0.0 aus SDK 1.5.4) mit einem seriell angeschlossenen Mikrocontroller dauert die Antwort auf ein kurzes Kommando (vom PC an den µC und zurück) typischerweise 100-200ms.&lt;br /&gt;
&lt;br /&gt;
=== Power-/Sleep-Modes ===&lt;br /&gt;
Der Stromverbrauch des ESP8266 ist abhängig von vielen Faktoren, er lässt sich aber durch geschickte Programmierung durchaus deutlich senken.&amp;lt;br/&amp;gt;&lt;br /&gt;
So ist es nicht notwendig, dass das WIFI-Modem oder der Mikrocontroller ständig läuft, um z.B. eine WLAN-Türklingel zu realisieren. Im &amp;quot;Deep-Sleep&amp;quot; würde der ESP8266 dann nur wenige µA verbrauchen, bis er über einen Timer zurückgesetzt wird und die Meldung absetzt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=6&amp;amp;t=133 Detailierte Übersicht der verschieden Modi und deren Stromverbrauch von Espressif] (nicht mehr aktuell!)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WLAN-Module mit ESP8266 ==&lt;br /&gt;
Es existieren ca. 11 Varianten von chinesischen Herstellern. Beispielsweise mit PCB- oder Keramik-Antenne oder mit u.fl.&lt;br /&gt;
&lt;br /&gt;
* Die Firmware aus SDK 0.9.1 unterstützt bis zu vier gleichzeitige TCP- oder UDP-Verbindungen. &lt;br /&gt;
* Die Firmware aus SDK 1.5.4 unterstützt bis zu fünf gleichzeitige TCP- oder UDP-Verbindungen.&lt;br /&gt;
&lt;br /&gt;
Sie kann sich in vorhandene WLAN-Netze einbuchen, aber auch selbst Access-Point mit DHCP-Server sein. Der Access-Point ist zu Android kompatibel (mit 4.1.2 getestet).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Firmware enthält jedoch keinen Router. Mehrere Computer, die mit dem Modul als Access-Point verbunden sind, können keine Verbindung zueinander aufbauen. Das Feature nennt sich AP-Isolation.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#Produktbeschreibung: [[http://playground.boxtec.ch/doku.php/wireless/esp8266]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung einiger ESP8266-Module ===&lt;br /&gt;
====ESP8266-01====&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:ESP8266-PinBelegung1.jpg|Pinbelegung - Groß mit PCB-Antenne&lt;br /&gt;
Datei:ESP8266-PinBelegung2.jpg|Pinbelegung - Klein mit Keramik-Antenne&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Quelle &amp;lt;ref&amp;gt;[http://pan.baidu.com/share/link?shareid=727869034&amp;amp;uk=1900861665 &#039;&#039;Seller Information&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
====ESP8266-07====&lt;br /&gt;
Achtung, beim ESP8266-07-Modul sind einige mit vertauschten Beschriftungen von GPIO4 und GPIO5 unterwegs!!.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ESP8266-12E====&lt;br /&gt;
Das ESP12E-Modul gehört vermutlich wegen der vielen Ports zu den beliebtesten Modulen.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/?projekt-download=2967 Pinbelegung (PDF)]&lt;br /&gt;
Für dieses Modul gibt es auch ein spezielles Adapter-Projekt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Adapter-ESP12E.jpeg|miniatur|zentriert]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ Projekt: ESP-12E Adapter und ESP12E Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Möglichkeiten der Nutzung und Programmierung ==&lt;br /&gt;
===== Benutzung einer Firmware =====&lt;br /&gt;
Verschiedene Projekte betreiben die Entwicklung einer Firmware. Man kann die Firmware &amp;quot;einfach nur&amp;quot; flashen und benutzen oder sich auch aktiv an der Entwicklung beteiligen. Es gibt unter anderem folgende Projekte:&lt;br /&gt;
* AT-Befehle: Firmware, mit welcher das Modul über UART angesprochen wird.&lt;br /&gt;
* Micropython: Firmware, die das Ablaufen von Python-Scripts ermöglicht ([https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html Tutorial])&lt;br /&gt;
* NodeMCU: Firmware, die das Ablaufen von Lua-Scripts ermöglicht ([https://github.com/nodemcu/nodemcu-firmware Github])&lt;br /&gt;
* smartJS: Firmware, die das Ausführen von Javascript erlaubt ([https://github.com/cesanta/smart.js Github])&lt;br /&gt;
* Arduino core for ESP8266 WiFi chip: Programmierumgebung &amp;amp; Firmware, die das Ausführen von C-Programmen ermöglicht, im Stil der bekannten Arduino-Plattform. [https://github.com/esp8266/Arduino Github - ink. Anleitung]&lt;br /&gt;
* ESP8266 Basic: Firmware, die das Ausführen von Basic-Programmen und das Editieren über WLAN erlaubt [http://www.esp8266basic.com/]&lt;br /&gt;
* Sming: Einfach zu nutzendes Framework, ähnlich wie Arduino, allerdings mit einem einfachen Makefile pro Projekt und mit Eclipse-Projekten.([https://github.com/SmingHub/Sming Github])&lt;br /&gt;
* ESP-Lisp (BETA): A small fast lisp interpeter for a ESP8266 ([https://github.com/yesco/esp-lisp Github])&lt;br /&gt;
* ESP8266Forth:  Forth for the ESP8266 NodeMCU Amica ([https://github.com/CraigLindley/ESP8266Forth Github])&lt;br /&gt;
* Forthright: Forth for ESP-8266 ([https://github.com/niclash/forthright Github])&lt;br /&gt;
* Punyforth:  FORTH inspired programming language for the ESP8266 ([https://github.com/zeroflag/punyforth Github])&lt;br /&gt;
* ESP-LINK: Wifi-Serial Bridge w/REST&amp;amp;MQTT([https://github.com/jeelabs/esp-link Github])&lt;br /&gt;
&lt;br /&gt;
===== Erstellen (Kompilieren) einer Firmware =====&lt;br /&gt;
Für die Erstellung einer individuellen Firmware gibt es zwei Möglichkeiten:&lt;br /&gt;
* Software Development Kit (SDK): Erstellen einer Firmware mit einer GCC-Toolchain&lt;br /&gt;
* Arduino IDE: Erstellen einer Firmware mit einer Arduino-IDE&lt;br /&gt;
Projekte, die eine Firmware für das ESP8266 entwickeln (siehe vorheriger Abschnitt), benutzen eine dieser beiden Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== Firmware flashen/updaten ===&lt;br /&gt;
Typischerweise wird eine kompilierte Firmware per UART-Bootloader des ESP8266-SoC auf einen Flash-Chip eines ESP8266-Moduls geladen. Von dort startet der ESP8266-SoC anschließend die Firmware.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433 Flash-Download-Tool vom Hersteller] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/themadinventor/esptool Python-Tool zum Flashen (von Fredrik Ahlberg)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/3s1d/esp_prog Extension zum Tool von Fredrik Ahlberg] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=2#3857075 Tool zum Flashen (von Christian Klippel)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://web.archive.org/web/20150502082616/http://defcon-cc.dyndns.org/wiki/ESP8266#Update Anleitung, extern] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=3#3810559 Anleitung, Forum]&lt;br /&gt;
&lt;br /&gt;
Der Hersteller veröffentlicht regelmäßig [http://bbs.espressif.com/viewforum.php?f=5 Firmwareupdates] als Bestandteil des esp_iot_sdk. Die Firmware-Dateien befinden sich im Verzeichnis bin. Das Update wird beispielsweise für Firmware 0.9.5 folgendermaßen durchgeführt: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python esptool.py --baud 9600 --port com6 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Flashgröße muss man die Firmware ab Version 1.0.1 selbst compilieren. Siehe Diskussion [http://www.esp8266.com/viewtopic.php?p=16515 hier] und [http://bbs.espressif.com/viewtopic.php?f=16&amp;amp;t=400 hier].&lt;br /&gt;
&lt;br /&gt;
=== Nutzung ohne Firmware ===&lt;br /&gt;
Es ist wohl sogar möglich den ESP8266 als SDIO-WLAN-Modul an einem Raspberry Pi zu betreiben. Verwendet wird dabei der Linuxtreiber des ESP8089. Der ESP8266 bootet dann nicht die Firmware aus dem Flash sondern über SDIO.    &lt;br /&gt;
&lt;br /&gt;
https://hackaday.io/project/8678-rpi-wifi&lt;br /&gt;
&lt;br /&gt;
== AT-Befehle für eine Firmware auf Basis des SDK-Beispiels &amp;quot;AT&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als AP&lt;br /&gt;
&lt;br /&gt;
Da wir nicht wissen, in welchem Modus sich das Modul gerade befindet, fragen wir diesen mit dem &lt;br /&gt;
Befehl AT+CWMODE? ab. Das Modul antwortet mit &lt;br /&gt;
&lt;br /&gt;
    AT+CWMODE?&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;+CWMODE:1&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
In diesem Fall ist das Modul aktuell im Modus 1 (Station) eingestellt. Also ändern wir den Modus auf 2 (AP)&lt;br /&gt;
mit dem Befehl AT+CWMODE=2. Nach diesem Befehl ist ein Reset des Moduls erforderlich, damit die Änderung &lt;br /&gt;
sichtbar wird. Mit dem Befehl AT+RST führen wir diesen durch. Das Modul startet neu und die Stromaufnahme&lt;br /&gt;
steigt auf ca 80 mA. Das Modul ist jetzt als WLAN-AP im Wireless-LAN sichtbar. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir noch einstellen, dass wir mehrere Verbindungen gleichzeitig haben wollen, sowie den TCP-Server starten und einstellen. Mit dem Befehl AT+CIPMUX=1 sagen wir dem Modul, dass wir mehrere Verbindungen haben wollen. Und mit dem Befehl AT+CIPSERVER=1,2526 starten wir den TCP-Server und lassen ihn auf Port 2526 laufen. Sobald sich ein Client verbindet, sendet das Modul &#039;Link&#039; + LF + CR. Beim Trennen einer Verbindung vom Client kommt &#039;Unlink&#039; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir uns über einen TCP-Socket auf Port 2526 mit dem Modul verbinden und Daten austauschen. Empfangene Daten werden folgendermaßen angezeigt. Gesendet wurde  &amp;quot;Hallo Leute&amp;quot; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     +IPD,0,11:Hallo Leute&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+IPD kommt immer, 0 ist die erste Verbindung. Wenn 2 Geräte gleichzeitig eine Verbindung aufgebaut haben, steht dort eine 1. 11 Zeichen wurden empfangen, dann kommen die Daten.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten vom Modul zum Client geht man folgenderweise vor. Erstmal sagen wir dem Modul, wieviele Daten wir an welche Verbindung schicken wollen. Mit dem Befehl AT+CIPSEND=0,5 z. B. sagen wir dem Modul wir möchten 5 Bytes an Verbindung 0 senden. Nach diesem Befehl werden die nächsten 5 Zeichen direkt an die Verbindung weitergereicht.&lt;br /&gt;
Sollte keine aktive Verbindung bestehen, sendet das Modul &lt;br /&gt;
     AT+CIPSEND=0,5&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;link is not&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
ansonsten kommt &lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt; &amp;gt;&lt;br /&gt;
und man kann Daten senden. Nach dem Absenden der Daten &#039;Leute&#039; + LF + CR sendet das Modul &lt;br /&gt;
    Leute&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    SEND OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als Station&lt;br /&gt;
&lt;br /&gt;
== Software Development Kit (SDK) ==&lt;br /&gt;
Mit dem SDK können eigene Applikationen programmiert und die im SDK vorhandenen Beispiele &amp;quot;AT&amp;quot; und &amp;quot;IoT&amp;quot; verändert werden. Das SDK wird vom Hersteller zur Verfügung gestellt (Stand 25.10.2014). Passend zum SDK existiert eine virtuelle Maschine mit eingerichtetem gcc zum Kompilieren. Insbesondere der nun verfügbare gcc basiert auf einer Community-Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine + Anleitung/HOWTO für das Setup sowie für das Kompilieren]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Mit dem SDK wird der Mikrocontroller programmiert, der sich direkt auf dem ESP8266-SoC-Chip befindet. Dies ist nicht zu verwechseln mit Programmieranleitungen zur UART-Ansteuerung des ESP8266-SoC (meist mit AT-Firmware) mit einem anderen Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
==Checkliste bei Problemen mit dem Modul/Compiler/SDK==&lt;br /&gt;
Bitte berücksichtige bei der Frage nach Hilfestellung zu Deinem Problem die folgende Checkliste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit der AT-Firmware/UART-Ansteuerung mit Mikrocontroller&#039;&#039;&#039;&lt;br /&gt;
# Was nutzt Du für die Stromversorgung?&amp;lt;br/&amp;gt;(Ganz knapp benennen, so dass Rückschlüsse auf Spannung und Stromstärke möglich sind)&lt;br /&gt;
# Welche Firmware-Version verwendest Du und von woher hast Du sie?&lt;br /&gt;
# Welchen Mikrocontroller verwendest Du?&lt;br /&gt;
# Welche Baudrate verwendest Du?&lt;br /&gt;
# &amp;quot;Sieht&amp;quot; das Modul den AP, &amp;quot;sieht&amp;quot; der PC das Modul?&lt;br /&gt;
# Funktioniert ein Connect?&lt;br /&gt;
# Welche AT-Befehlssequenz verwendest Du und was antwortet das Modul?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit dem SDK/Compiler&#039;&#039;&#039;&lt;br /&gt;
# Benutzt Du die neuste, offizielle VM?&amp;lt;br/&amp;gt;(Diese ist ausgelegt für das neueste SDK)&lt;br /&gt;
# Benutzt Du das neueste, offizielle SDK? Welche Version benutzt Du?&amp;lt;br/&amp;gt;(Es werden regelmäßig Bugfixes und Erweiterungen eingepflegt)&lt;br /&gt;
# Kannst Du die SDK-Beispiele (IoT,AT) entsprechend der offiziellen Anleitung kompilieren, flashen und läuft es?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://en.wikipedia.org/wiki/ESP8266 ESP8266-Eintrag auf en.wikipedia.org]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.esp8266.com/ ESP8266-Community-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://github.com/esp8266 ESP8266 Github mit Wiki und Source-Code-Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://hackaday.com/tag/esp8266/ Hackaday-Posts zu ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://espressif.com/en/products/esp8266/ ESP8266-Seite des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/ ESP8266-Forum des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller-elektronik.de/nodemcu-esp8266-tutorial-wlan-board-arduino-ide/ ESP8266 und NodeMCU - Tutorial mit Farbdisplay und Temperatursensor]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/348772 Topic neu im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240 Topic alt im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342878 Sammelbestellungen im mikrocontroller.net-Forum]&lt;br /&gt;
&lt;br /&gt;
[http://esp8266-server.de/ Universelle I2C-Steuerung mittels WLAN-TCP/IP und Webinterface mit ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://blog.thomasheldt.de/ Viele Projekte und Informationen zum ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/wlan_io/ Projekt I/O-Schnittstellenmodul mit WLAN] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/esp8266/ Dokumentation zum ESP8266 mit Arduino Code-Beispielen] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dokumente === &lt;br /&gt;
[http://neilkolban.com/tech/esp8266/ Kolban’s book on the ESP8266] Sehr empfehlenswert!&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Anleitung/HOWTO für das Setup der virtuellen Maschine (SDK) sowie für das Kompilieren]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://nurdspace.nl/ESP8266 Übersetztes Datenblatt]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/w/Wi07c AT Instructions Set (English)] und [http://www.electrodragon.com/w/Wi07c#First_time_use_guide Anleitung zum Betrieb an einem Arduino (inkl. Code)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://thomaspfeifer.net/esp8266_wlan_seriell_modul_at_kommandos.htm Beschreibung der AT-Kommandos mit Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/229016/Espressif_IoT_AT____v0.1.5.906.pdf Espressif AT Instruction Set(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/document/pdf/ESP8266%20Specifications(Chinese).pdf ESP8266 Specifications(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://nodemcu.readthedocs.org/en/dev/ NodeMCU-Documentation]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://cknodemcu.wordpress.com/2015/11/24/building-an-iot-node-for-less-than-15/ Building an IoT Node for less than 15$] (Paper, Kindle via Amazon)&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linux-Maschine mit eingerichtetem gcc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://onedrive.live.com/#cid=C4DDF72E6EEA3826&amp;amp;id=C4DDF72E6EEA3826%21631 Dateien (Xplorer+SDK+PDF+etc.)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/230185/esp8266_config_v050.exe Config-Tool] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen ===&lt;br /&gt;
[http://espressif.com/en/company/contact/buy-a-sample/ Offizieller Espressif-Vertriebskanal] (Sample Purchase)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?SearchText=ESP8266 aliexpress.com] ~ 2€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.banggood.com/?zf=283997 banggood.com] ~ 3.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ebay.de/ Ebay]&lt;br /&gt;
ab 3€ inkl. Versand, Einzelstückpreis: ESP-01/02/03/04/05&amp;lt;br/&amp;gt;&lt;br /&gt;
(Suchbegriff: ESP8266, Option Artikelstandort: &amp;quot;Weltweit&amp;quot;)&amp;lt;br/&amp;gt;&lt;br /&gt;
(10 Stück ab 27 EUR inkl. Versand; Suchbegriff: 10pcs ESP8266)&amp;lt;br/&amp;gt;&lt;br /&gt;
ab 3.20€ inkl. Versand, Einzelstückpreis: ESP-07/08/09/11&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/?s=esp8266&amp;amp;post_type=product electrodragon.com] ~ 3.50€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.it-wns.de/themes/suche/index.php?suchekategorie=&amp;amp;sucheallgemein=esp8266 IT-WNS.de] (ESP-01/02/03/06/07/12E) je 3.99€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/depot/WiFi-Serial-Transceiver-Module-w-ESP8266-p-1994.html seeedstudio.com] ~ 5.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://shop.in-circuit.de/index.php?cPath=21 In-Circuit.de] ESP-ADC-DIL-Modul mit ESP8266EX 9.90€ Einzelpreis&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.watterott.com/index.php?page=search&amp;amp;desc=off&amp;amp;sdesc=off&amp;amp;keywords=ESP8266 watterott.com] ab ~ 4€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ramser-elektro.at/shop/module-sensoren-adapter-und-co/esp8266-esp12f-wlan-modul www.ramser-elektro.at] ESP12F mit 16mBit Flash ~ 4.90€ (ab 35€ Versandkostenfrei)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anderes==&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/ESP8266-CPCB PCB für Community-Modul (Vorschlag)]&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ ESP8266 - ESP12E mit Arduino IDE programmieren]&lt;br /&gt;
*[http://fkainka.de/esp8266-in-der-arduino-ide/ ESP8266 mit Arduino-IDE programmieren]&lt;br /&gt;
*[http://www.arduinesp.com Arduino-IDE-Integration (ab 1.6.x)]&lt;br /&gt;
*[https://cknodemcu.wordpress.com/ NodeMCU (Lua) Anwendungen]&lt;br /&gt;
*[http://www.mikrocontroller-elektronik.de/esp8266-chip-buecher-projekte-wlan-chip Interessante deutsche Bücher zum ESP8266]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--von [[axhieb]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;br /&gt;
[[Kategorie:Wlan]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95978</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=95978"/>
		<updated>2017-04-22T16:12:37Z</updated>

		<summary type="html">&lt;p&gt;Stefanus: &amp;quot;kurzes Kommando&amp;quot; genauer formuliert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:ESP8266.jpg|thumb|300px|ESP8266, Funkmodul]]&lt;br /&gt;
Das [[ESP8266]] von dem Hersteller Espressif ist ein programmierbarer WLAN-SoC mit [[UART]]- und [[SPI]]-Schnittstelle. &#039;&#039;&#039;WLAN&#039;&#039;&#039;-Funkmodule mit ESP8266 sind ab 3€ verfügbar. Die UART-Schnitttstelle ermöglicht eine einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
Laut Hersteller &amp;lt;ref&amp;gt;[http://espressif.com/en/products/esp8266 &#039;&#039;Herstellerseite -  unter Details&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;. :&lt;br /&gt;
* 802.11 b/g/n&lt;br /&gt;
* Wi-Fi Direct (P2P), soft-AP&lt;br /&gt;
* Integrated TCP/IP protocol stack&lt;br /&gt;
* Integrated TR switch, balun, LNA, power amplifier and matching network&lt;br /&gt;
* Integrated PLLs, regulators, DCXO and power management units&lt;br /&gt;
* +19.5dBm output power in 802.11b mode&lt;br /&gt;
* Power down leakage current of &amp;lt;20µA (bei 2,5V, Flash-Chip nicht mit gerechnet)&lt;br /&gt;
* Integrated low power 32-bit CPU could be used as application processor&lt;br /&gt;
* SDIO 1.1/2.0, SPI, UART&lt;br /&gt;
* STBC, 1×1 MIMO, 2×1 MIMO&lt;br /&gt;
* A-MPDU &amp;amp; A-MSDU aggregation &amp;amp; 0.4ms guard interval&lt;br /&gt;
* Wake up and transmit packets in &amp;lt; 2ms&lt;br /&gt;
* Standby power consumption of &amp;lt; 1.0mW (DTIM3)&lt;br /&gt;
* VCC: 2,5...3,6V (Achtung: Eingänge sind &#039;&#039;&#039;NICHT 5V TOLERANT&#039;&#039;&#039;!)&lt;br /&gt;
Weiterhin:&lt;br /&gt;
* GPIOs, ADC&lt;br /&gt;
&lt;br /&gt;
=== Datendurchsatz/Performanz ===&lt;br /&gt;
[https://www.mikrocontroller.net/topic/342240?page=single#3857630 Beitrag im Forum mit Tests: TCP: bis zu 7 MBit/s]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=7&amp;amp;t=24 Beitrag Espressif-Forum: UART loopback: 4.5 Mbps]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?t=2187 Beitrag Espressif-Forum: 3Mbps senden und empfangen] (Anmerkung von stefanus: diese Werte stimmen mit meinen Versuchen überein, SDK 1.5.4).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Bei Verwendung der AT-Firmware (v1.1.0.0 aus SDK 1.5.4) mit einem seriell angeschlossenen Mikrocontroller dauert die Antwort auf ein kurzes Kommando (vom PC an den µC und zurück) typischerweise 100-200ms.&lt;br /&gt;
&lt;br /&gt;
=== Power-/Sleep-Modes ===&lt;br /&gt;
Der Stromverbrauch des ESP8266 ist abhängig von vielen Faktoren, er lässt sich aber durch geschickte Programmierung durchaus deutlich senken.&amp;lt;br/&amp;gt;&lt;br /&gt;
So ist es nicht notwendig, dass das WIFI-Modem oder der Mikrocontroller ständig läuft, um z.B. eine WLAN-Türklingel zu realisieren. Im &amp;quot;Deep-Sleep&amp;quot; würde der ESP8266 dann nur wenige µA verbrauchen, bis er über einen Timer zurückgesetzt wird und die Meldung absetzt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=6&amp;amp;t=133 Detailierte Übersicht der verschieden Modi und deren Stromverbrauch von Espressif] (nicht mehr aktuell!)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WLAN-Module mit ESP8266 ==&lt;br /&gt;
Es existieren ca. 11 Varianten von chinesischen Herstellern. Beispielsweise mit PCB- oder Keramik-Antenne oder mit u.fl.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die Firmware 0.9.1 unterstützt bis zu vier gleichzeitige TCP- oder UDP-Verbindungen. Sie kann sich in vorhandene WLAN-Netze einbuchen, aber auch selbst Access-Point mit DHCP-Server sein. Der Access-Point ist zu Android kompatibel (mit 4.1.2 getestet).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Firmware enthält jedoch keinen Router. Mehrere Computer, die mit dem Modul als Access-Point verbunden sind, können keine Verbindung zueinander aufbauen. Das Feature nennt sich AP-Isolation.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#Produktbeschreibung: [[http://playground.boxtec.ch/doku.php/wireless/esp8266]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung einiger ESP8266-Module ===&lt;br /&gt;
====ESP8266-01====&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:ESP8266-PinBelegung1.jpg|Pinbelegung - Groß mit PCB-Antenne&lt;br /&gt;
Datei:ESP8266-PinBelegung2.jpg|Pinbelegung - Klein mit Keramik-Antenne&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Quelle &amp;lt;ref&amp;gt;[http://pan.baidu.com/share/link?shareid=727869034&amp;amp;uk=1900861665 &#039;&#039;Seller Information&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
====ESP8266-07====&lt;br /&gt;
Achtung, beim ESP8266-07-Modul sind einige mit vertauschten Beschriftungen von GPIO4 und GPIO5 unterwegs!!.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ESP8266-12E====&lt;br /&gt;
Das ESP12E-Modul gehört vermutlich wegen der vielen Ports zu den beliebtesten Modulen.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/?projekt-download=2967 Pinbelegung (PDF)]&lt;br /&gt;
Für dieses Modul gibt es auch ein spezielles Adapter-Projekt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Adapter-ESP12E.jpeg|miniatur|zentriert]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ Projekt: ESP-12E Adapter und ESP12E Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Möglichkeiten der Nutzung und Programmierung ==&lt;br /&gt;
===== Benutzung einer Firmware =====&lt;br /&gt;
Verschiedene Projekte betreiben die Entwicklung einer Firmware. Man kann die Firmware &amp;quot;einfach nur&amp;quot; flashen und benutzen oder sich auch aktiv an der Entwicklung beteiligen. Es gibt unter anderem folgende Projekte:&lt;br /&gt;
* AT-Befehle: Firmware, mit welcher das Modul über UART angesprochen wird.&lt;br /&gt;
* Micropython: Firmware, die das Ablaufen von Python-Scripts ermöglicht ([https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html Tutorial])&lt;br /&gt;
* NodeMCU: Firmware, die das Ablaufen von Lua-Scripts ermöglicht ([https://github.com/nodemcu/nodemcu-firmware Github])&lt;br /&gt;
* smartJS: Firmware, die das Ausführen von Javascript erlaubt ([https://github.com/cesanta/smart.js Github])&lt;br /&gt;
* Arduino core for ESP8266 WiFi chip: Programmierumgebung &amp;amp; Firmware, die das Ausführen von C-Programmen ermöglicht, im Stil der bekannten Arduino-Plattform. [https://github.com/esp8266/Arduino Github - ink. Anleitung]&lt;br /&gt;
* ESP8266 Basic: Firmware, die das Ausführen von Basic-Programmen und das Editieren über WLAN erlaubt [http://www.esp8266basic.com/]&lt;br /&gt;
* Sming: Einfach zu nutzendes Framework, ähnlich wie Arduino, allerdings mit einem einfachen Makefile pro Projekt und mit Eclipse-Projekten.([https://github.com/SmingHub/Sming Github])&lt;br /&gt;
* ESP-Lisp (BETA): A small fast lisp interpeter for a ESP8266 ([https://github.com/yesco/esp-lisp Github])&lt;br /&gt;
* ESP8266Forth:  Forth for the ESP8266 NodeMCU Amica ([https://github.com/CraigLindley/ESP8266Forth Github])&lt;br /&gt;
* Forthright: Forth for ESP-8266 ([https://github.com/niclash/forthright Github])&lt;br /&gt;
* Punyforth:  FORTH inspired programming language for the ESP8266 ([https://github.com/zeroflag/punyforth Github])&lt;br /&gt;
* ESP-LINK: Wifi-Serial Bridge w/REST&amp;amp;MQTT([https://github.com/jeelabs/esp-link Github])&lt;br /&gt;
&lt;br /&gt;
===== Erstellen (Kompilieren) einer Firmware =====&lt;br /&gt;
Für die Erstellung einer individuellen Firmware gibt es zwei Möglichkeiten:&lt;br /&gt;
* Software Development Kit (SDK): Erstellen einer Firmware mit einer GCC-Toolchain&lt;br /&gt;
* Arduino IDE: Erstellen einer Firmware mit einer Arduino-IDE&lt;br /&gt;
Projekte, die eine Firmware für das ESP8266 entwickeln (siehe vorheriger Abschnitt), benutzen eine dieser beiden Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== Firmware flashen/updaten ===&lt;br /&gt;
Typischerweise wird eine kompilierte Firmware per UART-Bootloader des ESP8266-SoC auf einen Flash-Chip eines ESP8266-Moduls geladen. Von dort startet der ESP8266-SoC anschließend die Firmware.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433 Flash-Download-Tool vom Hersteller] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/themadinventor/esptool Python-Tool zum Flashen (von Fredrik Ahlberg)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/3s1d/esp_prog Extension zum Tool von Fredrik Ahlberg] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=2#3857075 Tool zum Flashen (von Christian Klippel)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://web.archive.org/web/20150502082616/http://defcon-cc.dyndns.org/wiki/ESP8266#Update Anleitung, extern] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=3#3810559 Anleitung, Forum]&lt;br /&gt;
&lt;br /&gt;
Der Hersteller veröffentlicht regelmäßig [http://bbs.espressif.com/viewforum.php?f=5 Firmwareupdates] als Bestandteil des esp_iot_sdk. Die Firmware-Dateien befinden sich im Verzeichnis bin. Das Update wird beispielsweise für Firmware 0.9.5 folgendermaßen durchgeführt: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python esptool.py --baud 9600 --port com6 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Flashgröße muss man die Firmware ab Version 1.0.1 selbst compilieren. Siehe Diskussion [http://www.esp8266.com/viewtopic.php?p=16515 hier] und [http://bbs.espressif.com/viewtopic.php?f=16&amp;amp;t=400 hier].&lt;br /&gt;
&lt;br /&gt;
=== Nutzung ohne Firmware ===&lt;br /&gt;
Es ist wohl sogar möglich den ESP8266 als SDIO-WLAN-Modul an einem Raspberry Pi zu betreiben. Verwendet wird dabei der Linuxtreiber des ESP8089. Der ESP8266 bootet dann nicht die Firmware aus dem Flash sondern über SDIO.    &lt;br /&gt;
&lt;br /&gt;
https://hackaday.io/project/8678-rpi-wifi&lt;br /&gt;
&lt;br /&gt;
== AT-Befehle für eine Firmware auf Basis des SDK-Beispiels &amp;quot;AT&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als AP&lt;br /&gt;
&lt;br /&gt;
Da wir nicht wissen, in welchem Modus sich das Modul gerade befindet, fragen wir diesen mit dem &lt;br /&gt;
Befehl AT+CWMODE? ab. Das Modul antwortet mit &lt;br /&gt;
&lt;br /&gt;
    AT+CWMODE?&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;+CWMODE:1&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
In diesem Fall ist das Modul aktuell im Modus 1 (Station) eingestellt. Also ändern wir den Modus auf 2 (AP)&lt;br /&gt;
mit dem Befehl AT+CWMODE=2. Nach diesem Befehl ist ein Reset des Moduls erforderlich, damit die Änderung &lt;br /&gt;
sichtbar wird. Mit dem Befehl AT+RST führen wir diesen durch. Das Modul startet neu und die Stromaufnahme&lt;br /&gt;
steigt auf ca 80 mA. Das Modul ist jetzt als WLAN-AP im Wireless-LAN sichtbar. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir noch einstellen, dass wir mehrere Verbindungen gleichzeitig haben wollen, sowie den TCP-Server starten und einstellen. Mit dem Befehl AT+CIPMUX=1 sagen wir dem Modul, dass wir mehrere Verbindungen haben wollen. Und mit dem Befehl AT+CIPSERVER=1,2526 starten wir den TCP-Server und lassen ihn auf Port 2526 laufen. Sobald sich ein Client verbindet, sendet das Modul &#039;Link&#039; + LF + CR. Beim Trennen einer Verbindung vom Client kommt &#039;Unlink&#039; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir uns über einen TCP-Socket auf Port 2526 mit dem Modul verbinden und Daten austauschen. Empfangene Daten werden folgendermaßen angezeigt. Gesendet wurde  &amp;quot;Hallo Leute&amp;quot; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     +IPD,0,11:Hallo Leute&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+IPD kommt immer, 0 ist die erste Verbindung. Wenn 2 Geräte gleichzeitig eine Verbindung aufgebaut haben, steht dort eine 1. 11 Zeichen wurden empfangen, dann kommen die Daten.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten vom Modul zum Client geht man folgenderweise vor. Erstmal sagen wir dem Modul, wieviele Daten wir an welche Verbindung schicken wollen. Mit dem Befehl AT+CIPSEND=0,5 z. B. sagen wir dem Modul wir möchten 5 Bytes an Verbindung 0 senden. Nach diesem Befehl werden die nächsten 5 Zeichen direkt an die Verbindung weitergereicht.&lt;br /&gt;
Sollte keine aktive Verbindung bestehen, sendet das Modul &lt;br /&gt;
     AT+CIPSEND=0,5&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;link is not&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
ansonsten kommt &lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt; &amp;gt;&lt;br /&gt;
und man kann Daten senden. Nach dem Absenden der Daten &#039;Leute&#039; + LF + CR sendet das Modul &lt;br /&gt;
    Leute&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    SEND OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als Station&lt;br /&gt;
&lt;br /&gt;
== Software Development Kit (SDK) ==&lt;br /&gt;
Mit dem SDK können eigene Applikationen programmiert und die im SDK vorhandenen Beispiele &amp;quot;AT&amp;quot; und &amp;quot;IoT&amp;quot; verändert werden. Das SDK wird vom Hersteller zur Verfügung gestellt (Stand 25.10.2014). Passend zum SDK existiert eine virtuelle Maschine mit eingerichtetem gcc zum Kompilieren. Insbesondere der nun verfügbare gcc basiert auf einer Community-Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine + Anleitung/HOWTO für das Setup sowie für das Kompilieren]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Mit dem SDK wird der Mikrocontroller programmiert, der sich direkt auf dem ESP8266-SoC-Chip befindet. Dies ist nicht zu verwechseln mit Programmieranleitungen zur UART-Ansteuerung des ESP8266-SoC (meist mit AT-Firmware) mit einem anderen Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
==Checkliste bei Problemen mit dem Modul/Compiler/SDK==&lt;br /&gt;
Bitte berücksichtige bei der Frage nach Hilfestellung zu Deinem Problem die folgende Checkliste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit der AT-Firmware/UART-Ansteuerung mit Mikrocontroller&#039;&#039;&#039;&lt;br /&gt;
# Was nutzt Du für die Stromversorgung?&amp;lt;br/&amp;gt;(Ganz knapp benennen, so dass Rückschlüsse auf Spannung und Stromstärke möglich sind)&lt;br /&gt;
# Welche Firmware-Version verwendest Du und von woher hast Du sie?&lt;br /&gt;
# Welchen Mikrocontroller verwendest Du?&lt;br /&gt;
# Welche Baudrate verwendest Du?&lt;br /&gt;
# &amp;quot;Sieht&amp;quot; das Modul den AP, &amp;quot;sieht&amp;quot; der PC das Modul?&lt;br /&gt;
# Funktioniert ein Connect?&lt;br /&gt;
# Welche AT-Befehlssequenz verwendest Du und was antwortet das Modul?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit dem SDK/Compiler&#039;&#039;&#039;&lt;br /&gt;
# Benutzt Du die neuste, offizielle VM?&amp;lt;br/&amp;gt;(Diese ist ausgelegt für das neueste SDK)&lt;br /&gt;
# Benutzt Du das neueste, offizielle SDK? Welche Version benutzt Du?&amp;lt;br/&amp;gt;(Es werden regelmäßig Bugfixes und Erweiterungen eingepflegt)&lt;br /&gt;
# Kannst Du die SDK-Beispiele (IoT,AT) entsprechend der offiziellen Anleitung kompilieren, flashen und läuft es?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://en.wikipedia.org/wiki/ESP8266 ESP8266-Eintrag auf en.wikipedia.org]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.esp8266.com/ ESP8266-Community-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://github.com/esp8266 ESP8266 Github mit Wiki und Source-Code-Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://hackaday.com/tag/esp8266/ Hackaday-Posts zu ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://espressif.com/en/products/esp8266/ ESP8266-Seite des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/ ESP8266-Forum des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller-elektronik.de/nodemcu-esp8266-tutorial-wlan-board-arduino-ide/ ESP8266 und NodeMCU - Tutorial mit Farbdisplay und Temperatursensor]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/348772 Topic neu im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240 Topic alt im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342878 Sammelbestellungen im mikrocontroller.net-Forum]&lt;br /&gt;
&lt;br /&gt;
[http://esp8266-server.de/ Universelle I2C-Steuerung mittels WLAN-TCP/IP und Webinterface mit ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://blog.thomasheldt.de/ Viele Projekte und Informationen zum ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/wlan_io/ Projekt I/O-Schnittstellenmodul mit WLAN] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/esp8266/ Dokumentation zum ESP8266 mit Arduino Code-Beispielen] (Stefan Frings)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dokumente === &lt;br /&gt;
[http://neilkolban.com/tech/esp8266/ Kolban’s book on the ESP8266] Sehr empfehlenswert!&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Anleitung/HOWTO für das Setup der virtuellen Maschine (SDK) sowie für das Kompilieren]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://nurdspace.nl/ESP8266 Übersetztes Datenblatt]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/w/Wi07c AT Instructions Set (English)] und [http://www.electrodragon.com/w/Wi07c#First_time_use_guide Anleitung zum Betrieb an einem Arduino (inkl. Code)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://thomaspfeifer.net/esp8266_wlan_seriell_modul_at_kommandos.htm Beschreibung der AT-Kommandos mit Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/229016/Espressif_IoT_AT____v0.1.5.906.pdf Espressif AT Instruction Set(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/document/pdf/ESP8266%20Specifications(Chinese).pdf ESP8266 Specifications(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://nodemcu.readthedocs.org/en/dev/ NodeMCU-Documentation]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://cknodemcu.wordpress.com/2015/11/24/building-an-iot-node-for-less-than-15/ Building an IoT Node for less than 15$] (Paper, Kindle via Amazon)&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linux-Maschine mit eingerichtetem gcc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://onedrive.live.com/#cid=C4DDF72E6EEA3826&amp;amp;id=C4DDF72E6EEA3826%21631 Dateien (Xplorer+SDK+PDF+etc.)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/230185/esp8266_config_v050.exe Config-Tool] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen ===&lt;br /&gt;
[http://espressif.com/en/company/contact/buy-a-sample/ Offizieller Espressif-Vertriebskanal] (Sample Purchase)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?SearchText=ESP8266 aliexpress.com] ~ 2€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.banggood.com/?zf=283997 banggood.com] ~ 3.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ebay.de/ Ebay]&lt;br /&gt;
ab 3€ inkl. Versand, Einzelstückpreis: ESP-01/02/03/04/05&amp;lt;br/&amp;gt;&lt;br /&gt;
(Suchbegriff: ESP8266, Option Artikelstandort: &amp;quot;Weltweit&amp;quot;)&amp;lt;br/&amp;gt;&lt;br /&gt;
(10 Stück ab 27 EUR inkl. Versand; Suchbegriff: 10pcs ESP8266)&amp;lt;br/&amp;gt;&lt;br /&gt;
ab 3.20€ inkl. Versand, Einzelstückpreis: ESP-07/08/09/11&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/?s=esp8266&amp;amp;post_type=product electrodragon.com] ~ 3.50€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.it-wns.de/themes/suche/index.php?suchekategorie=&amp;amp;sucheallgemein=esp8266 IT-WNS.de] (ESP-01/02/03/06/07/12E) je 3.99€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/depot/WiFi-Serial-Transceiver-Module-w-ESP8266-p-1994.html seeedstudio.com] ~ 5.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://shop.in-circuit.de/index.php?cPath=21 In-Circuit.de] ESP-ADC-DIL-Modul mit ESP8266EX 9.90€ Einzelpreis&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.watterott.com/index.php?page=search&amp;amp;desc=off&amp;amp;sdesc=off&amp;amp;keywords=ESP8266 watterott.com] ab ~ 4€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ramser-elektro.at/shop/module-sensoren-adapter-und-co/esp8266-esp12f-wlan-modul www.ramser-elektro.at] ESP12F mit 16mBit Flash ~ 4.90€ (ab 35€ Versandkostenfrei)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anderes==&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/ESP8266-CPCB PCB für Community-Modul (Vorschlag)]&lt;br /&gt;
* [http://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/ ESP8266 - ESP12E mit Arduino IDE programmieren]&lt;br /&gt;
*[http://fkainka.de/esp8266-in-der-arduino-ide/ ESP8266 mit Arduino-IDE programmieren]&lt;br /&gt;
*[http://www.arduinesp.com Arduino-IDE-Integration (ab 1.6.x)]&lt;br /&gt;
*[https://cknodemcu.wordpress.com/ NodeMCU (Lua) Anwendungen]&lt;br /&gt;
*[http://www.mikrocontroller-elektronik.de/esp8266-chip-buecher-projekte-wlan-chip Interessante deutsche Bücher zum ESP8266]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--von [[axhieb]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;br /&gt;
[[Kategorie:Wlan]]&lt;/div&gt;</summary>
		<author><name>Stefanus</name></author>
	</entry>
</feed>