<?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=Quecksilber</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=Quecksilber"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Quecksilber"/>
	<updated>2026-04-11T13:08:25Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=L%C3%B6tkolben&amp;diff=79047</id>
		<title>Lötkolben</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=L%C3%B6tkolben&amp;diff=79047"/>
		<updated>2013-10-19T15:48:49Z</updated>

		<summary type="html">&lt;p&gt;Quecksilber: /* Lötnadeln (ca. 5 bis 10 Watt) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Löten]]&lt;br /&gt;
Der Lötkolben ist das zur manuellen Erstellung von Lötverbindungen vorwiegend benutzte Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Da im professionellen Bereich sowie unter erfahrenen Elektronikern das entsprechende Know-How sicher vorhanden ist, wendet sich diese Seite in erster Linie an Hobbyisten und andere Einsteiger, etwa solche, die als ehemalige &amp;quot;reine&amp;quot; Software-Entwickler nun im hardwarenahen Bereich ihre ersten Schritte mit Mikrocontroller-Aufbauten machen möchten.&lt;br /&gt;
&lt;br /&gt;
== Arten von Lötkolben ==&lt;br /&gt;
&lt;br /&gt;
Um elektronische Schaltungen erfolgreich aufzubauen, sollte man zunächst wissen, welche Arten von Lötkolben es gibt, und wozu sie geeignet sind.&lt;br /&gt;
&lt;br /&gt;
=== Lötnadeln (ca. 5 bis 10 Watt) ===&lt;br /&gt;
&lt;br /&gt;
Diese &amp;quot;Miniatur-Lötkolben&amp;quot; sind nur für feinste Arbeiten, bei denen man oft auch eine Lupe einsetzen wird, sinnvoll. Beispiele dafür sind:&lt;br /&gt;
* Anlöten extrem dünner Drähte, z. B. solche aus der &amp;quot;Wire-Wrap&amp;quot;-Wickeltechnik;&lt;br /&gt;
* Korrektur- und Nachlötungen bei beengten Verhältnissen, z. B. an SMD-Bauteilen;&lt;br /&gt;
* Reparatur schmaler Leiterbahnen mit einem Haarriss (oder vorsorgliches Verzinnen beim Verdacht auf einen solchen).&lt;br /&gt;
&lt;br /&gt;
Lötnadeln werden häufig mit Niederspannung versorgt (z. B. 12 Volt) und können daher mit Hilfe eines einstellbaren Netzteils auch mit etwas Unter- oder Übertemperatur betrieben werden. Generell sind sie aber eher ein Werkzeug für den &amp;quot;fortgeschrittenen&amp;quot; (Hobby-) Elektroniker und nicht so gut geeignet, um überhaupt erst einmal Übung im Löten zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Für den fortgeschrittenen Anwender mit einer guten Lötstation (Ersa i-Con, Weller PU81 oder vergleichbar) empfiehlt es sich nicht mehr, eine Lötnadel zu kaufen, die digital geregelten Lötkolben sind dem haushoch überlegen und haben auch die nötige Leistung, um an Platinen mit großen Masseflächen oder thermischer Abführung (klassisch: Mainboards) überhaupt noch löten zu können.&lt;br /&gt;
Durch die sehr guten Regelungen der aktuellen Digitalstationen und die kurzen Lötspitzen (z.B. Weller LC-Serie) ist auch der Wärmewiderstand zwischen Heizelement und Lötspitze kein Problem für kleine Löttargets, die trotzdem viel Wärme brauchen.&lt;br /&gt;
&lt;br /&gt;
=== Feinlötkolben (ca. 15 bis 20 Watt) ===&lt;br /&gt;
Diese kleinen, leichten Lötkolben kommen zum Einsatz, wenn es um die Bestückung von Platinen oder das An- und Ablöten dünner Drähte und Litzen geht. Lediglich für das Herstellen von Verbindungen, über die später stärkere Ströme (im Bereich einiger Ampere) fließen sollen, also z. B. zum Auflöten einer Litze höheren Querschnitts auf eine größere Kupferfläche sind sie etwas schwach. Für Anfänger, die wenig Geld ausgeben wollen, sind Feinlötkolben am ehesten zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
Auch diese Art von Lötkolben gibt es für Niederspannung. Man braucht dann zwar zum Betrieb ein entsprechendes Netzteil, kann dafür aber (bei einstellbarer Ausgangsspannung des Netzteils) die Leistung des Lötkolbens innerhalb gewisser Grenzen variieren.&lt;br /&gt;
&lt;br /&gt;
=== Elektronik-Universallötkolben (ca. 30 Watt) ===&lt;br /&gt;
Sie sind das &amp;quot;Standardwerkzeug&amp;quot; des Elektronikers, aber für alle, die hauptsächlich Schaltungsaufbauten im Bereich Mikrocontroller erstellen, fast schon unnötig groß. Ausgestattet mit unterschiedlichen Lötspitzen (siehe unten) sind Lötkolben dieser Klasse für viele Arbeiten geeignet, wenn auch meist etwas unhandlicher als Feinlötkolben.&lt;br /&gt;
&lt;br /&gt;
Auszunehmen sind lediglich die oben unter &amp;quot;Lötnadel&amp;quot; beschriebenen Arbeiten - es sei denn man hat wirklich großes Geschick und eine sehr ruhige Hand. Am anderen Ende der Skala denkbarer Arbeiten wird man sich allenfalls für das zügige An- und Ablöten sehr dicker Drähte oder Litzen auf/von massiven Metallteilen manchmal mehr Leistungsreserve wünschen, kommt in der Regel aber auch mit einem 30 Watt Lötkolben zum Erfolg.&lt;br /&gt;
&lt;br /&gt;
Da solche Lötkolben typischerweise an 230 Volt betrieben werden, erübrigt sich auch ein eigenes Netzteil (bzw. man kann die Spannung seines Labor-Netzteils stets für den Versuchsaufbau passend eingestellt lassen), auf der anderen Seite entfällt damit die Möglichkeit, die Leistung des Lötkolbens in einem gewissen Umfang zu variieren.&lt;br /&gt;
&lt;br /&gt;
=== Temperaturgeregelte Lötkolben (ca. 60 Watt) ===&lt;br /&gt;
&amp;quot;Mehr&amp;quot; ist nicht immer automatisch &amp;quot;besser&amp;quot;, und so ist eine höhere Leistung bei Lötkolben problematisch, weil der Lötkolben &amp;quot;im Leerlauf&amp;quot; oder bei kleineren Lötstellen zu heiß werden kann. Aus diesem Grund sollte man in der Leistungsklasse oberhalb 30 Watt besser gleich in einen temperaturgeregelten Lötkolben investieren. Zwar sind diese deutlich teurer als Lötkolben der ersten drei Kategorien, aber zerstörte Bauteile oder verdorbene Platinen verursachen auf Dauer noch höhere Kosten und sind auf jeden Fall ärgerlich.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil der Investition in einen solchen Lötkolben ist, dass sich damit auch schon mal kleinere Reparaturarbeiten außerhalb des Elektronikbereichs durchführen lassen (etwa Spielzeug etc.).&lt;br /&gt;
&lt;br /&gt;
Fuer den Einstieg reicht die &amp;quot;Analog 60&amp;quot; oder Weller &amp;quot;Temptronic&amp;quot; allemal:&lt;br /&gt;
&lt;br /&gt;
Analog 60&lt;br /&gt;
+ Betrieb direkt aus dem soliden Blechkoffer heraus &lt;br /&gt;
+ heisse Lötspitze mit Zange problemlos wechselbar (ein Handgriff)&lt;br /&gt;
- Regelung teilweise hörbar (leises Klacken)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weller Temptronic&lt;br /&gt;
+&lt;br /&gt;
- um eine heiße Loetspitze zu wechseln muss erst das Röhrchen vom Thermoelement entfernt werden und dann die Spitze. Vorsicht alles heiss&lt;br /&gt;
&lt;br /&gt;
siehe: http://www.mikrocontroller.net/forum/read-1-369049.html#new&lt;br /&gt;
&lt;br /&gt;
=== Große Lötkolben (über 60 Watt) ===&lt;br /&gt;
Diese sind in der Regel kein Werkzeug für den Elektroniker - es sei denn man denkt an das Verlöten von Metallgehäusen zur Abschirmung oder an das Löten von Akkus oder Solarzellen - und eher für allgemeine Reparaturen im Haushalt geeignet. Aber wenn man durch die Beschäftigung mit der Elektronik schon mal &amp;quot;das Löten gelernt hat&amp;quot;, will man diese Fähigkeiten vielleicht auch anderweitig einsetzen...ij&lt;br /&gt;
&lt;br /&gt;
== Arten von Lötspitzen ==&lt;br /&gt;
Bei den meisten Lötkolben kann die eigentliche Lötspitze ausgwechselt werden. Dies ist zum einen erforderlich, weil sich die Spitze im Lauf der Zeit abnutzt (was aber je nach Nutzungshäufigkeit des Lötkolbens und Materialqualität der Spitze Jahre dauern kann). Zum anderen wird man insbesondere bei stärkeren Lötkolben abhängig von der Arbeit, die man durchführen möchte, unterschiedlich geformte Spitzen benötigen. &lt;br /&gt;
&lt;br /&gt;
=== Kegelförmig ===&lt;br /&gt;
Leicht kegelförmige Spitzen, die vorne in einer Halbkugel (Durchmesser meist unter 1 mm) auslaufen, eignen sich besonders für &amp;quot;beengte Verhältnisse&amp;quot;, also nahe beieinander liegende Pins, geringen Leiterbahnabstand usw. Das Problem solcher Spitzen bei anderen Arbeiten ist, dass die Kontaktfläche zu den zu verlötenden Teilen recht gering ist. Da beim Löten - wie unter &amp;quot;[[Löten (praktisch)]]&amp;quot; ausgeführt - stets die zu verlötenden Teile und nicht das Lötzinn erwärmt werden sollte, kann das Herstellen größerer Lötverbindungen mit solchen Spitzen länger als nötig dauern. Die Folge können durch Hitze zerstörte Bauteile sein (wenn die Spitze so gehalten wurde, dass vor allem das Bauteil, nicht aber die Leiterbahn erwärmt wurde) oder sich ablösende Leiterbahnen (im umgekehrten Fall).&lt;br /&gt;
&lt;br /&gt;
=== Breit und Flach ===&lt;br /&gt;
Mit diesen, etwa nach der Art eines Schraubendrehers (aka. &amp;quot;Schraubenzieher&amp;quot; - aber nicht nach DIN! :-)) geformten Lötspitzen lässt sich je nach dem, wie man sie ansetzt, ein größerer oder kleinerer Kontakt zu den zu verlötenden Teilen herstellen. Unter beengten Verhältnissen ist aber, selbst wenn man sie &amp;quot;hochkant&amp;quot; hält, die Gefahr gegeben, Lötzinn an Stellen zu verschmieren, wo es nicht hingehört und z.&amp;amp;nbsp;B. zu einem Kurzschluss führt.&lt;br /&gt;
&lt;br /&gt;
=== Zylindrisch/Angeschrägt ===&lt;br /&gt;
Es ist sicher auch eine Geschmacks- und Übungssache, aber Spitzen, die eine zylindrische Grundform haben (Durchmesser etwa 1,5..2,5 mm) und vorne im Winkel von ca. 45 Grad angeschnitten sind, bieten eine überraschend große Bandbreite von Einsatzmöglichkeiten. Insbesondere für etwas &amp;quot;faule&amp;quot; und &amp;quot;ungeduldige&amp;quot; Naturen, die nicht dauernd zwischen den verschiedenen Lötspitzen ihres Lötkolbens wechseln wollen, sind solche Spitzen günstig. Aufgrund der Asymmetrie findet man ferner - etwas Übung vorausgesetzt - mit solchen Spitzen fast immer einen Ansatzpunkt, der es erlaubt, die beiden zu verlötenden Teile gleichmäßig schnell zu erwärmen. (Achtung: Gleichmäßig bedeutet hier vor allem, dass man ggf. das Teil mit der geringeren thermischen Masse, das sich also &#039;&#039;schneller&#039;&#039; erwärmen wird, auch nur mit der &#039;&#039;kleineren&#039;&#039; Fläche der Spitze in Kontakt bringen wird!)&lt;br /&gt;
&lt;br /&gt;
=== Abgewinkelt vs. Gerade ===&lt;br /&gt;
Auch hier mag Erfahrung, Übung und Geschick eine Rolle spielen, aber im Bereich der (Fein-) Elektronik werden meist gerade Spitzen bevorzugt. Insbesondere beim Löten auf gedruckten Schaltungen erlaubt die &amp;quot;bleistiftähnliche&amp;quot; Haltung eines Lötkolbens mit gerader Spitze eine präzisere Positionierung.&lt;br /&gt;
&lt;br /&gt;
=== Spezielle Spitzen ===&lt;br /&gt;
Für temperaturgeregelte Lötkolben gibt es als Sonderzubehör meist spezielle Lötspitzen zum Entlöten, z.&amp;amp;nbsp;B. solche, die sämtliche Pins eines ICs auf einmal erhitzen, oder Spitzen mit einer Bohrung im Inneren und einem aufgesetzten Gummiball, durch die man Lötzinn absaugen kann.&lt;br /&gt;
&lt;br /&gt;
== Noch etwas &amp;quot;Theorie&amp;quot; ==&lt;br /&gt;
An dieser Stelle noch einmal kurz zum Einfluss von Leistung und Temperatur auf das Lötergebnis.&lt;br /&gt;
&lt;br /&gt;
=== Einfluss der Leistung ===&lt;br /&gt;
Ein Lötkolben höherer Leistung ist vor allem dann angebracht, wenn größere Metallteile (z.&amp;amp;nbsp;B. großflächige Masse-Leiterbahnen) erwärmt werden müssen. Dass ein Lötkolben für eine bestimmte Arbeit &amp;quot;deutlich zu schwach&amp;quot; ist, merkt man daran, dass die Lötspitze nach dem ersten Aufsetzen kurz &amp;quot;anklebt&amp;quot;, weil die große kalte Fläche das an der Spitze des Lötkolbens hängende, geschmolzene Lötzinn wieder fest werden lässt.&lt;br /&gt;
&lt;br /&gt;
Bei ungeregelten Lötkolben wird hier zusätzlich die &amp;quot;thermische Masse&amp;quot; der Lötspitze ins Spiel kommen, d.h. mit einer massiven Spitze, die selbst sehr viel mehr Wärme speichert als die zu verlötenden Teile, wird sich dieser Effekt kaum einstellen, mit der dünnen Spitze einer sehr feinen Lötnadel schon eher. Bei einem Niederspannungslötkolben, den man über ein einstellbares Netzteil betreibt, kann man in diesem Fall über die Spannung die Leistung etwas erhöhen. Aber Achtung: Der Zusammenhang ist nicht linear, 10% mehr Spannung sind rund 21% mehr Leistung, 20% mehr Spannung rund 45% mehr Leistung(*1,*2).&lt;br /&gt;
&lt;br /&gt;
=== Einfluss der Temperatur ===&lt;br /&gt;
Bekanntlich vertragen Halbleiterbauteile es nicht, wenn sie zu heiß werden. Das gilt nicht nur für die Wärme, die sie im laufenden Betrieb selbst entwickeln, sondern auch für die Erhitzung ihrer Anschlussdrähte oder -pins beim Löten.&lt;br /&gt;
&lt;br /&gt;
Ein Fehlschluss wäre es nun aber anzunehmen, dass man durch eine geringere Temperatur des Lötkolbens dieser Gefahr vorbeugen könnte. Bis die über einen Draht oder Pin zugeführte Wärme das Innere des Bauteils erreicht (wo die hohe Temperatur ihre schädlichen Auswirkungen entfaltet), vergehen einige Sekunden. Braucht man aufgrund verringerter Temperatur nun für den gesamten Lötvorgang doppelt oder dreimal so lang, wird dies die Gefahr für das Halbleiterbauelement sogar erhöhen - ob die Lötspitze dann eine Temperatur 350 Grad oder &amp;quot;nur&amp;quot; 280 Grad hat, ändert nicht viel. Merke: Weniger die geringe Temperatur als ein zügiger Lötvorgang sollte das Ziel sein! (Allerdings wird sich bei zu hoher Temperatur das Flussmittel im Lötzinn möglicherweise verflüchtigen, ohne ausreichend Wirkung entfaltet zu haben!)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* 1: Wieviel Mehrleistung man dem Lötkolben zumuten darf, bevor er kaputt geht, ist schwer zu sagen. Der Autor dieser Zeilen verwendet seit über 30 Jahren für die meisten seiner Aufbauten einen Lötkolben von 12 Watt, der &amp;quot;offiziell&amp;quot; mit 6 Volt zu betreiben ist. Tatsächlich wird der Lötkolben aber je nach Bedarf mit 5, 6 oder 7 Volt betrieben, entsprechend einer Mehr- und Minderleistung von etwa 30%.&lt;br /&gt;
&lt;br /&gt;
* 2: Obacht bei solchen Rechnungen: Das Heizelement eines Lötkolbens dürfte einen erheblichen positiven Temperaturkoeffizienten haben, der den Einfluss der Betriebsspannung auf die Leistung deutlich reduziert.&lt;/div&gt;</summary>
		<author><name>Quecksilber</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32F10x_Standard_Peripherals_Library&amp;diff=63505</id>
		<title>STM32F10x Standard Peripherals Library</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32F10x_Standard_Peripherals_Library&amp;diff=63505"/>
		<updated>2012-01-23T10:13:15Z</updated>

		<summary type="html">&lt;p&gt;Quecksilber: /* Clocks - Der Herzschlag unseres Mikrocontroller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;STM32F10x Standard Peripherals Library&#039;&#039;  ist eine umfangreiche komfortable C-Bibliothek, die den Zugriff auf alle Funktionen der &#039;&#039;&#039;STM32F10x&#039;&#039;&#039; Familie erlaubt. Dabei ist für die verschiedenen Peripheriekomponenten jeweils ein eigenes Modul verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die Bibliothek kann hier bei ST kostenlos heruntergeladen werden [http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip download]. In dem Archiv ist die ‎STM32F10x Standard Peripherals Library. Zu jeder Peripherie gibt es diverse Beispiele und eine Beschreibung als CHM Datei &amp;quot;stm32f10x_stdperiph_lib_um.chm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bevor Ihr lange sucht, die USB-Schnittstelle ist nicht in der &#039;&#039;STM32F10x Standard Peripherals Library&#039;&#039; enthalten. Die hierfür verfügbare Firmware sowie Beispielcode befindet sich in der [[STM32_USB-FS-Device_Lib]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hinweise===&lt;br /&gt;
Die notwendigen Informationen, um die Funktionen der Standard Peripherals Library zu verstehen, muss man sich leider aus verschiedenen Quellen zusammensuchen. Daher soll mit diesem Artikel versucht werden, deren Benutzung für die verschiedenen Peripheriekomponenten zu erläutern.&lt;br /&gt;
&lt;br /&gt;
Leider beziehen sich die von ST gelieferten Beispiele sehr auf die von ST verfügbaren Evalboards und der Code wimmelt von #defines, so dass man sich erst mühsam durchhangeln muss um zu verstehen, was da eigentlich passiert. Dies geht zwar durch die gute Verlinkung in der Hilfsdatei ganz gut, erschwert aber den Einstieg unnötig. &lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll daher die Anwendung &#039;&#039;bare bones&#039;&#039; ähnlich den Beispielen in den AVR Datenblättern erfolgen.&lt;br /&gt;
Wo nötig, werden die zum Verständnis relevanten Ausschnitte des Reference Manual [http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00171190.pdf RM0008] in den Artikel kopiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;(Bevor hier die Copyright Discussion entbrennt: Das Landgericht München hat 1996 festgestellt, dass die Beschreibung von elektronischen Schaltungen nicht dem Urheberrecht unterliegen. Außerdem sollte ST sehr daran gelegen sein mehr Entwickler für Ihre µC zu begeistern.)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Dokumentationen ===&lt;br /&gt;
&lt;br /&gt;
Um mit der Library zu arbeiten sind folgende Dokumentationen empfehlenswert:&lt;br /&gt;
&lt;br /&gt;
* RM0008 Reference Manual zum STM32Fxxxx Controller&lt;br /&gt;
    Beschreibung und Registerdoku der Peripherie (GPIO, Timer ...)&lt;br /&gt;
* PM0056 STM32F10xxx Cortex-M3 programming manual&lt;br /&gt;
    Cortex-M3 eigene Peripherie (wichtig zb. NVIC)&lt;br /&gt;
* Datasheet des verwendeten µC Types (zb. STM32F103xC/D/E)&lt;br /&gt;
    Pinout des µC und alternative Verwendbarkeit der PINs&lt;br /&gt;
&lt;br /&gt;
Download from [[http://www.st.com/internet/mcu/class/1734.jsp Documents and files for STM32F family]]&lt;br /&gt;
&lt;br /&gt;
=== Die ST Standard Peripheral Lib in CrossWorks ===&lt;br /&gt;
Aufgrund mehrfacher Anfragen, hier ein Archiv, das meine Arbeitsumgebung [[Bild:CrossWorks_StandardLib_Setup.zip]] mit zwei Crossworks Projekten (ARM_LED_TEST und ARM_USB_Test) enthält. Einfach alles in ein Verzeichnis entpacken und schon sollte es Laufen.&lt;br /&gt;
&lt;br /&gt;
=== Einführungsbeispiel Blinking LED ===&lt;br /&gt;
&lt;br /&gt;
Einführungsbeispiel [[STM32 LEDBlinken AtollicTrueStudio]]&lt;br /&gt;
&lt;br /&gt;
=== Die Idee hinter der STM32 Standard Peripherals Library ===&lt;br /&gt;
&lt;br /&gt;
So stellt sich ARM und ST-Microelectronics die Library vor.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Stm32_std_peripherial_library_idee.JPG]]&lt;br /&gt;
&lt;br /&gt;
=Clocks - Der Herzschlag unseres Mikrocontrollers=&lt;br /&gt;
&lt;br /&gt;
[[Datei:stm32_aufbau.jpg|thumb|Interner Aufbau eines [[STM32F103]]]]&lt;br /&gt;
Unser Mikrocontroller hat viele interne Takte. Diese müssen unbedingt konfiguriert werden. Dazu verwenden wir die RCC (Reset and Clock Control). Dazu gibt es Funktionen in der ST-Library. Welche Takte an welchen Bussen liegen, siehst du im Bild.&lt;br /&gt;
&lt;br /&gt;
Die Controller verfügen über zwei getrennte Datenbusse für die langsameren Teile der Periphierie. Den APB1 und den APB2. Diese sind wiederum über Brücken am Systembus angeschlossen. Das wären in diesem Fall die AHB1 und AHB2. Man muss beachten, dass der APB1 &amp;quot;nur&amp;quot; mit maximal 36MHz getaktet werden darf, der APB2 hingegen mit 72MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig!&#039;&#039;&#039; Alle unsere Peripherie Teile, die wir verwenden möchten, &#039;&#039;&#039;müssen mit einem Takt versorgt werden,&#039;&#039;&#039; bevor man sie verwenden kann. Bei Nichtbeachten führt dies häufig zu langer Fehlersuche.&lt;br /&gt;
&lt;br /&gt;
Der [[STM32]] wird normalerweise mit einem Quarz von 4-16MHz versorgt. Aus diesem wird dann mittels der internen PLL der eigentliche Takt gebildet (bis 72MHz).&lt;br /&gt;
Jeder benötigte Takt wird vom Haupttakt abgeleitet. Die Controller verfügen auch über interne RC-Oszillatoren (typischerweise ein 8 MHz RC-Oszillator mit einer Genauigkeit von 1 % sowie einem 40 kHz RC-Oszillator). Zumindest der interne 8 MHz-Oszillator ist für die meisten Anwendungen genau genug. Für z.B. USB oder CAN mit Taktraten &amp;gt; 100 kbit/s ist er aber &#039;&#039;&#039;nicht&#039;&#039;&#039; genau genug. Der interne 40 kHz-Oszillator hingegen ist &#039;&#039;&#039;sehr&#039;&#039;&#039; ungenau (zwischen 30 und 60 kHz).&lt;br /&gt;
&lt;br /&gt;
Hardwaretechnisch sollte darauf geachtet werden, dass bei Verwendung eines externen Quarzes dieser eine Frequenz von 8 MHz besitzt. &lt;br /&gt;
Die gesamten Defines in der Library beziehen sich darauf. Ansonsten ist eine Anpassung der PLL Multiplikatoren in der Datei &amp;quot;system_stm32f10x.c&amp;quot; nötig.&lt;br /&gt;
&lt;br /&gt;
==Taktquelle auswählen==&lt;br /&gt;
&lt;br /&gt;
Nach dem Reset wird automatisch &#039;&#039;&#039;immer&#039;&#039;&#039; der interne HSI-Takt genutzt, um einen definierten Zustand zu haben (also der interne 8 MHz RC-Oszillator). Das ist z.B. erforderlich, damit der integrierte Bootloader mit einer bekannten Frequenz versorgt wird (sofern dieser über die Boot-Pins überhaupt gewünscht ist).&lt;br /&gt;
Zum Glück gibt es ein automatisches Sicherheitsfeature, sodass man die aktuelle Taktquelle des Controllers nicht abschalten kann, da der Controller sonst einfach stehen bleiben würde!&lt;br /&gt;
===HSI - Highspeed Internal Oscillator===&lt;br /&gt;
Man kann den internen Oszillator nach dem Reset umkonfigurieren. [Hier fehlt noch etwas]&lt;br /&gt;
&lt;br /&gt;
Zum Ein- und Ausschalten der HSI-Taktquelle verwendet man &#039;&#039;&#039;RCC_HSICmd()&#039;&#039;&#039;. Als Parameter werden entweder &#039;&#039;&#039;ENABLE&#039;&#039;&#039; oder &#039;&#039;&#039;DISABLE&#039;&#039;&#039; erwartet. &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
RCC_HSICmd(ENABLE); //Aktiviert den internen Highspeed Oszillator.&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Takte Reseten==&lt;br /&gt;
Nach dem Reset befindet sich die gesamte Taktkonfiguration in einem definierten Zustand. Macht man später irgendwelche Änderungen an der Taktkonfiguration kann es sinnvoll sein, vorher alle Takte auf ihre Standardwerte zurückzusetzen. Dies schafft wieder eine definierte zentrale Taktkonfiguration. Man muß sich nicht überlegen, wo man noch was zuvor eingestellt hat. Hat man allerdings schon z.B. irgendwelche Peripheriemodule konfiguriert, muß man natürlich aufpassen, welche Folgen die zentrale Taktänderung hier haben kann!&lt;br /&gt;
Nach &#039;&#039;&#039;RCC_DeInit()&#039;&#039;&#039; sind alle Takte resettet. Übergeben wird nichts!&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
RCC_DeInit(); //Setzt alle Takte auf deren Ursprungsszustand zurück.&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===HSE - Highspeed External Oscillator (Quarz)===&lt;br /&gt;
Es kann auch eine externe Taktquelle ausgewählt werden. Um dem Controller dies mitzuteilen, gibt es die Funktion &#039;&#039;&#039;RCC_HSEConfig()&#039;&#039;&#039;. Als Parameter erwartet sie einen der folgenden Werte: &#039;&#039;&#039;RCC_HSE_OFF&#039;&#039;&#039;, &#039;&#039;&#039;RCC_HSE_ON&#039;&#039;&#039; oder &#039;&#039;&#039;RCC_HSE_Bypass&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Ersten sind selbsterklärend. Wenn man der Funktion jedoch &#039;&#039;&#039;RCC_HSE_Bypass&#039;&#039;&#039; übergibt, so erwartet der Controller am OSC_IN Pin ein Taktsignal. Dieses darf bis zu 25MHz schnell sein und kann Rechteck, Sinus oder Dreieck Spannung mit einem Duty Cycle von 50% sein.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
RCC_HSEConfig(RCC_HSE_ON); //Aktiviert den Externen Highspeed Oszillator (Quarz).&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=GPIOS - Wie greife ich auf einzelne Pins zur Ein/Ausgabe zu=&lt;br /&gt;
===Grundlagen===&lt;br /&gt;
&lt;br /&gt;
Unser Mikrocontroller hat ja einige Beinchen, diese können wir als Eingänge sowie als Ausgänge verwenden.&lt;br /&gt;
Dazu müssen wir unserem Käfer jedoch erst sagen welcher Pin was machen soll. Wie dies geht wird hier beschrieben.&lt;br /&gt;
&lt;br /&gt;
Der STM32F10x verfügt zur Manipulation der IO-Pins über ein sehr raffiniertes Feature, das es erlaubt Bits für die IO-Pins zu setzen / löschen ohne vorher deren aktuellen Zustand auslesen zu müssen (üblicherweise Read-Modify-Write). Dadurch ist gewährleistet, dass beim Setzen/Löschen von Bits kein Interrupt dies stören kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Each of the general-purpose I/O ports has two 32-bit configuration registers (GPIOx_CRL, GPIOx_CRH), two 32-bit data registers (GPIOx_IDR, GPIOx_ODR), a 32-bit set/reset register (GPIOx_BSRR), a 16-bit reset register (GPIOx_BRR) and a 32-bit locking register (GPIOx_LCKR).&#039;&#039;&#039;&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;Each I/O port bit is freely programmable, however the I/O port registers have to be accessed as 32-bit words (half-word or byte accesses are not allowed). The purpose of the GPIOx_BSRR and GPIOx_BRR registers is to allow atomic read/modify accesses to any of the GPIO registers. This way, there is no risk that an IRQ occurs between the read and the modify access.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Auf die &#039;&#039;&#039;BRR&#039;&#039;&#039; und &#039;&#039;&#039;BSRR&#039;&#039;&#039; register greift man über die entsprechenden GPIO-Port zu.&lt;br /&gt;
&lt;br /&gt;
Hierzu existieren in &amp;lt;c&amp;gt;\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h&amp;lt;/c&amp;gt; folgende Definition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  __IO uint32_t CRL;&lt;br /&gt;
  __IO uint32_t CRH;&lt;br /&gt;
  __IO uint32_t IDR;&lt;br /&gt;
  __IO uint32_t ODR;&lt;br /&gt;
  __IO uint32_t BSRR;&lt;br /&gt;
  __IO uint32_t BRR;&lt;br /&gt;
  __IO uint32_t LCKR;&lt;br /&gt;
} GPIO_TypeDef;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pointer auf die entsprechenden GPIO-Ports sind hier ebenfalls definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)&lt;br /&gt;
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)&lt;br /&gt;
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)&lt;br /&gt;
#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)&lt;br /&gt;
#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)&lt;br /&gt;
#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)&lt;br /&gt;
#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Welche GPIO-Ports tatsächlich verfügbar sind ist abhängig vom verwendeten Controller!&lt;br /&gt;
&lt;br /&gt;
In stm32f10x_gpio.h sind darüber hinaus Definitionen für alle Pins vorhanden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!&amp;lt; Pin 0 selected */&lt;br /&gt;
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!&amp;lt; Pin 1 selected */&lt;br /&gt;
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!&amp;lt; Pin 2 selected */&lt;br /&gt;
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!&amp;lt; Pin 3 selected */&lt;br /&gt;
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!&amp;lt; Pin 4 selected */&lt;br /&gt;
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!&amp;lt; Pin 5 selected */&lt;br /&gt;
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!&amp;lt; Pin 6 selected */&lt;br /&gt;
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!&amp;lt; Pin 7 selected */&lt;br /&gt;
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!&amp;lt; Pin 8 selected */&lt;br /&gt;
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!&amp;lt; Pin 9 selected */&lt;br /&gt;
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!&amp;lt; Pin 10 selected */&lt;br /&gt;
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!&amp;lt; Pin 11 selected */&lt;br /&gt;
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!&amp;lt; Pin 12 selected */&lt;br /&gt;
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!&amp;lt; Pin 13 selected */&lt;br /&gt;
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!&amp;lt; Pin 14 selected */&lt;br /&gt;
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!&amp;lt; Pin 15 selected */&lt;br /&gt;
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!&amp;lt; All pins selected */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man also von Hand auf die Bits dieser Register zugreifen, so ist das denkbar einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 GPIOC-&amp;gt;BSRR = GPIO_Pin_13;   &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzt das Bit für Pin 13 im Port C. Das raffinierte daran ist, dass nur Bits, die im &#039;&#039;&#039;BRR&#039;&#039;&#039; gesetzt sind, auch im Port verändert werden. Nicht gesetzte Bits wirken sich auf den tatsächlich Portzustand nicht aus. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 GPIOC-&amp;gt;BRR = GPIO_Pin_13;   &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löscht das entprechende Bit wieder.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Standard Peripheral Library&#039;&#039; stellt für dies Zugriffe allerdings auch komfortable und vor allem sprechendere Funktionen zur verfügen, die weiter unten erklärt werden.&lt;br /&gt;
&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG: Bevor man Pins eines GPIO-Ports benutzen kann, muss man die Clock des entsprechenden Ports mit der Funktion &#039;&#039;RCC_APB2PeriphClockCmd&#039;&#039; aktivieren , da diese nach einem Reset immer ausgeschaltet ist. Dies ist ein sehr beliebter Fehler beim Arbeiten mit Ports. Mehr dazu bei [[STM32F10x Standard Peripherals Library#Clocks - Der Herzschlag unseres Mikrocontroller|Clocks]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bevor man einen Pin benutzen kann, muss dieser Initialisiert werden.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &#039;&#039;&#039;GPIO_Init()&#039;&#039;&#039; ermöglicht es einen oder mehere Pins auf einmal zu konfigurieren. Hierzu muss eine struct ausgefüllt und GPIO_Init übergeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  u16 GPIO_Pin;&lt;br /&gt;
  GPIOSpeed_TypeDef GPIO_Speed;&lt;br /&gt;
  GPIOMode_TypeDef GPIO_Mode;&lt;br /&gt;
}GPIO_InitTypeDef;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definieren müssen wird dieses zuvor jedoch auch. Dies geschieht mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
GPIO_InitTypeDef GPIO_InitStructure;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach können wir bequem auf die einzelnen Einträge aus der Struct zugreifen.&lt;br /&gt;
Der nachfolgende Code zeigt eine Beispielkonfiguration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&lt;br /&gt;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&lt;br /&gt;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;GPIO_Speed&#039;&#039;&#039; definiert die maximale Änderungsrate des Pins. Das ist aber keine harte Grenze, sondern verändert die Charakteristik des Pintreibers. Eine niedrigere Grenzfrequenz reduziert die Flankensteilheit und damit Leitungsreflexionen. &lt;br /&gt;
Mögliche Werte für GPIO_Speed&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039; Wert&#039;&#039;&#039; ||&#039;&#039;&#039; Bedeutung&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Speed_2MHz || 2MHz / 125ns&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Speed_10MHz || 10MHz / 25ns &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Speed_50MHz || 30-50MHz / 5-12ns&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;GPIO_Mode&#039;&#039;&#039; konfiguriert den Port oder den Port Pin.&lt;br /&gt;
Mögliche Werte für GPIO_Mode&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039; Wert&#039;&#039;&#039; ||&#039;&#039;&#039; Beschreibung&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_Out_PP || Der Pin wird als Ausgang im Push Pull Modus konfiguriert. Dies bedeutet, der Ausgang kann sowohl positive als auch negative Ströme liefern&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_Out_OD || Der Pin wird als Ausgang im Open Drain Modus konfiguriert.&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_IN_FLOATING || Der Pin wird als Eingang im Floating modus konfiguriert. Dies bedeutet, das der Pin kein Niveau hat. Er &amp;quot;schwebt&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_AIN || Der Pin wird als analoger Eingang konfiguriert&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_IPD || Der Pin wird als Eingang konfiguriert mit internem Pull Down Widerstand&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_IPU || Der Pin wird als Eingang konfiguriert mit internem Pull Up Widerstand&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_AF_OD || Der Pin wird mit Alternativer Funktion (SPI, I2C..) konfiguriert im Open Drain Modus&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_AF_PP || Der Pin wird mit Alternativer Funktion (SPI, I2C..) konfiguriert im Push Pull Modus&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GPIO_Pin&#039;&#039;&#039; definiert den Pin welcher konfiguriert werden soll.&lt;br /&gt;
&lt;br /&gt;
Um den zu konfigurierenden Pin anzugeben, genügt es &#039;&#039;&#039;GPIO_Pin_X&#039;&#039;&#039; zu schreiben.&lt;br /&gt;
Wobei &amp;quot;X&amp;quot; durch die entsprechende Pinnummer zu ersetzen ist.&lt;br /&gt;
&amp;lt;br&amp;gt;Es können auch mehrere Pins gleichzeitig Konfoguriert werden. &lt;br /&gt;
Dazu wird einfach logische ODER verknüfung verwendet ( | )&lt;br /&gt;
Möchte man den gesamten Port konfigurieren, so genügt es wenn man &#039;&#039;&#039;GPIO_Pin_All&#039;&#039;&#039; angibt.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit mehreren Pins&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&lt;br /&gt;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&lt;br /&gt;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GPIO_Init()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nachdem wir nun alle relevanten Parameter gesetzt haben, müssen wir den Port nur noch mit &#039;&#039;&#039;GPIO_Init()&#039;&#039;&#039; initialisieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;GPIOx&#039;&#039; ist der Pointer auf den den zu initialisierenden Port. Wobei x einfach mit dem entsprechenden Buchstaben zu ersetzen ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;GPIO_InitStruct&#039;&#039; ist der Pointer auf die soeben von uns ausgefüllte struct. &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für GPIOA&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Clock des Ports einschalten&lt;br /&gt;
&lt;br /&gt;
GPIO_InitTypeDef GPIO_InitStructure;&lt;br /&gt;
&lt;br /&gt;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&lt;br /&gt;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&lt;br /&gt;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7&lt;br /&gt;
&lt;br /&gt;
GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etwas auf den Port ausgeben===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um etwas an einem GPIO auszugeben, gibt es drei Möglichkeiten (Funktionen). &lt;br /&gt;
Entweder man schreibt den gesamten Port oder nur ein einzelnes Bit.&lt;br /&gt;
Die STMs bieten eine [[Bitbanding]]-Funktion, welche hier nicht genauer erklärt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktion 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erste Funktion lautet &#039;&#039;&#039;GPIO_SetBits()&#039;&#039;&#039; und &#039;&#039;&#039;GPIO_ResetBits()&#039;&#039;&#039;&lt;br /&gt;
Erster Parameter ist der GPIO Port, der zweite ist der Pin oder eine Kombination daraus. Kombinationen sind wieder logisch zu verknüpfen mit ODER ( | )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_5); //Setzt die Bits 1 und 5 am GPIOA auf high&lt;br /&gt;
&lt;br /&gt;
GPIO_ResetBits(GPIOA,GPIO_Pin_2 | GPIO_Pin_9); //Setzt die Bits 2 und 9 am GPIOA auf low&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktion 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die zweite Funktion lautet &#039;&#039;&#039;GPIO_WriteBit()&#039;&#039;&#039; Diese Funktion kann sowohl einen oder mehrere Pins setzen als auch löschen. Erster Parameter ist der GPIO Port, der zweite ist der Pin oder eine Kombination daraus, und der dritte sagt aus, ob gesetzt oder gelöscht wird! Kombinationen sind auch hier logisch zu verknüpfen mit ODER ( | ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_5, Bit_SET); //Setzt die Bits 1 und 5 am GPIOA auf high&lt;br /&gt;
&lt;br /&gt;
GPIO_WriteBit(GPIOA, GPIO_Pin_2 | GPIO_Pin_9, Bit_RESET); //Setzt die Bits 2 und 9 am GPIOA auf low&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktion 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die dritte und somit letzte Funktion lautet &#039;&#039;&#039;GPIO_Write()&#039;&#039;&#039;. Diese Funktion beschreibt den gesamten Port! Erster Parameter ist der GPIO Port, der zweite ist der an dem Port auszugebende Wert. &#039;&#039;&#039;Wichtig!&#039;&#039;&#039; Hier wird der ganze Port mit einem 16 bit Wert beschrieben. Viel leserlicher als mit magic numbers im Hex-Format zu arbeiten, sind natürlich auch hier die defines: GPIO_Pin_1 | GPIO_Pin_5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
GPIO_Write(GPIOA,0x0011); //Setzt die Bits 1 und 5 am GPIOA auf high&lt;br /&gt;
GPIO_Write(GPIOA, GPIO_Pin_1 | GPIO_Pin_5); // Geht natürlich auch und ist verständlicher                &lt;br /&gt;
&lt;br /&gt;
GPIO_ResetBits(GPIOA,0x0102); //Setzt die Bits 2 und 9 am GPIOA auf low&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Pin Sperren===&lt;br /&gt;
&lt;br /&gt;
Der [[STM32]] bietet die Möglichkeit, einen Pin zu sperren. Ist ein Pin gesperrt, so kann dessen Zustand (High / Low) &#039;&#039;&#039;bis zu einem Reset&#039;&#039;&#039; nicht mehr geändert werden! Wie wir es nun gewohnt sind, hat ST dafür eine eigene Funktion geschrieben. Diese lautet &#039;&#039;&#039;GPIO_PinLockConfig()&#039;&#039;&#039;. Erster Parameter ist der Port, der zweite sind die Pins, welche man sperren möchte. Diese kann man wieder mit der ODER Verknüpfung kombinieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
GPIO_PinLockConfig(GPIOA,GPIO_Pin_1 | GPIO_Pin_5); //Sperrt die Pins bis zu einem Reset&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eingänge einlesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten in den [[STM32]] einzulesen, gibt es wieder ein paar ST Funktionen. Diese möchten wir hier vorstellen. Die dafür verwendbaren Funktionen sind: &#039;&#039;&#039;GPIO_ReadInputDataBit()&#039;&#039;&#039; sowie &#039;&#039;&#039;GPIO_ReadInputData()&#039;&#039;&#039;. Erster Parameter ist der Port, der zweite sind die Pins, die man einlesen möchte. Bei &#039;&#039;&#039;GPIO_ReadInputData()&#039;&#039;&#039; wird jedoch nur der Port übergeben, da diese Funktion den &#039;&#039;&#039;gesamten&#039;&#039;&#039; Port zurück liefert! Hier wird der tatsächliche logische Pegel am Pin eingelesen!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint8_t ucStatus = 0;&lt;br /&gt;
&lt;br /&gt;
ucStatus = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5); //Speichert den Zustand von Pin5 am GPIOA in die 8-bit-Variable ucStatus &lt;br /&gt;
                                                    //(uint8_t ist die kleinstmögliche, eigenständige Variable für dieses eine Bit)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint16_t uiPort = 0;&lt;br /&gt;
&lt;br /&gt;
uiPort = GPIO_ReadInputData(GPIOA); //Speichert den Zustand von GPIOA in die 16-bit-Variable uiPort&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ausgänge einlesen===&lt;br /&gt;
&lt;br /&gt;
Man hat ja häufig das Problem, dass man gerne nachsehen möchte, was man denn gerade am Ausgang ausgibt. Dazu kann man den Ausgang wie ein Eingang einlesen. Die dafür verwendbaren Funktionen sind: &#039;&#039;&#039;GPIO_ReadOutputDataBit()&#039;&#039;&#039; sowie &#039;&#039;&#039;GPIO_ReadOutputData()&#039;&#039;&#039;. Erster Parameter ist der Port, der zweite sind die Pins, welche man auslesen möchte. Bei &#039;&#039;&#039;GPIO_ReadOutputData()&#039;&#039;&#039; wird jedoch nur der Port übergeben, da diese Funktion den &#039;&#039;&#039;gesamten&#039;&#039;&#039; Port zurück liefert!Hier wird &#039;&#039;&#039;nicht&#039;&#039;&#039; der tatsächliche logische Pegel am Pin eingelesen, sondern was im Ausgangsregister eingestellt wurde (also eigentlich anliegen sollte)! Diese beiden Werte können sich auf Grund externer Einflüsse aber unterscheiden!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint8_t ucStatus = 0;&lt;br /&gt;
&lt;br /&gt;
ucStatus = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5); //Speichert den Zustand von Pin5 am GPIOA in die 8-bit-Variable ucStatus &lt;br /&gt;
                                                     //(uint8_t ist die kleinstmögliche, eigenständige Variable für dieses eine Bit)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint16_t uiPort = 0;&lt;br /&gt;
&lt;br /&gt;
uiPort = GPIO_ReadOutputData(GPIOA); //Speichert den Zustand von GPIOA in die 16-bit-Variable uiPort&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Deinitialisieren von Ports===&lt;br /&gt;
&lt;br /&gt;
Es gibt auch die Möglichkeit, den Port zu deinitialisieren. Dann wird er mit seinen Standardwerten konfiguriert. Die Funktion dazu lautet &#039;&#039;&#039;GPIO_DeInit()&#039;&#039;&#039;. Erster und einziger Parameter ist der Port, den man deinitialisieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
GPIO_DeInit(GPIOA); //Setzt den GPIOA auf seine Standardwerte zurück&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities =&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/175840 Diskussion zum Artikel]&lt;br /&gt;
* [https://sourceforge.net/projects/libopenstm32/ libopenstm32] -- Eine Open-Source Alternative (GPL, Version 3 oder höher) zur ST Library&lt;br /&gt;
* Artikel [[STM32]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:STM32]]&lt;/div&gt;</summary>
		<author><name>Quecksilber</name></author>
	</entry>
</feed>