<?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=217.86.180.189</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=217.86.180.189"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/217.86.180.189"/>
	<updated>2026-04-11T03:15:56Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88240</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88240"/>
		<updated>2015-04-08T09:43:14Z</updated>

		<summary type="html">&lt;p&gt;217.86.180.189: Typos, format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0)&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Wellenformen (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite nur eine Wellenform haben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Scheregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Paltzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;/div&gt;</summary>
		<author><name>217.86.180.189</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Codebase_f%C3%BCr_LPC1xxx&amp;diff=88055</id>
		<title>Codebase für LPC1xxx</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Codebase_f%C3%BCr_LPC1xxx&amp;diff=88055"/>
		<updated>2015-03-23T15:19:34Z</updated>

		<summary type="html">&lt;p&gt;217.86.180.189: /* adcInit */ m1n0r typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Codebase für LPC11xx und LPC13xx ==&lt;br /&gt;
Für die Cortex-M0 und -M3 Familien existieren verschiedene Basispakete die als Startausstattung sehr gut geeignet sind. Auf microbuilder.eu findet man eine sehr interessante Version inklusive Dokumentation.&lt;br /&gt;
&lt;br /&gt;
Neben weiteren, interessanten Infos findet man dort eine Beta-Version 0.8 für den &#039;&#039;&#039;[http://www.microbuilder.eu/Projects/LPC1114ReferenceDesign/LPC1114CodeBase.aspx LPC1114]&#039;&#039;&#039; vom 14. April 2012 (auch wenn dort 2011 steht!) und eine Beta-Version 1.1.1 für den &#039;&#039;&#039;[http://www.microbuilder.eu/Projects/LPC1343ReferenceDesign/LPC1343CodeBase.aspx LPC1343]&#039;&#039;&#039; vom 14. April 2012.&lt;br /&gt;
&lt;br /&gt;
(Achtung: die aktuellste Version findet sich immer unter dem dort auch gezeigten &amp;quot;github&amp;quot;-Link)&lt;br /&gt;
&lt;br /&gt;
Die Original-Dokumentation kann auf der rechten Seite unter &amp;quot;Code Base/Documentation&amp;quot; angewählt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Funktionen die unter LPC1343 gesammelt werden auch für z.B. den LPC1313 eingesetzt werden, jedoch könnte das Ergebnis beim ansprechen von eigentlich nicht vorhandener Peripherie unvorhersehbar sein.&lt;br /&gt;
&lt;br /&gt;
Der hier folgende Text ist zum gegenwärtigen Zeitpunkt (Januar 2012) im Wesentlichen eine Übersetzung der Seite von microbilder.eu&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Informationen zum Aufbau der Code Base ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Dateien wird am Beispiel für den weiter fortgeschrittenen Stand zur LPC13xx Familie beschrieben, sollte aber weitgehend auch für den LPC1114 anwendbar sein. Die Beispiele der Code-Base beziehen sich auf ein Referenzboard von &amp;quot;microbuilder.eu&amp;quot; das &#039;&#039;&#039;[http://www.microbuilder.eu/projects/LPC1343ReferenceDesign.aspx hier]&#039;&#039;&#039; verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download des im Folgenden beschriebenen Code-Packages als github-Zip [https://github.com/microbuilder/LPC1343CodeBase/zipball/master hier]... immer als aktuellste Version &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ziel ist, auf dem aktuellen Stand aufzusetzen, bereits vorhandene Grundfunktionen zu erweitern und neue hinzuzufügen, Mitarbeit ist herzlich willkommen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Lizenz ===&lt;br /&gt;
&lt;br /&gt;
Der Author, microBuilder SARL, hat seine Libs unter eine &amp;quot;modifizierte BSD-Lizenz gestellt&amp;quot;, die Nutzung und Modifikation erlaubt, sofern der in jedem File enthaltene Paragraph zur&lt;br /&gt;
Lizenzbeschreibung erhalten bleibt. Details sind aus jedem beliebigen File der Code Base zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== Unterstütze Peripherieeinheiten ===&lt;br /&gt;
(Stand Januar 2012)&lt;br /&gt;
&lt;br /&gt;
* CPU  (vorerst nur auf 72MHz gesetzt)&lt;br /&gt;
* ADC  (Analog zu Digital Konverter)&lt;br /&gt;
* GPIO (Standard Eingänge und Ausgänge)&lt;br /&gt;
* I2C  (Generischer I2C Code, interrupt betrieben)&lt;br /&gt;
* PMU  (Power Management, Sleep-Modi)&lt;br /&gt;
* PWM  (Pulsweiten Modulation)&lt;br /&gt;
* SSP  (Generischer SSP/SPI Code)&lt;br /&gt;
* Systick (Verwendung des 24-bit Systick Timers)&lt;br /&gt;
* Timer16 (Die 16-bit Timer)&lt;br /&gt;
* Timer32 (Die 32-bit Timer)&lt;br /&gt;
* UART (UART code, interrupt betrieben)&lt;br /&gt;
* USBCDC (USB / Serial Port Emulation)&lt;br /&gt;
* USBHID-ROM (ROM-based USB HID)&lt;br /&gt;
* WDT (Watchdog Timer)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Enthaltene Treiber für externe HW ===&lt;br /&gt;
(Stand Januar 2012)&lt;br /&gt;
&lt;br /&gt;
* EEPROM/AT25040 (SPI EEPROM)&lt;br /&gt;
* EEPROM/MCP24AA (I2C EEPROM)&lt;br /&gt;
* SENSORS/LM75B (I2C Temp Sensor)&lt;br /&gt;
* CHIBI - Ein einfacher, Open Source Wireless Stack von Freaklabs für Sensorknoten. In diesem Beispiel für den AT86RF212 Transceiver (868MHz) konfiguriert.&lt;br /&gt;
* FATFS - Eine Portierung von Chan&#039;s FATFS das bereits FAT32, und einen einfachen MMC Treiber zum lesen von SDHC Karten beinhaltet&lt;br /&gt;
* ILI9325 - Treiber für einen auf ILI9325/ILI9328 Controller (8-bit Interface erforderlich) basierten 240x320 TFT LCD.&lt;br /&gt;
* ST7565 - Treiber für ein 128x64 pixel Bitmap Display&lt;br /&gt;
* SSD1306 - Treiber für ein 128x64 OLED Display (bit-banged SPI mode)&lt;br /&gt;
* TCS3414 - TAOS RGB Sensor&lt;br /&gt;
* ISL12022M - Temperaturkompensierter RTC &lt;br /&gt;
* TSL2561 - TAOS Beleuchtungssensor&lt;br /&gt;
* PN532 - 13.56MHz RFID/NFC Transceiver (im moment mit serh limitierter Funktionalität)&lt;br /&gt;
* STEPPER - Basis Treiber für einen Bipolar Schrittmotor mit L293D oder SN754410N&lt;br /&gt;
&lt;br /&gt;
== Struktur der Code Base ==&lt;br /&gt;
oder &amp;quot;wo finde ich was&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die LPC1343 Code Base hat - nach einiger Gewöhnungszeit - einen recht einfachen Aufbau:&lt;br /&gt;
* Alle bauteilespezifischen Informationen incl. der internen Peripherie befinden sich im Verzeichnis &amp;quot;core&amp;quot;.&lt;br /&gt;
* Treiber für externe HW ist im Verzeichnis &amp;quot;drivers&amp;quot;  zusammengefaßt.&lt;br /&gt;
* Die Files zur Projekt- und Systemkonfiguration befinden sich im Root-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
* Projektfiles für CodeLite (kostenlos) und Rowley Associates Crossworks (kommerziell) stehen im &amp;quot;build&amp;quot; Verzeichnis, und obwohl beide IDEs den gleichen Code verwenden können benutzen sie zum Compilieren nicht die gleiche Toolchain. &amp;quot;Crossworks for Arm&amp;quot; nutze eine eigene GCC Toolchain und einen eigenen Startup Code aber nicht das Makefile im Root-Verzeichnis. Mit CodeLite kann man auch ohne entsprechende Investitionen in HW und SW schon recht angenehm arbeiten&lt;br /&gt;
&lt;br /&gt;
=== LPC134x.h===&lt;br /&gt;
Um den Umgang mit der Code Base so einfach wie möglich zu machen wurde ein neues Header-File erzeugt. Obwohl bereits diverse Header-Files für den LPC1343 existieren war der Wunsch die sogenannten &amp;quot;magic-numbers&amp;quot; im Code zu eliminieren. Daher wurde ein &amp;quot;eigenes&amp;quot; erzeugt.&lt;br /&gt;
Die 134x.h Datei enthält daher für fast jedes Bit das gesetzt oder gelöscht werden kann auch eine entsprechende Definition. Es bedeutet natürlich einen großen Arbeitsaufwand all diese Informationen in ein Header-File zu pakcen, das Resultat ist jedoch ein einfach lesbarer Code, speziell wenn jemand Anderer ihn geschrieben hat.&lt;br /&gt;
&lt;br /&gt;
Was sind diese &amp;quot;Magic Numbers&amp;quot;?&lt;br /&gt;
Unter &amp;quot;Magic Numbers&amp;quot; versteht man hier den Zugriff auf ein Register ohne &amp;quot;define&amp;quot; also die direkte Angabe einer Zahl in beliebigem Format. Klar, die Eingabe ist kürzer und erzeugt den gleichen Code, aber welche Zeile ist wohl ein halbes Jahr später einfacher zu lesen??&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
UART_U0LCR = 0x83;&lt;br /&gt;
&lt;br /&gt;
UART_U0LCR = (UART_U0LCR_Word_Length_Select_8Chars |&lt;br /&gt;
              UART_U0LCR_Stop_Bit_Select_1Bits |&lt;br /&gt;
              UART_U0LCR_Parity_Disabled |&lt;br /&gt;
              UART_U0LCR_Break_Control_Disabled |&lt;br /&gt;
              UART_U0LCR_Divisor_Latch_Access_Enabled);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===projectconfig.h===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;projectconfig.h&amp;quot; enthält diverse Aufzählungen die innerhalb eines Projektes benutzt werden wie eine Übersicht über die verwendeten Pins, die CPU_Clock, die Zeit für den System-Tick, Baudraten, SSP, USB, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Core Peripherie (core/...)===&lt;br /&gt;
&lt;br /&gt;
Alle Funktionen zum initialisieren der internen Peripherie sowie ein kleines Beispiel ist im Verzeichnis &amp;quot;core&amp;quot; enthalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===External Hardware (drivers/...)===&lt;br /&gt;
&lt;br /&gt;
Jeden Code, der mit der externen Hardware irgendwie interagiert findet man im Verzeichnis &amp;quot;drivers&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Core/CPU==&lt;br /&gt;
&lt;br /&gt;
Die maximale Taktfrequenz des LPC1343 ist 72MHz.  Beim Start-Up ist automatisch die max. Taktfrequenz (72MHz), und ein externer Quarz mit 12MHz eingestellt.&lt;br /&gt;
(Der LPC13xx enthält auch einen internen 12MHz Oszillator, der aber nicht so genau wie ein externer Quarz sein kann. Für USB ist die Genauigkeit definitiv nicht ausreichend.)  &lt;br /&gt;
Um den Stromverbrauch zu minimieren werden alle Pins auf GPIO und &amp;quot;Eingang&amp;quot; gesetzt. Der interne Pull-Up Widerstand ist dabei immer in &amp;quot;pull up&amp;quot; Modus. Dies bedeutet, daß alle Pins nach dem Start der CPU auf &amp;quot;High&amp;quot; gesetzt sind.&lt;br /&gt;
Um diese Voreinstellungen zu ändern muß cpuInit entsprechend angepaßt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===cpuInit===&lt;br /&gt;
void cpuInit (void)&lt;br /&gt;
&lt;br /&gt;
Initialisiert die System-Taktfrequenz, auf max. Speed (12MHz x 6 = 72MHz)und benutzt einen externen Quarz als Taktquelle. Dies sollte die erste Funktion sein, die ausgeführt wird, da sich die CPU sonst nicht wie erwartet verhalten wird. Alle Pins sind auf GPIO mit aktiviertem internen Pull-up gesetzt.&lt;br /&gt;
&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt; &lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  cpuInit();&lt;br /&gt;
&lt;br /&gt;
  // Enter permanent loop&lt;br /&gt;
  while(1);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cpuGetDeviceID===&lt;br /&gt;
cpuDeviceID_t cpuGetDeviceID (void)&lt;br /&gt;
&lt;br /&gt;
Liest die CPU-ID aus&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
&lt;br /&gt;
cpuDeviceID_LPC1311, &lt;br /&gt;
cpuDeviceID_LPC1313, &lt;br /&gt;
cpuDeviceID_LPC1342, &lt;br /&gt;
cpuDeviceID_LPC1343 oder&lt;br /&gt;
cpuDeviceID_Unknown&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  cpuInit();&lt;br /&gt;
&lt;br /&gt;
  cpuDeviceID_t id = cpuGetDeviceID();&lt;br /&gt;
&lt;br /&gt;
  if (id == cpuDeviceID_LPC1343)&lt;br /&gt;
  {&lt;br /&gt;
    // Part is either LPC1343FBD48 or LPC1343FHN33&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Enter permanent loop&lt;br /&gt;
  while(1);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Core/ADC==&lt;br /&gt;
&lt;br /&gt;
Der LPC1343 enthält einen 8-Kanal, 10-Bit Analog/Digital Wandler (ADC), der zwischen 0 und 3,6V messen kann. (Achtung: Vcc - meist 3,3V - nicht überschreiten. Jeder Kanal kann separat, oder alle 8 Kanäle nacheinander im&lt;br /&gt;
&#039;Burst&#039; Mode gewandelt werden. Derzeit ist der &#039;Burst&#039; Mode nicht in SW umgesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===adcInit===&lt;br /&gt;
void adcInit (void)&lt;br /&gt;
&lt;br /&gt;
Initialisiert den A/D Konverter und konfiguriert die Kanäle 0..3 für 10-Bit.&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für adcRead&lt;br /&gt;
&lt;br /&gt;
===adcRead===&lt;br /&gt;
uint32_t adcRead (uint8_t channelNum)&lt;br /&gt;
&lt;br /&gt;
Diese Funktion startet eine AD-Wandlung für einen einzigen Kanal (0..7) und gibt das Ergebnis zurück (0..1023).&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * uint8_t channelNum: Der Kanal [0..7] der abgetastet werden soll&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
&lt;br /&gt;
0, wenn ein Überlauf entsteht, ansonsten ein 10-Bit Wert der das Ergebnis der Wandlung enthält. &lt;br /&gt;
&lt;br /&gt;
Warnung:&lt;br /&gt;
In adcInit werden nur die Kanäle 0..3 als AD-Wandler Input konfiguriert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt; &lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/adc/adc.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void main (void)&lt;br /&gt;
{&lt;br /&gt;
  cpuInit();&lt;br /&gt;
  adcInit();&lt;br /&gt;
&lt;br /&gt;
  uint32_t results = 0;  &lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // Get A/D conversion results from A/D channel 0&lt;br /&gt;
    results = adcRead(0);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Core/GPIO==&lt;br /&gt;
&lt;br /&gt;
GPIO (General Purpose Input/Output) bezeichnet einen digitalen Ein-/Ausgang (I/O). JederPin kann unabhängig von Anderen beliebig als Eingang oder als Ausgang konfiguriert werden. Zusätzlich kann jeder GPIO Pin am LPC13xx als externer Interrupt Eingang konfiguriert werden. Wenn sich ein Pegel an einem solchen Pin ändert wird. Zusätzlich besitzt jeder GPIO einen internen Widerstand, der sowohl als Pull-up, als Pull-down oder als Repeater  konfiguriert werden kann. Dieser interne Widerstand ist auch abschaltbar. Details hierzu bitte im Datenblatt nachschlagen. Dieser Widerstand sorgt nicht nur für eine Verringerung der erforderlichen Bauteile für so ein System, er erhöht außerdem die Flexibilität, erfordert aber auch mehr Sorgfalt bei der Pinkonfiguration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===gpioInit ===&lt;br /&gt;
void gpioInit (void)&lt;br /&gt;
&lt;br /&gt;
Initialisiert GPIO und schaltet den GPIO interrupt handler für alle GPIO Ports ein.&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für  gpioSetValue&lt;br /&gt;
&lt;br /&gt;
===gpioSetDir ===&lt;br /&gt;
void gpioSetDir (uint32_t portNum, uint32_t bitPos, gpioDirection_t dir)&lt;br /&gt;
&lt;br /&gt;
Setzt die Richtung (input/output) für einen bestimmten Port Pin.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: die gpio Port Nummer [0..3]&lt;br /&gt;
    * bitPos: die Bit Position für den gpio pin [0..11]&lt;br /&gt;
    * dir: die Pin Richtung (gpioDirection_Input or gpioDirection_Output)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für gpioSetValue&lt;br /&gt;
&lt;br /&gt;
===gpioSetValue ===&lt;br /&gt;
void gpioSetValue (uint32_t portNum, uint32_t bitPos, uint32_t bitVal)&lt;br /&gt;
&lt;br /&gt;
Setzt einen Wert für einen bestimmten Port Pin (nur relevant, wenn eder Pin als Ausgang konfiguriert wurde).&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: die gpio Port Nummer [0..3]&lt;br /&gt;
    * bitPos: die Bit Position für den gpio pin [0..11]&lt;br /&gt;
    * bitVal: Enthält den neuen Pegen high (1) oder low (0).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/gpio/gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  cpuInit();&lt;br /&gt;
  gpioInit();&lt;br /&gt;
&lt;br /&gt;
  // Set GPIO1.8 to output&lt;br /&gt;
  gpioSetDir(1, 8, gpioDirection_Output);&lt;br /&gt;
  // Disable the internal pullup/down resistor on P1.8&lt;br /&gt;
  gpioSetPullup(&amp;amp;IOCON_PIO1_8, gpioPullupMode_Inactive);&lt;br /&gt;
  // Set GPIO1.8 high&lt;br /&gt;
  gpioSetValue(1, 8, 1);&lt;br /&gt;
&lt;br /&gt;
  while(1);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===gpioGetValue===&lt;br /&gt;
uint32_t gpioGetValue (uint32_t portNum, uint32_t bitPos)&lt;br /&gt;
&lt;br /&gt;
Liest einen bestimmten Port Pin aus.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: die gpio Port Nummer [0..3]&lt;br /&gt;
    * bitPos: die Bit Position für den gpio pin [0..11]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
&lt;br /&gt;
1 wenn der Pin gerade high, oder 0 wenn der Pin gerade low ist.&lt;br /&gt;
Warnung:&lt;br /&gt;
&lt;br /&gt;
Alle GPIO Pins des LPC1343 haben interne Pull-up/Pull-down widerstände die beliebig konfiguriert werden können. By default, schaltet der LPC1343 nach dem Reset die pull-up Widerstände an den meisten Pins EIN. Hintergrund dieser Vorgehensweise ist, daß der Stromverbrauch geringer ist, wenn die Pins einen definierten Pegel haben, statt zu &amp;quot;floaten&amp;quot;. Dies hat jedoch den Nachteil, daß der zurückgelesene Pegel nicht unbedingt mit dem erwarteten Pegen zu tun haben muss. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/gpio/gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  cpuInit();&lt;br /&gt;
  gpioInit();&lt;br /&gt;
&lt;br /&gt;
  // Set GPIO1.8 to input&lt;br /&gt;
  gpioSetDir(1, 8, gpioDirection_Input);&lt;br /&gt;
  // Disable the internal pullup/down resistor on P1.8&lt;br /&gt;
  gpioSetPullup (&amp;amp;IOCON_PIO1_8, gpioPullupMode_Inactive);&lt;br /&gt;
&lt;br /&gt;
  uint32_t results = 0;&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // Read the current state of GPIO1.8 (1 = high, 0 = low)&lt;br /&gt;
    results = gpioGetValue(1, 8);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===gpioSetPullup ===&lt;br /&gt;
void gpioSetPullup (volatile uint32_t *ioconReg, gpioPullupMode_t mode)&lt;br /&gt;
&lt;br /&gt;
Alle GPIO Pins des LPC1343 haben interne Pull-up/Pull-down widerstände die beliebig konfiguriert werden können.  Diese Funktion kann dazu verwendet werden den Betriebsmodus der integrierten Widerstände auszufählen (inactive, pull-up, pull-down, or repeater)&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
* *ioconReg: Pointer auf das IOCON Register um den Pin zu wählen (zB. &#039;IOCON_PIO1_8&#039; für GPIO 1.8, &#039;IOCON_PIO2_2&#039; für GPIO 2.2, etc.). Achtung: Da dies ein Pointer ist, muß die Adresse (und nicht der Wert) des Registers übergeben werden. Dies wird erreicht in dem ein &#039;&amp;amp;&#039; vor das entsprechende IOCON Register gesetzt wird, z.B.: &#039;gpioSetPullup(&amp;amp;IOCON_PIO2_2, gpioPullupMode_Inactive);&#039;.&lt;br /&gt;
  * mode: Betriebsmodus des internen Widerstandes (gpioPullupMode_Inactive, gpioPullupMode_PullDown, gpioPullupMode_PullUp or gpioPullupMode_Repeater).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warnung:&lt;br /&gt;
Der LPC13xx setzt den Pull-up Widerstand direkt nach dem Reset automatisch. , &lt;br /&gt;
Um Schwierigkeiten zu vermeiden wird empfohlen alle Pins immer explizit zu definieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/gpio/gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  cpuInit();&lt;br /&gt;
  gpioInit();&lt;br /&gt;
&lt;br /&gt;
  // Set GPIO1.8, 1.9, 1.10 and 1.11 to input&lt;br /&gt;
  gpioSetDir(1, 8, gpioDirection_Input);&lt;br /&gt;
  gpioSetDir(1, 9, gpioDirection_Input);&lt;br /&gt;
  gpioSetDir(1, 10, gpioDirection_Input);&lt;br /&gt;
  gpioSetDir(1, 11, gpioDirection_Input);&lt;br /&gt;
&lt;br /&gt;
  // Enable the pull-down resistor on P1.8&lt;br /&gt;
  gpioSetPullup (&amp;amp;IOCON_PIO1_8, gpioPullupMode_PullDown);&lt;br /&gt;
  // Enable the pull-up resistor on P1.9&lt;br /&gt;
  gpioSetPullup (&amp;amp;IOCON_PIO1_9, gpioPullupMode_PullUp);&lt;br /&gt;
  // Disable the internal resistor resistor on P1.10&lt;br /&gt;
  gpioSetPullup (&amp;amp;IOCON_PIO1_10, gpioPullupMode_Inactive);&lt;br /&gt;
  // Set P1.11 to &#039;Repeater&#039; (remembers the last state explicitly set)&lt;br /&gt;
  gpioSetPullup (&amp;amp;IOCON_PIO1_11, gpioPullupMode_Repeater);&lt;br /&gt;
&lt;br /&gt;
  while(1);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===gpioSetInterrupt ===&lt;br /&gt;
void gpioSetInterrupt (uint32_t portNum, uint32_t bitPos, gpioInterruptSense_t sense, gpioInterruptEdge_t edge, gpioInterruptEvent_t event)&lt;br /&gt;
&lt;br /&gt;
Jeder GPIO Pin des LPC1343 kann als externe Interrupt Quelle definiert werden. Die Funktion gpioSetInterrupt erlaubt die Festlegung, welcher Pin als Interruptquelle fungieren soll, und spezifiziert die Randbedingungen, unter denen ein Interrupt ausgelöst wird(Pin geht von H==&amp;gt;L oder von L==&amp;gt;H, ...). Abhängig von der portNum, wird der Interrupt durch den  PIOINTx_IRQHandler gehandhabt , wobei &#039;x&#039; der Portnummer entspricht (PIOINT1_IRQHandler wird benutzt wenn der Interrupt z.B. an GPIO Pin 1.8, ausgelöst wird).&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: die gpio Port Nummer [0..3]&lt;br /&gt;
    * bitPos: die Bit Position für den gpio pin [0..11]&lt;br /&gt;
    * sense: Flanken, oder Level-sensitive(gpioInterruptSense_Edge oder gpioInterruptSense_Level).&lt;br /&gt;
    * edge: bei Flanke: Flanken-sensitive als Einfache Flanke (gpioInterruptEdge_Single) oder beide Flanken (gpioInterruptEdge_Double).&lt;br /&gt;
    * event: bei Level:, High oder Low Level (gpioInterruptEvent_ActiveHigh) (gpioInterruptEvent_ActiveLow). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/gpio/gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
    gpioInit();&lt;br /&gt;
&lt;br /&gt;
    // Set GPIO1.8 to input&lt;br /&gt;
    gpioSetDir(1, 8, gpioDirection_Input);&lt;br /&gt;
    // Disable the internal pullup/down resistor on P1.8&lt;br /&gt;
    gpioSetPullup (&amp;amp;IOCON_PIO1_8, gpioPullupMode_Inactive);&lt;br /&gt;
    // Setup an interrupt on GPIO1.8&lt;br /&gt;
    gpioSetInterrupt(1,                               // Port&lt;br /&gt;
                     8,                               // Pin&lt;br /&gt;
                     gpioInterruptSense_Edge,         // Edge Sensitive&lt;br /&gt;
                     gpioInterruptEdge_Single,        // Single Edge&lt;br /&gt;
                     gpioInterruptEvent_ActiveHigh);  // Active High&lt;br /&gt;
    // Enable the interrupt&lt;br /&gt;
    gpioIntEnable(1, 8);&lt;br /&gt;
&lt;br /&gt;
    while (1);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===gpioIntEnable ===&lt;br /&gt;
void gpioIntEnable (uint32_t portNum, uint32_t bitPos)&lt;br /&gt;
&lt;br /&gt;
Erlaubt einen Interrupt am spezifizierten GPIO-Pin.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: die gpio Port Nummer [0..3]&lt;br /&gt;
    * bitPos: die Bit Position für den gpio pin [0..11]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für gpioSetInterrupt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===gpioIntDisable ===&lt;br /&gt;
void gpioIntDisable (uint32_t portNum, uint32_t bitPos)&lt;br /&gt;
&lt;br /&gt;
Schaltet einen Interrupt am spezifizierten GPIO-Pin aus.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: die gpio Port Nummer [0..3]&lt;br /&gt;
    * bitPos: die Bit Position für den gpio pin [0..11]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für gpioSetInterrupt.&lt;br /&gt;
&lt;br /&gt;
===gpioIntClear===&lt;br /&gt;
void gpioIntClear (uint32_t portNum, uint32_t bitPos)&lt;br /&gt;
&lt;br /&gt;
Löscht den Interrupt am spezifizierten Pin. Diese Funktion sollte nur aus der Interrupt-Service Routine aufgerufen werden, wenn der Interrupt aufgetreten ist. &lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: die gpio Port Nummer [0..3]&lt;br /&gt;
    * bitPos: die Bit Position für den gpio pin [0..11]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// IRQ Handler for GPIO Port 1&lt;br /&gt;
void PIOINT1_IRQHandler(void)&lt;br /&gt;
{&lt;br /&gt;
  uint32_t regVal;&lt;br /&gt;
&lt;br /&gt;
  // Check if pin 1.8 raised the interrupt  &lt;br /&gt;
  regVal = gpioIntStatus(1, 8);&lt;br /&gt;
  if (regVal)&lt;br /&gt;
  {&lt;br /&gt;
    // Do Something&lt;br /&gt;
    ...&lt;br /&gt;
    // Clear the interrupt&lt;br /&gt;
    gpioIntClear(1, 8);&lt;br /&gt;
  }		&lt;br /&gt;
  return;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für for gpioSetInterrupt to configure an interrupt.&lt;br /&gt;
&lt;br /&gt;
===gpioIntStatus ===&lt;br /&gt;
uint32_t gpioIntStatus (uint32_t portNum, uint32_t bitPos)&lt;br /&gt;
&lt;br /&gt;
Liest den Interrupt Status des spezifizierten Port-Pins.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: die gpio Port Nummer [0..3]&lt;br /&gt;
    * bitPos: die Bit Position für den gpio pin [0..11]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
&lt;br /&gt;
&#039;1&#039; wenn ein Interrupt an diesem Pin aufgetreten ist ansonsten  &#039;0&#039;.&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für gpioIntClear.&lt;br /&gt;
&lt;br /&gt;
==Core/PMU==&lt;br /&gt;
&lt;br /&gt;
Konfiguriert die Power Management Unit (PMU) um den Sleep, Deep-sleep und Power-Down Modus.  Jeder GPIO Pin kann so konfiguriert werden, um den Prozessor aus dem Sleep Mode aufzuwecken, aber nur ein low-level an Pin 1.4 (WAKEUP) kann den LPC aus dem Power-Down aufwecken. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===pmuInit===&lt;br /&gt;
void pmuInit(void)&lt;br /&gt;
&lt;br /&gt;
Initialisiert die Power Management Unit und Konfiguriert Pin 0.1 so, da er als Wakeup-Quelle für Sleep oder Deep-Sleep Mode fungieren kann.&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes&lt;br /&gt;
Jeder GPIO Pin kann so konfiguriert werden, um den Prozessor aus dem Sleep Mode -- ausgelöst durch pmuSleep oder pmuDeepSleep-- aufzuwecken, aber nur ein low-level an Pin 1.4 (WAKEUP) kann den LPC aus dem Power-Down -- ausgelöst durch pmuPowerDown -- aufwecken. &lt;br /&gt;
&lt;br /&gt;
Im oment ist nur P0.1 als Wakeup Quelle konfiguriert, aber in pmuSleep besteht die Möglichkeit durch auskommentieren beliebige, andere Pins zu wählen, sofern auch die entsprechende GPIO Konfiguration passend gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für pmuSleep, pmuDeepSleep and pmuPowerDown.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===pmuSleep===&lt;br /&gt;
void pmuSleep(void)&lt;br /&gt;
&lt;br /&gt;
Diese Function versetzt den LPC in den Sleep Mode. Jeder GPIO-Pin kann verwendet werden um den LPC wieder aufzuwecken, der Pin muß entsprechend in pmuInit konfiguriert werden.&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/pmu/pmu.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
&lt;br /&gt;
    // Configure wakeup sources before going into sleep/deep-sleep.&lt;br /&gt;
    // By default, pin 0.1 is configured as wakeup source (falling edge)&lt;br /&gt;
    pmuInit();&lt;br /&gt;
&lt;br /&gt;
    // Enter sleep mode&lt;br /&gt;
    pmuSleep();&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // Wait for an interrupt to wake the device up&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pmuDeepSleep===&lt;br /&gt;
void pmuDeepSleep( uint32_t sleepCtrl, uint32_t wakeupSeconds )&lt;br /&gt;
&lt;br /&gt;
Diese Function versetzt den LPC in den Deep-Sleep Mode. AJeder GPIO-Pin kann verwendet werden um den LPC wieder aufzuwecken, der Pin muß entsprechend in pmuInit konfiguriert werden. &lt;br /&gt;
Der sleepCtrl Parameter wird benötigt umd festzulegen welche Peripherieeinheiten in den Sleep-Mode versetzt werden sollen, siehe SCB_PDSLEEPCFG Register für Details). Optional kann ein Wert ungleich null , in wakeupSeconds bereitgestellt werden, der den Prozessor nach der eingestellten Zeit wieder aufweckt. Dabei wird der 32-bit Timer 0 und Pin 0.1 (CT32B0_MAT2) benutzt.&lt;br /&gt;
&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * sleepCtrl: hierüber werden die gesetzten Peripherieeinheiten gezielt in Sleep-Mode gesetzt.&lt;br /&gt;
    * wakeupSeconds: Ist dieser Wert größer 0 wird der Prozessor automatisch bach dieser Zeit in Sekunden wieder aufgeweckt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/pmu/pmu.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
&lt;br /&gt;
    uint32_t pmuRegVal;&lt;br /&gt;
&lt;br /&gt;
    // Configure wakeup sources before going into sleep/deep-sleep.&lt;br /&gt;
    // By default, pin 0.1 is configured as wakeup source (falling edge)&lt;br /&gt;
    pmuInit();&lt;br /&gt;
&lt;br /&gt;
    // Inidicate which peripherals should be disabled in deep-sleep&lt;br /&gt;
    pmuRegVal = SCB_PDSLEEPCFG_IRCOUT_PD | &lt;br /&gt;
                SCB_PDSLEEPCFG_IRC_PD | &lt;br /&gt;
                SCB_PDSLEEPCFG_FLASH_PD | &lt;br /&gt;
                SCB_PDSLEEPCFG_USBPLL_PD | &lt;br /&gt;
                SCB_PDSLEEPCFG_SYSPLL_PD | &lt;br /&gt;
                SCB_PDSLEEPCFG_SYSOSC_PD | &lt;br /&gt;
                SCB_PDSLEEPCFG_ADC_PD | &lt;br /&gt;
                SCB_PDSLEEPCFG_BOD_PD;&lt;br /&gt;
&lt;br /&gt;
    // Enter deep sleep mode and wakeup after 10 seconds&lt;br /&gt;
    pmuDeepSleep(pmuRegVal, 10);&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pmuPowerDown===&lt;br /&gt;
void pmuPowerDown( void )&lt;br /&gt;
&lt;br /&gt;
Diese Function konfiguriert das PMU Control Register so, daß der LPC in den deep power-down mode geht. Achtung: Alle Register außer der vier Register  (PMU_GPREG0..3) verlieren ihren Inhalt während der Prozessor im Deep-Power Down Mode ist. die 3,3V dürfen dazu nicht wegfallen&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warnung:&lt;br /&gt;
Der LPC kann NUR durch einen Low-level an Pin P1.4 (WAKEUP aufgeweckt werden). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/pmu/pmu.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
    pmuInit();&lt;br /&gt;
&lt;br /&gt;
    // Enter power-down mode&lt;br /&gt;
    pmuPowerDown();&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // Device was woken up by WAKEUP pin&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Core/SSP==&lt;br /&gt;
&lt;br /&gt;
Generischer Code für SSP/SPI Kommunikation. Der SSP Block wird als SPI Master Mode initialisiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sspInit ===&lt;br /&gt;
void sspInit (uint32_t portNum, sspClockPolarity_t polarity, sspClockPhase_t phase)&lt;br /&gt;
&lt;br /&gt;
Initialisiert den SSP Port. By default, SSP wird als SPI frame-format mit 8-bit Data initialisiert. Pin 2.11 wird als serial clock (SCK) verwendet, und SSEL (0.2) ist als GPIO initialisiert, um manuell den SPI Port ein- bzw. Auszuschalten Überlauf und Timeout Interrupts sind beide ein.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: Port Number. ( Standardmäßig 0, es sei denn auf einem LPC1313/1.)&lt;br /&gt;
    * polarity: Clock High (sspClockPolarity_High) oder Low (sspClockPolarity_Low)als inaktiven Pegel.&lt;br /&gt;
    * phase: Bit Start mit steigender Flanke (sspClockPhase_RisingEdge) oder mit fallender Flanke sspClockPhase_FallingEdge) bei Pegelwechsel von SCK.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes&lt;br /&gt;
&lt;br /&gt;
sspSelect() und sspDeselect() macros wurden ssp.h definiert, um SSEL kontrollieren zu können, ohne deß der dafür definierte Pin bekannt ist line &lt;br /&gt;
Siehe Beispiel für sspSend&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sspSend ===&lt;br /&gt;
void sspSend (uint32_t portNum, uint8_t *buf, uint32_t length)&lt;br /&gt;
&lt;br /&gt;
Sendet einen Datenblock an den SSP Port&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: Port Number. ( Standardmäßig 0, es sei denn auf einem LPC1313/1.)&lt;br /&gt;
    * *buf: Pointer auf den Datenpuffer&lt;br /&gt;
    * length: Block Länge des Datenpuffers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/ssp/ssp.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define SSP_FIFOSIZE		8&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
    sspInit(0, sspClockPolarity_High, sspClockPhase_RisingEdge);&lt;br /&gt;
&lt;br /&gt;
    uint8_t request[SSP_FIFOSIZE];&lt;br /&gt;
    uint8_t response[SSP_FIFOSIZE];&lt;br /&gt;
&lt;br /&gt;
    // Send 0x9C to the slave device and wait for a response&lt;br /&gt;
&lt;br /&gt;
    // Fill request buffer&lt;br /&gt;
    request[0] = 0x80 | 0x1C;&lt;br /&gt;
&lt;br /&gt;
    // Enable CS line&lt;br /&gt;
    ssp0Select();&lt;br /&gt;
&lt;br /&gt;
    // Send the &#039;request&#039; data (1 byte)&lt;br /&gt;
    sspSend(0, (uint8_t *)&amp;amp;request, 1);&lt;br /&gt;
&lt;br /&gt;
    // Wait for the response (1 byte)&lt;br /&gt;
    sspReceive(0, (uint8_t *)&amp;amp;response, 1);&lt;br /&gt;
&lt;br /&gt;
    // Disable CS line&lt;br /&gt;
    ssp0Deselect();&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sspReceive===&lt;br /&gt;
void sspReceive(uint32_t portNum, uint8_t *buf, uint32_t length)&lt;br /&gt;
&lt;br /&gt;
Empfängt einen Datenblock an den SSP Port&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * portNum: Port Number. ( Standardmäßig 0, es sei denn auf einem LPC1313/1.)&lt;br /&gt;
    * *buf: Pointer auf den Datenpuffer&lt;br /&gt;
    * length: Block Länge des Datenpuffers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für sspSend&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Core/Systick==&lt;br /&gt;
&lt;br /&gt;
Steuert den 24-bit &#039;system tick&#039; Timer, der sowohl als normaler Timer, alsauch als System-Timer für ein real-time Betriebssystem (FreeRTOS, Crossworks CTL, etc.) verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===systickInit ===&lt;br /&gt;
void systickInit (uint32_t delayMs)&lt;br /&gt;
&lt;br /&gt;
Initialisiert den Systick Timer in Millisekunden (typischer Wert = 10ms). Dies führt alle z.B. 10ms zu einem Systtick Interrupt und dazu, daß eine unsigned 32-Bit Variable mit dem Namen &amp;quot;msTicks&amp;quot; um 1 hochgezählt wird wenn der Interrupt ausgelöst wird.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * delayMs: Indicates the length of time in millaseconds between each system &#039;tick&#039;.&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für systickDelay.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===systickDelay ===&lt;br /&gt;
void systickDelay (uint32_t delayTicks)&lt;br /&gt;
&lt;br /&gt;
Führt zu einem den Prozessor blockierenden Wartezeit von einer spezifizierten Anzahl an Systick Timer Ticks. Die Länge der Pause hängt von der in der systickInit Function definierten Interruptzeit ab. &lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * delayTicks: The number of systick ticks to wait.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/systick/systick.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  // Initialise the cpu&lt;br /&gt;
  cpuInit();&lt;br /&gt;
  // Initialise the systick timer with one tick every 10 millaseconds&lt;br /&gt;
  systickInit(10);&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // Wait 15 ticks on the systick timer (meaning 150ms)&lt;br /&gt;
    systickDelay(15);&lt;br /&gt;
    // Do something ...&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Core/Timer16==&lt;br /&gt;
Steuert alle 16-Bit Timers auf dem LPC1343. Achtung: bei 72MHz deckt ein 16-Bit Timer nur eine Zeit von knapp 0.91mS (or 910uS) ab:&lt;br /&gt;
&lt;br /&gt;
1 mS = CFG_CPU_CCLK / 1000&lt;br /&gt;
     = 72000000 / 1000&lt;br /&gt;
     = 72000 &#039;ticks&#039;&lt;br /&gt;
&lt;br /&gt;
Der Maximalwert eines 16-Bit Timers ist 0xFFFF (65535) also 0.910208ms. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===timer16Init===&lt;br /&gt;
void timer16Init(uint8_t timerNum, uint16_t timerInterval)&lt;br /&gt;
&lt;br /&gt;
Initialisiert einen 16-bit timer mit seiner Interruptzeit. Jedes mal, wenn der Zeiraum abgelaufen ist wird der Timer-Interrupt ausgelöst, und die Zählervariable um eins hochgezählt. (z.B.  mit Timer CT16B0, wird der &#039;timer16_0_counter&#039; Inkrementiert).&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
    * timerNum: Der 16-Bit Timer der initialisiert werden soll [0..1]&lt;br /&gt;
    * timerInterval: Die Anzahl an Takt-&#039;ticks&#039; zwischen den Interrupts [0..65534]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warnung&lt;br /&gt;
Vorsicht bei der Konfiguration der Timer, da die Pins mehrfach mit anderer Peripherie gemultiplext werden, je nach Initialisierung.Diese Funktion dient nur der besseren Veranschaulichung und muß unbedingt an die jeweiligen Randbedingungen angepaßt werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;/core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;/core/timer16/timer16.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Instantiated in timer16.c&lt;br /&gt;
extern volatile uint32_t timer16_0_counter;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
&lt;br /&gt;
    // Initialise timer0 with a delay of 0xFFFF, which will cause the&lt;br /&gt;
    // timer interrupt to fire every 65535 ticks and increment&lt;br /&gt;
    // timer16_0_counter by 1&lt;br /&gt;
    timer16Init(0, 0xFFFF);&lt;br /&gt;
&lt;br /&gt;
    // Enable the timer&lt;br /&gt;
    timer16Enable(0);&lt;br /&gt;
&lt;br /&gt;
    // At this point timer16_0_counter should start incrementing by 1&lt;br /&gt;
    // every 65535 ticks&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // If the timer has been fired 10 times, disabled the timer&lt;br /&gt;
        if (timer16_0_counter == 10)&lt;br /&gt;
        {&lt;br /&gt;
            timer16Disable(0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===timer16DelayTicks===&lt;br /&gt;
void timer16DelayTicks(uint8_t timerNum, uint16_t delayInTicks)&lt;br /&gt;
&lt;br /&gt;
Führt zu einer blockierenden Pause für die definierte Anzahl an Takt-ticks.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: Der 16-Bit Timer der initialisiert werden soll [0..1]&lt;br /&gt;
    * delayInTicks: Anzahl an Takt ticks die pausiert werden soll [0..65534]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes&lt;br /&gt;
Die genaue Zeitdauer der Pause hängt von der Taktrate des System-Taktes ab.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;/core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;/core/timer16/timer16.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
&lt;br /&gt;
    // Initialise timer 0 ... delay is provided but not used here&lt;br /&gt;
    timer16Init(0, 0xFFFF);&lt;br /&gt;
&lt;br /&gt;
    // Enable the timer&lt;br /&gt;
    timer16Enable(0);&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // Cause blocking delay for 36000 ticks (0.5mS @ 72MHz)&lt;br /&gt;
        // Note: The delay must be 65534 or less (16-bit value)&lt;br /&gt;
        timer16DelayTicks(0, 36000);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===timer16DelayUS===&lt;br /&gt;
void timer16DelayUS(uint8_t timerNum, uint16_t delayInUS)&lt;br /&gt;
&lt;br /&gt;
Führt zu einer blockierenden Pause für die definierte Anzahl an Mikrosecunden.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: Der betreffende 16-Bit Timer [0..1]&lt;br /&gt;
    * delayInUS: Anzahl der Mikrosekonden, die gewartet werden soll&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warnung&lt;br /&gt;
Die maximale Wartezeit bei 72MHz beträgt 910uS (0xFFFF / 72 = 910), or 0.91ms&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;/core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;/core/timer16/timer16.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
&lt;br /&gt;
    // Initialise timer 0 ... delay is provided but not used here&lt;br /&gt;
    timer16Init(0, 0xFFFF);&lt;br /&gt;
&lt;br /&gt;
    // Enable the timer&lt;br /&gt;
    timer16Enable(0);&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // Cause blocking delay for 500 microseconds (0.5mS)&lt;br /&gt;
        timer16DelayUS(0, 500);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===timer16Enable===&lt;br /&gt;
void timer16Enable(uint8_t timerNum)&lt;br /&gt;
&lt;br /&gt;
Schaltet den spezifizierten Timer ein (erlaubt die Auslösung der konfigurierten Interrupts)&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: Der betreffende 16-Bit Timer [0..1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für timer16Init&lt;br /&gt;
void timer16Disable(uint8_t timerNum)&lt;br /&gt;
&lt;br /&gt;
Schaltet den spezifizierten Timer aus (verbietet die Auslösung der konfigurierten Interrupts)&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: Der betreffende 16-Bit Timer [0..1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für timer16Init&lt;br /&gt;
&lt;br /&gt;
===timer16Reset===&lt;br /&gt;
void timer16Reset(uint8_t timerNum)&lt;br /&gt;
&lt;br /&gt;
Setzt den spezifizierten Timer zurück.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: The 16-bit timer to reset [0..1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Core/Timer32==&lt;br /&gt;
Steuert alle 32-Bit Timers auf dem LPC1343.&lt;br /&gt;
Achtung: der 32-bit timers ermöglicht einen deutlich längeren Timerinterrupt als der 16-Bit Timer. z.B.&lt;br /&gt;
&lt;br /&gt;
1 mS = CFG_CPU_CCLK / 1000&lt;br /&gt;
     = 72000000 / 1000&lt;br /&gt;
     = 72000 &#039;ticks&#039;&lt;br /&gt;
&lt;br /&gt;
Der Maximalwert eines 32-Bit Timers ist, 0xFFFFFFFF (4,294,967,295), gleichbedeutend mit 59652ms (etwas weniger als eine Minute, im Vergleich ~0.91ms mit einem 16 Bit Timer @ 72MHz).&lt;br /&gt;
&lt;br /&gt;
Sowohl die 16-Bit, alsauch die 32-Bit Timer können in verbindung mit einem externen Pin eingesetzt werden. z.B. setzen/löschen eines Pins, wenn ein &amp;quot;Match&amp;quot; eintritt. Jeses Matchregisters jedes Timers kann auch als PWM Register verwendet werden und ein entsprechendes PWM-Verhältnis ausgeben zu können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===timer32Init===&lt;br /&gt;
void timer32Init(uint8_t timerNum, uint32_t timerInterval)&lt;br /&gt;
&lt;br /&gt;
Initialisiert einen 32-bit timer mit seiner Interruptzeit. Jedes mal, wenn der Zeiraum abgelaufen ist wird der Timer-Interrupt ausgelöst, und die Zählervariable um eins hochgezählt. (z.B.  mit Timer CT16B0, wird der &#039;timer16_0_counter&#039; Inkrementiert).&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
    * timerNum: Der 32-Bit Timer der initialisiert werden soll [0..1]&lt;br /&gt;
    * timerInterval: Die Anzahl an Takt-&#039;ticks&#039; zwischen den Interrupts [0..4,294,967,294]&lt;br /&gt;
&lt;br /&gt;
Warnung:&lt;br /&gt;
Vorsicht bei der Konfiguration der Timer, da die Pins mehrfach mit anderer Peripherie gemultiplext werden, je nach Initialisierung.Diese Funktion dient nur der besseren Veranschaulichung und muß unbedingt an die jeweiligen Randbedingungen angepaßt werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;/core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;/core/timer32/timer32.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Instantiated in timer32.h&lt;br /&gt;
extern volatile uint32_t timer32_0_counter;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
&lt;br /&gt;
    // Initialise timer0 with a delay of 72000, which will cause the&lt;br /&gt;
    // timer interrupt to fire every 1mS @ 72MHz and increment&lt;br /&gt;
    // timer32_0_counter by 1&lt;br /&gt;
    timer32Init(0, 72000);&lt;br /&gt;
&lt;br /&gt;
    // Enable the timer&lt;br /&gt;
    timer32Enable(0);&lt;br /&gt;
&lt;br /&gt;
    // At this point timer32_0_counter should start incrementing by 1&lt;br /&gt;
    // every 72000 ticks&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // If the timer has been fired 10 times, disabled the timer&lt;br /&gt;
        if (timer32_0_counter == 10)&lt;br /&gt;
        {&lt;br /&gt;
            timer32Disable(0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===timer32Delay===&lt;br /&gt;
void timer32Delay(uint8_t timerNum, uint32_t delay)&lt;br /&gt;
&lt;br /&gt;
Führt zu einer blockierenden Pause für die definierte Anzahl an Takt-ticks.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: Der 16-Bit Timer der initialisiert werden soll [0..1]&lt;br /&gt;
    * delayInTicks: Anzahl an Takt ticks die pausiert werden soll &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes&lt;br /&gt;
Die genaue Zeitdauer der Pause hängt von der Taktrate des System-Taktes ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warning&lt;br /&gt;
Die max. delay-Zeit hängt von &#039;timerInterval&#039; Wert ab, der bei der Timer initialisierung verwendet wird  (siehe timer32Init).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;/core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;/core/timer32/timer32.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
&lt;br /&gt;
    // Initialise timer 0 with 1 millisecond &#039;ticks&#039;&lt;br /&gt;
    timer32Init(0, TIMER32_CCLK_1MS);&lt;br /&gt;
&lt;br /&gt;
    // Enable the timer&lt;br /&gt;
    timer32Enable(0);&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // Cause a blocking delay for 1.5 seconds (1500 milliseconds)&lt;br /&gt;
        timer32Delay(0, TIMER32_DELAY_1MS * 1500);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===timer32Enable===&lt;br /&gt;
void timer32Enable(uint8_t timerNum)&lt;br /&gt;
&lt;br /&gt;
Schaltet den spezifizierten Timer ein (erlaubt die Auslösung der konfigurierten Interrupts)&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: Der betreffende 32-Bit Timer [0..1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für timer32Init&lt;br /&gt;
&lt;br /&gt;
===timer32Disable===&lt;br /&gt;
void timer32Disable(uint8_t timerNum)&lt;br /&gt;
&lt;br /&gt;
Schaltet den spezifizierten Timer aus (verbietet die Auslösung der konfigurierten Interrupts)&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: Der betreffende 32-Bit Timer [0..1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für timer32Init&lt;br /&gt;
&lt;br /&gt;
===timer32Reset===&lt;br /&gt;
void timer32Reset(uint8_t timerNum)&lt;br /&gt;
&lt;br /&gt;
Setzt den spezifizierten Timer zurück.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * timerNum: Der betreffende 32-Bit Timer [0..1]&lt;br /&gt;
&lt;br /&gt;
==Core/UART==&lt;br /&gt;
&lt;br /&gt;
Ermöglicht es einfache Teste über RS232, USB oder FTDI232RL zu senden oder zu empfangen. Jeder eingehende Text wird in einem FIFO gespeichert sodaß Datenverlust nicht auftreten sollte. &lt;br /&gt;
&lt;br /&gt;
===uart_pcb_t===&lt;br /&gt;
uart_pcb_t *uartGetPCB ()&lt;br /&gt;
&lt;br /&gt;
Liefert einen Pointer auf den Protokollblock des UART&#039;s. Damit kann der Status des UART ermittelt werden, und damit ob der UART initialisiert wurde, ob auf Daten gewartet oder gerade gesendet wird und um eine Referenz auf den Empfangs-FIFO zu erhalten. &lt;br /&gt;
&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Make sure that UART is initialised&lt;br /&gt;
uart_pcb_t *pcb = uartGetPCB();&lt;br /&gt;
if (!pcb-&amp;gt;initialised)&lt;br /&gt;
{&lt;br /&gt;
  uartInit(CFG_UART_BAUDRATE);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===uartInit ===&lt;br /&gt;
void uartInit (uint32_t baudrate)&lt;br /&gt;
&lt;br /&gt;
Initialisiert den UART mit einer spezifischen Baud-Rate.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * baudRate: Die Baud-Rate, mit der der UART konfiguriert werden soll (z.B. &#039;57600&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/uart/uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define UARTBUFFERSIZE 5&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
    uartInit(57600);&lt;br /&gt;
&lt;br /&gt;
    uint8_t uartBuffer[UARTBUFFERSIZE] = { &#039;T&#039;, &#039;e&#039;, &#039;s&#039;, &#039;t&#039;, &#039;\n&#039; };&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {  &lt;br /&gt;
        // Constantly send contents of uartBuffer&lt;br /&gt;
        uartSend((uint8_t *)uartBuffer, UARTBUFFERSIZE);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===uartSend ===&lt;br /&gt;
void uartSend (uint8_t *bufferPtr, uint32_t length)&lt;br /&gt;
&lt;br /&gt;
Sendet den Inhalt des Puffers über den UART.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * *bufferPtr: Pointer zum Text Buffer&lt;br /&gt;
    * length: Die Größe des Text Buffers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für uartInit&lt;br /&gt;
&lt;br /&gt;
===uartSendByte ===&lt;br /&gt;
void uartSendByte (uint8_t byte)&lt;br /&gt;
&lt;br /&gt;
Schickt ein einzelnes Byte an den UART.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * byte: Das zu sendende Byte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Send 0xFF over UART&lt;br /&gt;
uartSendByte(0xFF);&lt;br /&gt;
&lt;br /&gt;
// Send &#039;B&#039; over UART (note single quotes)&lt;br /&gt;
uartSendByte(&#039;B&#039;);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===uartRxBufferInit ===&lt;br /&gt;
void uartRxBufferInit ()&lt;br /&gt;
&lt;br /&gt;
Initialisiert den RX FIFO buffer.&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
No example current available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===uartRxBufferRead ===&lt;br /&gt;
uint8_t uartRxBufferRead ()&lt;br /&gt;
&lt;br /&gt;
Liest ein Byte aus dem RX Buffer. Diese Funktion liefert ein Byte zurück, das durch den Array Index spezifiziert wird. Erreicht der Pointer die max. Buddergröße, beginnt er wieder bei &#039;0&#039;.&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für uartRxBufferWrite.&lt;br /&gt;
&lt;br /&gt;
===uartRxBufferWrite===&lt;br /&gt;
void uartRxBufferWrite(uint8_t data)&lt;br /&gt;
&lt;br /&gt;
Schreibt ein Byte in den RX Buffer. &lt;br /&gt;
&lt;br /&gt;
Note: Normalerweise ist es nicht notwendig diese Funktion zu benutzen, da alle eingehenden Daten über den UART Interrupt laufen, und jedes Byte in den RX-Buffer geschrieben wird.&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * uint8_t data: Byte, das in den RX Buffer geschrieben werden soll.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/uart/uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
    uartInit(57600);&lt;br /&gt;
&lt;br /&gt;
    // Add 0xFF to the RX buffer&lt;br /&gt;
    uartRxBufferWrite(0xFF);&lt;br /&gt;
&lt;br /&gt;
    // Check if the buffer is empty (it shouldn&#039;t be!)&lt;br /&gt;
    while (uartRxBufferDataPending())&lt;br /&gt;
    {&lt;br /&gt;
      // Retrieve the first available character in the buffer&lt;br /&gt;
      uint8_t c = uartRxBufferRead();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===uartRxBufferClearFIFO===&lt;br /&gt;
void uartRxBufferClearFIFO ()&lt;br /&gt;
&lt;br /&gt;
Löscht die RX und TX Pointer und setzt die Längen auf Null. &lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
No example currently available.&lt;br /&gt;
&lt;br /&gt;
===uartRxBufferDataPending===&lt;br /&gt;
void uartRxBufferDataPending()&lt;br /&gt;
&lt;br /&gt;
Stellt fest, ob Daten im FIFO sind. Wenn ein odermehr Bytes im FIFO enthalten sind, wird eine &#039;1&#039; zurückgeliefert  Ist der Puffer leern wird eine &#039;0&#039; zurückgeliefert.&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
Siehe das Beispiel für uartRxBufferWrite.&lt;br /&gt;
&lt;br /&gt;
==Core/USBHID-ROM==&lt;br /&gt;
&lt;br /&gt;
Der LPC1343 enthält eine ROM-basierte Unterstützung für HID (Human Interface Device) und MSCD (Mass Storage Device) was einem eine relativ einfache Möglichkeit liefert USB Klassen schnell und effizient zu implementieren.  Eine einfache HID implementierung ist in der Code-Base enthaltenund beinhaltet die Basis-Kommunikation zwischen dem LPC1343 und einem PC or USB-Host Device. In diesem Beispiel wird das Device so konfiguriert, daß &amp;quot;1-Byte! telegramme geschickt werden können. Achtung: dieses Beispiel ist auf das bei microbuilder.eu verfügbare LPC1343 Reference Board abgestimmt. &lt;br /&gt;
&lt;br /&gt;
Dieser ROM-basierte HID Driver macht es wirklich außergewöhnlich bequem, ist aber weniger flexibel als ein vollständig SW-basierter USB/HID Stack.&lt;br /&gt;
Der Hauptunterschied ist, daß man hier auf einen &amp;quot;single Report&amp;quot; limitiert ist.  Ein vollständig SW-basierter Stack ist auf der NXP-Website verfügbar. Ein möglicher Kompromiß zwischen Aufwand und flexibilität ist, daß z.B. immer zwei oder mehre Byte-Reports verschickt werden, wobei das erste Byte als eine adt &amp;quot;Komando-ID&amp;quot; bestimmt, wie die nachfolgenden Bytes interpretiert werden sollen.  Speicher-Einschränkung: Der ROM-basierte HID Treiber verwendet 0x10000050 to 0x10000180 des On-Chip RAM, was bedeutet, daß im Linkter entsprechend eingestellt werden muß , daß diese Sektion nicht verwendet werden darf. &lt;br /&gt;
&lt;br /&gt;
===usbHIDInit ===&lt;br /&gt;
void usbHIDInit (void)&lt;br /&gt;
&lt;br /&gt;
Initialisiert das Device für USB HID Support und versucht einen Verbindungsaufbau zum Host. Das Device ist als 1 Byte Report konfiguriert.&lt;br /&gt;
&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/usbhid-rom/usbhid.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/gpio/gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
&lt;br /&gt;
    // Set GPIO2.10 (LED) as output&lt;br /&gt;
    gpioSetDir(2, 10, gpioDirection_Output);&lt;br /&gt;
    // Disable LED (set high)&lt;br /&gt;
    gpioSetValue (2, 10, 1);&lt;br /&gt;
&lt;br /&gt;
    // Initialise and connect USB&lt;br /&gt;
    usbHIDInit();&lt;br /&gt;
&lt;br /&gt;
    // The device should enumerate on the PC, and&lt;br /&gt;
    // the LED on 2.10 can be enabled by sending 0x01&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===usbHIDGetInReport ===&lt;br /&gt;
void usbHIDGetInReport (uint8_t src[], uint32_t length)&lt;br /&gt;
&lt;br /&gt;
Setzt die HID im Report (vom LPC1343 zum USB host).&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * src[]: Ein Byte-Array für die Report Daten&lt;br /&gt;
    * length: Länge des src&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warnung&lt;br /&gt;
The signature for this method (uint8_t src[], uint32_t length) should not be modified, and this method should never be called directly. All interrupts and report exchanges are handled by the rom-based drivers. The only thing that should be modified in these methods is the code inside them that either generates or handles the appropriate byte data.&lt;br /&gt;
See the example for usbHIDInit&lt;br /&gt;
&lt;br /&gt;
===usbHIDSetOutReport ===&lt;br /&gt;
void usbHIDSetOutReport (uint8_t dst[], uint32_t length)&lt;br /&gt;
&lt;br /&gt;
Sezt den HID-out Report (Vom USB-Host zum LPC1343).&lt;br /&gt;
Übergabeparameter:&lt;br /&gt;
&lt;br /&gt;
    * src[]: Ein Byte-Array für die Report Daten&lt;br /&gt;
    * length: Länge des src&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warnung&lt;br /&gt;
The signature for this method (uint8_t dst[], uint32_t length) should not be modified, and this method should never be called directly. All interrupts and report exchanges are handled by the rom-based drivers. The only thing that should be modified in these methods is the code inside them that either generates or handles the appropriate byte data.&lt;br /&gt;
See the example for usbHIDInit&lt;br /&gt;
&lt;br /&gt;
==Core/WDT==&lt;br /&gt;
&lt;br /&gt;
Der LPC1343 enthält einen Watchdog-Timer der benutzt werden kann das Sytem am laufen zu halten. Damit wird festgestellt, ob der LPC abgestürzt ist, oder nicht.  Der &#039;Watchdog&#039; ist so konfiguriert, daß er alle &#039;x&#039; Ticks des System-Taktes getriggert werden muss. Wenn dies nicht stattfindet, können verschiedene Aktionen ausgelöst werden, (z.B. System-Reset, oder die Auslösung eines Interrupts). Die Grundeinstellung des in der Code-Base vorhandenen Codes setzt den Watchdog auf eine Togglerate von 250kHz, also einmal alle 250.000 Taktzyklen, und hier wird nur der WDT_IRQHandler ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===wdtInit ===&lt;br /&gt;
void wdtInit (void)&lt;br /&gt;
&lt;br /&gt;
Initialisiert den Watchdog Timer und den interrupt.&lt;br /&gt;
&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;quot;core/cpu/cpu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;core/wdt/wdt.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    cpuInit();&lt;br /&gt;
    wdtInit();&lt;br /&gt;
&lt;br /&gt;
    // Pat the watchdog to start it&lt;br /&gt;
    wdtFeed();&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // Keep the watchdog happy by regularly feeding it&lt;br /&gt;
        wdtFeed();&lt;br /&gt;
&lt;br /&gt;
        // Any delay here &amp;gt; 250,000 ticks (~3.5mS @ 72MHz)&lt;br /&gt;
        // will cause the watchdog to raise an interrupt, which&lt;br /&gt;
        // will be handled by WDT_IRQHandler&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===wdtFeed ===&lt;br /&gt;
void wdtFeed (void)&lt;br /&gt;
&lt;br /&gt;
Toggelt den Watchdog um einen Timeout zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Übergabeparameter: Keine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel für wdtInit&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.lpcware.com/lpcxpresso/home LPDXpresso Download (Kostenlos mit Debugger)]&lt;br /&gt;
* [http://www.lpcware.com LPCXpresso Homepage]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/LPC1xxx Beschreibung der LPC1xxx-Familie]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/LPC1xxx_Entwicklungskit_LPCXpresso LPCXpresso-Entwicklungskit]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung zur IDE von Code-Red]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:LPC1x]]&lt;/div&gt;</summary>
		<author><name>217.86.180.189</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87875</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87875"/>
		<updated>2015-03-11T17:25:43Z</updated>

		<summary type="html">&lt;p&gt;217.86.180.189: /* Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei */ Beschreibung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; MicroBlaze-mcs  (µB-MCS) Variante aus dem coregenerator (ab ISE 13.4 (ab 01/2013) und Vivado) und nicht die kostenpflichtige MicroBlaze (ohne -MCS) Variante.&lt;br /&gt;
&lt;br /&gt;
=MicroBlaze und MicroBlaze MCS=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=FPGA-Implementierung und SoftCore-Generierung=&lt;br /&gt;
==FPGA-Gerüst==&lt;br /&gt;
Es ist Empfehlenswert zuerst ein &amp;quot;Basis-FPGA&amp;quot; ohne µB fertigzustellen und zu testen. Hier wurde das zum Starterkit gehörige Demo adaptiert und somit war schon mal die Pinzuordnung und das Taktsystem fehlerfrei. Eine heartbeat-LED die im Sekundentakt blinkt grenzt den Fehler deutlich ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CoreGen==&lt;br /&gt;
Coregen starten (beispw. Programme -&amp;gt; Xilinx -&amp;gt; ISE 14.7 -&amp;gt; ISE Design tools -&amp;gt; 64bit tools -&amp;gt; coregen) Project für den benutzen FPGA aufsetzen (hier im beispiel S3AN-700; package: FGG484; speedgrade 4 Verilog)&lt;br /&gt;
&lt;br /&gt;
IM IP catalog findet sich der MCE unter embedded Processing -&amp;gt; processors -&amp;gt; microblaze MCE :&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zum Screenshot sollte man den Speicher auf mindestens 8 kByte setzen. Die Angabe der Taktfrequenz ist für die Berechnung des Baudraten-teilers für die UART wichtig. Benutzt man die UART nicht, ist dieser Wert  (theoretisch?) für den Core bedeutungslos. Das Place&amp;amp;Route für den FPGA richtet sich nach der Taktvorgabe aus dem ucf-file.&lt;br /&gt;
Die in den Karteikarten gezeigten Kürzel stehen für die einzigen &amp;quot;Peripheriecontrollern&amp;quot; die für dem µB-MCS generiert&lt;br /&gt;
werden können. Mit dem weiterhin kostenpflichten Platform Studio sind weitere Cores einfach hinzufügbar. Aber beim MCS muß man nicht komplett darauf verzichten da an dem IO-Bus selbtgeschriebene Komponenten angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
*UART: feste Baudrate, Interrupt für RX&lt;br /&gt;
*FIT:  Fixed length timer -4 möglich&lt;br /&gt;
*PIT: programmable Timer - 4? möglich&lt;br /&gt;
*GPO: Generalpurpose Output-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*GPI: Generalpurpose Input-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*INT: External Interrupt Sources&lt;br /&gt;
&lt;br /&gt;
Für die Treiber kann auch ein toggle output signal geriert werden das immer beim Erreichen der O invertiert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den µB-MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das Board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (&#039;&#039;ISE:View-&amp;gt;Panels-&amp;gt;Tcl Console&#039;&#039;) dann erscheint unten eine schmale Zeile in der Tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom &#039;&#039;coregen&#039;&#039; erzeugte tcl Script starten: &#039;&#039;source ../core/microblaze_mcs_setup.tcl&#039;&#039; . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot;) bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf eine ebenfalls von coregen erzeugtes *.bmm Datei zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten &#039;&#039;CoreGen&#039;&#039;-Fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle Folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile&amp;quot; geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
Im Menu &amp;quot;Xilinx Tools&amp;quot; den Punkt &amp;quot;Programm FPGA&amp;quot; auswählen und anschließend das (beim CoreGen) angelegte *.bmm file, das compilierte Programm (*.elf) und das *.bit File des in der ISE generierten FPGA&#039;s auswählen und den button &amp;quot;Program&amp;quot; drücken.&lt;br /&gt;
Jetzt wird mittels der Information über die genutztem BRAM-Blöcke aus der *.bmm-Datei im *.bit-File die Bereiche die die Initdaten für die BRAM-Speicherblöcke enthält mit dem Binary des Programms ausgetauscht und anschließend das FPGA programmiert.&lt;br /&gt;
&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>217.86.180.189</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=87049</id>
		<title>ARM Cortex Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=87049"/>
		<updated>2015-02-03T11:01:54Z</updated>

		<summary type="html">&lt;p&gt;217.86.180.189: /* CMSIS - ARM Cortex Software Libraries */ Satz entschwurbelt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Firma ARM stellt selbst keine Prozessoren/Controller her, sondern entwickelt nur sogenannte &amp;quot;IP-Cores&amp;quot;, die von Herstellern wie Atmel, Infineon, ST, NXP, TI und vielen anderen lizenziert werden. Diese Hersteller ergänzen den Core um Speicher und Peripherie. Der Vorteil dieses Modells ist, dass dadurch sehr viele Prozessoren mit unterschiedlichster Ausstattung verfügbar sind, die alle mit dem selben Befehlssatz (und damit dem selben Compiler) programmierbar sind.&lt;br /&gt;
&lt;br /&gt;
Allen ARM-Cores gemeinsam ist die 32 Bit RISC-Architektur. Für diese gibt es den klassischen 32bit ARM Befehlssatz und den zusätzlichen, kleineren 16/32 Bit &#039;&#039;&#039;Thumb&#039;&#039;&#039;-Befehlssatz. Die verschiedenen Prozessoren/Controller unterstützen einen oder beide davon. Thumb-fähige Controller sind erkennbar am &#039;&#039;&#039;T&#039;&#039;&#039; in der Bezeichnung, z.&amp;amp;nbsp;B. ARM7&#039;&#039;&#039;T&#039;&#039;&#039;DMI. Thumb kodiert die meisten Instruktionen in 16bit, den Rest in 32bit, was in einem kleineren Prozessor und geringenem Platzbedarf des Codes resultiert [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf]; der Nachteil ist die etwas niedrigere Geschwindigkeit. Die Cortex-M Kerne unterstützen ausschließlich den Thumb2-Befehlssatz.&lt;br /&gt;
&lt;br /&gt;
Seit einigen Jahren sind ARM-basierte Mikrocontroller erhältlich, die aufgrund der vergleichbar einfachen Beschaltung und niedrigem Stromverbrauch eine echte Alternative zu 8-Bit-Controllern wie dem [[AVR]] darstellen. Die ersten Controller mit diesen Eigenschaften verwendeten den ARM7TDMI-Kern (zB. LPC2000) (ARMv4T-Architektur). Mittlerweile wurden diese vom Cortex M-Kern abgelöst (ARMv6M, ARMv7M-Architektur), welcher in verschiedenen Varianten für verschiedene Einsatzzwecke verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In diesem Artikel geht es nur um die ARM Cortex-M Mikrocontroller, nicht jedoch um ARM [[Cortex-A]] Prozessoren, welche in Smartphones u.ä. eingesetzt werden.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es gibt folgende Varianten des Cortex-M Mikrocontroller-Kerns, aufgeführt vom energieeffizientesten zum leistungsfähigsten.&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M0/M0+ ==&lt;br /&gt;
Als günstigste und energieeffizienteste Variante gibt es die Cortex-M0 Cores mit deutlich kleinerem Befehlssatz als z.B. Cortex-M3. Diese&lt;br /&gt;
werden beispielsweise in folgenden Controllern eingesetzt:&lt;br /&gt;
&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1588.jsp?WT.ac=fp_may12_stm32f0 STM32F0] von [http://www.st.com STMicro], siehe &#039;&#039;&#039;[[STM32|STM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://ics.nxp.com/products/lpc1000/lpc11xx/ LPC11xx] von [http://www.nxp.com NXP], siehe &#039;&#039;&#039;[[LPC1xxx|LPC1xxx hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.infineon.com/XMC1000 XMC1000] von [http://www.infineon.com Infineon], siehe &#039;&#039;&#039;[[XMCxxxx|XMCxxxx hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.nuvoton.com/NuvotonMOSS/Community/ProductInfo.aspx?tp_GUID=5dbf7d7a-b6df-4fe1-91c9-063449500ce7 NuMicro-Controller] von Nuvoton (ex Winbond), laut Datenblatt mit 2.5-5.5V Betriebsspannung!&lt;br /&gt;
Für die M0-Familie ist für den LPC1xxx bereits eine &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx#Allgemeine_Informationen_zum_Aufbau_der_Code_Base Code-Base]&#039;&#039;&#039;  und ein preisgünstiges &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso Entwicklungskit]&#039;&#039;&#039; vorhanden.&lt;br /&gt;
&lt;br /&gt;
Inzwischen gibt es auch eine optimierte Version des Cortex-M0 - die Cortex-M0+ Cores. Diese können (optional) einige Features der Cortex-M3 Serie beinhalten, wie z.B eine MPU:&lt;br /&gt;
&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-zero-gecko-microcontroller-family EFM32 Zero Gecko] von [http://www.energymicro.com Silicon Labs (ehemals Energy Micro)], siehe &#039;&#039;&#039;[[EFM32|EFM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers/cortex_m0plus/lpc800/ LPC8xx] von [http://www.nxp.com NXP]&lt;br /&gt;
* [http://www.freescale.com/webapp/sps/site/taxonomy.jsp?code=KINETIS_L_SERIES Kinetis L-Serie] und [http://www.freescale.com/webapp/sps/site/taxonomy.jsp?code=KINETIS_M_SERIES Kinetis M-Serie] von [http://www.freescale.com/ Freescale]&lt;br /&gt;
* [http://www.fujitsu-fm-family.com/products/fm0.html angekündigte FM0+ Familie] von [http://www.fujitsu.com/emea/services/microelectronics Fujitsu]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1817?icmp=ss1817_pron_pr_feb2014 angekündigte M0+ Familie] von [http://st.com  STMicroelectronics]&lt;br /&gt;
* [http://www.atmel.com/Microsite/samd/default.aspx?utm_campaign=February_2014_Newsletter.html&amp;amp;utm_medium=email&amp;amp;utm_source=Eloqua  SAM D Familie] von [http://atmel.com  Atmel]&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M3 ==&lt;br /&gt;
Der erste Kern der Cortex M-Reihe war der Cortex-M3. Dieser ist vom Leistungsniveau her am ehesten mit seinem Vorgänger, dem ARM7TDMI vergleichbar.&lt;br /&gt;
&lt;br /&gt;
Controllerfamilien dieser Klasse sind:&lt;br /&gt;
&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-tiny-gecko-microcontroller-family EFM32 Tiny Gecko], [http://www.energymicro.com/products/efm32-gecko-microcontroller-family EFM32 Gecko] sowie [http://www.energymicro.com/products/efm32-leopard-gecko-microcontroller-family EFM32 Leopard Gecko] von [http://www.energymicro.com Silicon Labs (ehemals Energy Micro)] , siehe &#039;&#039;&#039;[[EFM32|EFM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.nxp.com LPC13xx/LPC17xx/LPC18xx] von NXP oder die inzwischen schon sehr ausführliche, siehe &#039;&#039;&#039;[[LPC1xxx|LPC1xxx hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/tm4c_arm_cortex-m4/overview.page TIVA] von [http://www.ti.com Texas Instruments] (vormals Stellaris, vormals Luminary Micro)&lt;br /&gt;
* [http://www.atmel.com/products/at91/sam3landing.asp?family_id=605 AT91SAM3] von Atmel&lt;br /&gt;
* [http://www.st.com/internet/mcu/family/141.jsp STM32] Baureihen [http://www.st.com/internet/mcu/subclass/1169.jsp F1]/[http://www.st.com/internet/mcu/subclass/1520.jsp F2]/[http://www.st.com/internet/mcu/subclass/1376.jsp L1]/[http://www.st.com/internet/mcu/subclass/1377.jsp W] von STMicroelectronics , siehe &#039;&#039;&#039;[[STM32|STM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.toshiba-components.com/microcontroller/TMPM330.html TMPM330] von Toshiba&lt;br /&gt;
* [http://www.spansion.com/Products/microcontrollers/32-bit-ARM-Core/fm3/Pages/FM3-family.aspx FM3] von [http://www.spansion.com Spansion] (vormals Fujitsu)&lt;br /&gt;
* [https://www.silabs.com/products/mcu/Pages/ARM-32bit-microcontroller.aspx SiM3U1xx] von Silabs&lt;br /&gt;
* [http://www.holtek.com.tw/english/products/32bit_flashmcu.htm HT32] von Holtek Semiconductor&lt;br /&gt;
&lt;br /&gt;
Für den LPC1xxx ist bereits eine &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx#Allgemeine_Informationen_zum_Aufbau_der_Code_Base Code-Base]&#039;&#039;&#039;  und ein preisgünstiges &#039;&#039;&#039;[[LPC1xxx_Entwicklungskit_LPCXpresso]]&#039;&#039;&#039; vorhanden.&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M4 ==&lt;br /&gt;
Als hoch performante Variante gibt es dann noch die Cortex-M4 Cores welche mit zusätzlichen [[DSP]]-Funktionen und teilweise einer (single precision) FPU ausgestattet sind. &lt;br /&gt;
&lt;br /&gt;
Diese werden beispielsweise in folgenden Controllern eingesetzt:&lt;br /&gt;
* [http://www.freescale.com/webapp/sps/site/overview.jsp?code=ARM Kinetis Series] von Freescale&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-wonder-gecko-microcontroller-family EFM32-Wonder Gecko] von [http://www.energymicro.com Silicon Labs (ehemals Energy Micro)], siehe &#039;&#039;&#039;[[EFM32|EFM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.nxp.com LPC43xx] von NXP (Dual Core)&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3] von [http://www.st.com STMicro], siehe &#039;&#039;&#039;[[STM32|STM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1521.jsp?WT.ac=p2_bn_jun12_stm32f4series STM32F4] von [http://www.st.com STMicro], siehe &#039;&#039;&#039;[[STM32|STM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/tm4c_arm_cortex-m4/overview.page Tiva C Series, TM4C] von [http://www.ti.com Texas Instruments]. Früher nannte Texas Instruments diese Controller &#039;&#039;Stellaris LM4F Series&#039;&#039;. 2013 begann TI mit einer große Umbenennung, bei der sogar neue Typenbezeichnung vergeben wurden. So wurde zum Beispiel aus dem LM4F230H5QR der TM4C123GH6PM. Gleichzeitig begann TI die Bezeichnung &#039;&#039;Stellaris&#039;&#039; aus Datenblättern, Software-Bibliotheken und Ähnlichem zu entfernen und durch &#039;&#039;Tiva&#039;&#039; zu ersetzen. Siehe auch [http://www.ti.com/lit/an/spma050a/spma050a.pdf].&lt;br /&gt;
* [http://www.infineon.com/XMC4000 XMC4000] von [http://www.infineon.com Infineon],  siehe &#039;&#039;&#039;[[XMCxxxx|XMCxxxx hier im Wiki]]&#039;&#039;&#039;, [[XMC4500|Artikel zum XMC4500]]&lt;br /&gt;
* [http://www.spansion.com/Products/microcontrollers/32-bit-ARM-Core/fm4/Pages/default.aspx FM4] von [http://www.spansion.com Spansion] (vormals Fujitsu)&lt;br /&gt;
* [http://www.atmel.com/products/at91/sam4landing.asp?family_id=605 AT91SAM4] von Atmel&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M7 ==&lt;br /&gt;
&lt;br /&gt;
Die neueste Variante der Cortex M-Reihe ist der M7, bei dem gegenüber dem M4 zahlreiche Features hinzukommen die die Brücke zu Anwendungsprozessoren schlagen: eine single precision-FPU, Code- und Daten-Cache, eine 6-stufige Pipeline mit Sprungvorhersage, und unterm Strich eine deutlich höhere Rechenleistung. Controller basierend auf dem Cortex M7 wurden u.a. von Atmel und ST angekündigt, sind aber noch nicht in Stückzahlen erhältlich. Der Cortex M7-Kern wird bereits von GCC unterstützt [https://launchpad.net/gcc-arm-embedded/+announcement/12983].&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/about/news/release.aspx?reference=tcm:26-63538 Pressemeldung von Atmel]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/SC1169/SS1858 Produktseite der STM32F7-Serie von ST]&lt;br /&gt;
&lt;br /&gt;
== ARM7TDMI ==&lt;br /&gt;
Der Vorgänger der Cortex-M-Cores ist der &#039;&#039;&#039;ARM7&#039;&#039;&#039;TDMI. Controllerfamilien dieser Klasse sind immer noch weit verbreitet:&lt;br /&gt;
* NXP (ehemals Philips) [[LPC2000]] &lt;br /&gt;
* Atmel [[AT91SAM]]7&lt;br /&gt;
* Analog Devices [[ADuC7xxx]]&lt;br /&gt;
* [http://focus.ti.com/mcu/docs/mcuprodoverview.tsp?sectionId=95&amp;amp;tabId=203&amp;amp;familyId=454 Texas Instruments TMS470]&lt;br /&gt;
* SAMSUNG S3C24x0 [http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=229&amp;amp;partnum=S3C2410]&lt;br /&gt;
* STR7xx von ST Microelectronics [http://www.st.com/mcu/inchtml-pages-str7.html]&lt;br /&gt;
* und viele weitere&lt;br /&gt;
&lt;br /&gt;
Mehr Informationen zur ARM-Architektur finden sich in der [http://de.wikipedia.org/wiki/ARM-Architektur Wikipedia], weiterführende Links in der [[Linksammlung#ARM|Linksammlung]].&lt;br /&gt;
&lt;br /&gt;
== Compiler &amp;amp; Software ==&lt;br /&gt;
&lt;br /&gt;
=== [[ARM_GCC|GCC]] ===&lt;br /&gt;
&lt;br /&gt;
Einer der beliebtesten Compiler für ARM-Prozessoren ist der GCC. Er kann sowohl ARM- als auch Thumb-Code erzeugen. Mehr dazu unter [[ARM GCC]].&lt;br /&gt;
&lt;br /&gt;
=== C/C++ IDEs ===&lt;br /&gt;
&lt;br /&gt;
Kostenlose Entwicklungsumgebungen (überwiegend GCC-basiert):&lt;br /&gt;
* [http://www.emblocks.org/web/ EmBlocks IDE] (Basiert auf Code::Blocks)&lt;br /&gt;
** Compiler: GNU ARM-GCC (in der Installation enthalten), RealView und IAR &lt;br /&gt;
** Hardware: STlink (mit &amp;quot;Live data&amp;quot;), openOCD, Jlink. &lt;br /&gt;
** Project Import: CoIDE, uVision, Atmel studio, MplabX, Mplab 8&lt;br /&gt;
** OS aware debugging &lt;br /&gt;
***FreeRTOS&lt;br /&gt;
***ChibiOS/RT  &lt;br /&gt;
** Unterstützt sehr viele Controller(-Hersteller):&lt;br /&gt;
***Atmel-ARM&lt;br /&gt;
***NXP-ARM&lt;br /&gt;
***STMicro-ARM&lt;br /&gt;
***EnergyMicro-ARM&lt;br /&gt;
**Keine Beschränkungen&lt;br /&gt;
**Hier gehts zum &#039;&#039;[http://www.emblocks.org/web/downloads-main Download]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.coocox.org/CooCox_CoIDE.htm CooCox IDE] (Eclipse basierend)&lt;br /&gt;
* [https://mbed.org mbed]: eine kostenlose Online-Entwicklungsumgebung basierend auf dem ARM Realview-Compiler, mit einer umfangreichen C++-Bibliothek für die Controllerfunktionen, integrierter Versionsverwaltung, und vielen Beispielprogrammen. Projekte lassen sich für Keil/IAR/GCC exportieren und offline weiterbearbeiten; die Bibliotheksfunktionen sind Open Source und auch kommerziell einsetzbar.&lt;br /&gt;
* [http://www.emide.org/ emIDE] Windows, komplette Visual Studio artige Entwicklungsumgebung (basierend auf Code::Blocks) mit GCC und Debugger (Unterstützung für Adapter von Segger) &amp;lt;!-- Projekt eines Segger Mitarbeiters --&amp;gt;&lt;br /&gt;
* [http://www.isystem.com/products/software/winidea-open winIDEAOpen]Die Fa. iSystem stellt mit der winIDEAOpen nun eine kostenlose Entwicklungsumgebung für alle Cortex-M Bauteile zur Verfügung. Als Compiler wird der GNU GCC verwendet und auch gleich mitinstalliert. Die IDE ist recht intuitiv und mit einer umfangreichen Hilfe ausgestattet. Das Ganze funktioniert mit dem &amp;lt;u&amp;gt;GCC ohne Codesize Limit&amp;lt;/u&amp;gt; und auch ein Testwerkzeug (testIDEA) ist mit integriert. Hardwareseitig werden neben dem iSystem iTag50 [http://www.isystem.com/products/hardware/cortex-debugger/itag] auch die Segger J-Link Debug Probes sowie der ST-Link von ST unterstützt. Auf der Webseite von iSystem sind auch einige schöne Beispielprojekte für diverse Boards zu finden [http://www.isystem.com/download/winideaopen]. Demnächst soll noch die Unterstützung für die ARM und IAR Compiler hinzuzkommen. Hier gehts zum &#039;&#039;[http://www.isystem.com/download/winideaopen Download]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;NXP&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;LPC&#039;&#039;&#039; Prozessorfamilien eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; C/C++ Entwicklungsumgebung an. Die auf Eclipse basierende Entwicklungsumgebung ([http://www.lpcware.com/lpcxpresso LPCXpresso]) ist nach der Installation bis 8kB freigeschaltet und nach einer einfachen und kostenlosen Registrierung für 256kB. [http://www.lpcware.com/lpcxpresso LPCXpresso] steht für Windows, Linux und Mac zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Kommerzielle Entwicklungsumgebungen (zum Teil kostenlos mit Einschränkungen) für ARM-basierte Mikrocontroller sind z.&amp;amp;nbsp;B.:&lt;br /&gt;
* [http://rowley.co.uk/arm/ Crossworks ARM] (GCC-basiert, Windows, Mac OS und Linux)&lt;br /&gt;
* [http://www.cosmicsoftware.com/download_cortex_64k.php Cosmic Software] (Windows), bis 64kB kostenlos&lt;br /&gt;
* [http://www.iar.com/ewarm/ IAR Embedded Workbench for ARM] (Windows)&lt;br /&gt;
* [http://www.keil.com/arm/ MDK-ARM von Keil/ARM] (Windows), Lite-Version bis 32kB kostenlos&lt;br /&gt;
* [http://www.sisy.de/ SiSy MC++] (Windows), Demo-Version, keine Code-Begrenzung&lt;br /&gt;
&lt;br /&gt;
=== Compiler für sonstige Programmiersprachen ===&lt;br /&gt;
* Basic: http://www.mikroe.com/mikrobasic/arm/&lt;br /&gt;
* Pascal: http://www.mikroe.com/mikropascal/arm/&lt;br /&gt;
&lt;br /&gt;
=== Interpreter ===&lt;br /&gt;
* Lua: http://www.eluaproject.net/&lt;br /&gt;
* Forth: https://github.com/ekoeppen/CoreForth&lt;br /&gt;
* JavaScript: http://www.espruino.com/&lt;br /&gt;
&lt;br /&gt;
=== ARM/XSCALE/CORTEX Instruction Set Simulator ===&lt;br /&gt;
&lt;br /&gt;
Die Firma Lauterbach bietet unter der Artikelnummer LA-8809 einen Instruction Set Simulator für ARM Cores an. Die Demoversion ist zur Evaluierung kostenlos. Einschränkungen bestehen in der Anzahl der zu ladenden Debugsymbole. Der Simulator unterstützt alle gängigen ARM Derivate und lädt alle üblichen Debugformate, wie die des RealView,  IAR und TI Compilers, oder der freien GCC Tools. Zum Simulator gibt es entsprechende zugehörige Debugtools, die allerdings käuflich zu erwerben sind.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lauterbach.com/frames.html?dwnload.html Download ARM/XSCALE/CORTEX Simulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Programmierschnittstellen (JTAG/SWD) ==&lt;br /&gt;
&lt;br /&gt;
Alle ARM-basierten Prozessoren verwenden ein einheitliches [[JTAG]]-Interface, über das Debugging und Speicherzugriff erfolgen kann. Nicht standardisiert sind allerdings die Verfahren zum Beschreiben des Flash-ROMs, deshalb muss man beachten ob die verwendete JTAG-Software Programmierroutinen für den jeweiligen Controller besitzt.&lt;br /&gt;
&lt;br /&gt;
SWD (Serial Wire Debug) ist eine neue mit den Cortex-Mikrocontrollern eingeführte Debug- und Programmierschnittstelle, die weniger Pins benötigt als JTAG. Die meisten Controller der Cortex-M0 &amp;amp; M3 Serie können sowohl mittels JTAG als auch mittels SWD programmiert werden, es gibt allerdings auch Exemplare (z.B. [[EFM32]] von [https://www.energymicro.com Energy Micro], XMC1100 von Infineon) welche nur SWD unterstützen.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die empfohlenen Steckerbelegungen für JTAG und SWD gibt ein [http://infocenter.arm.com/help/topic/com.arm.doc.faqs/attached/13634/cortex_debug_connectors.pdf Dokument von ARM].&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus gibt es noch herstellerspezifische Schnittstellen wie SPD (Single Pin Debug) von Infineon, oder vorinstallierte serielle Bootloader, z.B. beim [[STM32]]. Viele Entwicklungsboards enthalten auch einen On-Board-Debugadapter zum direkten Anschluss an USB, so dass kein externer SWD- oder JTAG-Adapter notwendig ist.&lt;br /&gt;
&lt;br /&gt;
=== Günstige Beispiele zum Einstieg ===&lt;br /&gt;
Ein einfacher JTAG-Adapter für den Parallelport ist der &amp;quot;Wiggler&amp;quot;-kompatible, den man auch einfach selbst bauen kann. Als Software lässt sich unter Windows und Linux [http://openocd.berlios.de/ OpenOCD] (zusammen mit [[GDB]]) oder [http://rowley.co.uk Crossworks ARM] verwenden.  Für USB gibt es ebenfalls OpenOCD-kompatible JTAG-Adapter.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind preiswerte Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG-/-SWD-Programer und Debugger) erhältlich z.B. &#039;&#039;&#039;[http://www.watterott.com/index.php?page=search&amp;amp;keywords=LPCXpresso&amp;amp;cat=&amp;amp;mnf=&amp;amp;x=0&amp;amp;y=0 Watterott]&#039;&#039;&#039;. Siehe dazu auch die Dokumentation von NXP zu den &#039;&#039;&#039;[http://www.nxp.com/documents/leaflet/75016842.pdf LPCXpresso-Entwicklungskits]&#039;&#039;&#039; (PDF), oder diese &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso Beschreibung]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von ST gibt es günstige Entwicklungskits (ca. 20€), mit integriertem ST-Link (Debugger). Zum Beispiel das [http://www.st.com/stm32f4-discovery STM32F4 Discovery Board].&lt;br /&gt;
&lt;br /&gt;
Von Energymicro gibt es [http://www.energymicro.com/tools/efm32-starter-kits Starter Kits] mit integriertem J-Link (Debugger) ab ca. 50 € z.B. das [http://www.energymicro.com/tools/efm32-tiny-gecko-starter-kit EFM32 Tiny Gecko Starter Kit] bei [http://de.mouser.com/ProductDetail/Energy-Micro/EFM32-TG-STK3300/?Energy-Micro/EFM32-TG-STK3300/&amp;amp;qs=sGAEpiMZZMvFPGEOwQcrYyZeaSbmjQvRx7NKUweLQtQ= Mouser]&lt;br /&gt;
&lt;br /&gt;
Der [http://www.segger.com/cms/jlink.html J-Link]-&amp;quot;Emulator&amp;quot; von Segger wird von vielen Softwarepaketen unterstützt und ist für den &amp;quot;nicht-kommerziellen&amp;quot; Einsatz von Studenten, Funkamateuren und Hobby-Bastler für ca. €50.- erhältlich (J-Link-Edu). Sein Umfang ist dabei auf das Flashen des Speichers und das Debuggen beschränkt. Die Trace-Option wie sie bei der PRO-Variante zur Verfügung steht, ist nicht vorhanden. Für den Preis (05/2013) bekommt man jedoch ein ausgewachsenes Werkzeug mit breiter Unterstützung und der Möglichkeit sowohl SWD als auch JTAG in einem Gerät vereint zu haben.&lt;br /&gt;
&lt;br /&gt;
Der ULINK2 von Keil/ARM ist ebenfalls ein wirklich gutes Gerät. Leider ist er nicht ganz so günstig und seine Zusammenarbeit beschränkt sich auf die Arm/Keil IDE µVision. Er benötigt jedoch keine speziellen USB-Treiber sondern nutzt geschickt die Funktionalität der HID-Treiber des Betriebssystems. Das macht ihn sofort auf jedem Windows-Betriebssystem einsatzbereit.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Beschreiben des Flash über JTAG ist oft ein serieller [[Bootloader]] im Controller enthalten. Bei ST werden sie über einen speziellen Pin der MPU aktiviert und sind dank Kompression und das intelligente entfernen redundanter Information, bei der Übertragung genauso schnell wie JTAG/SWD Adapter.&lt;br /&gt;
&lt;br /&gt;
== CMSIS - ARM Cortex Software Libraries  ==&lt;br /&gt;
 &lt;br /&gt;
Der ARM Cortex Microcontroller Software Interface Standard (CMSIS) ist ein herstellerunabhängiger Hardware Abstraction Layer für die Cortex-M-Prozessor -Serie. Dieser ermöglicht konsistente und einfache Software-Schnittstellen für den Prozessor und die Peripherie, und vereinfacht damit die Software-Wiederverwendung. &lt;br /&gt;
&lt;br /&gt;
CMSIS besteht aus folgenden Komponenten:&lt;br /&gt;
&lt;br /&gt;
* CMSIS-CORE: Bietet eine Schnittstelle zum Cortex-M0, Cortex-M3, Cortex-M4, SC000 und SC300-Prozessorkern und Peripherie-Registern.&lt;br /&gt;
* CMSIS-DSP: DSP-Bibliothek mit über 60 Funktionen in Festkomma-(fractional q7, q15, q31) und single precision floating-point (32-bit)-Implementierung&lt;br /&gt;
* CMSIS-RTOS API: Standardisierte Programmierschnittstelle für Echtzeit-Betriebssysteme für Thread-Steuerung, Ressourcen-und Zeitmanagement. Implementierungen gibt es z.B. von Keil ([http://www.keil.com/pack/doc/cmsis_rtx/index.html RTX])&lt;br /&gt;
* CMSIS-SVD: System View Beschreibung -  XML-Dateien, die die Programmiereransicht des kompletten Mikrocontroller-Systems einschließlich Peripheriegeräte enthalten&lt;br /&gt;
&lt;br /&gt;
Der Standard ist für Cortex-M-Mikrocontroller skalierbar: Von der  kleinsten 4 KB MCU bis zu MCUs mit anspruchsvoller Kommunikations-Peripherie wie Ethernet oder USB. Die &amp;quot;Core Peripheral Funktionen&amp;quot; benötigt beispielsweise weniger als 1 KB-Code und weniger als 10 Bytes RAM.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Software Beispiele von [http://www.energymicro.com/downloads/application-notes Energy Micro] basierend auf CMSIS&lt;br /&gt;
&lt;br /&gt;
Mehr Informationen auf der [http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php ARM CMSIS Webseite].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Linksammlung#ARM|Linksammlung (Abschnitt ARM)]]&lt;br /&gt;
* [[LPC1xxx]]&lt;br /&gt;
* [[LPC1xxx_Entwicklungskit_LPCXpresso]]&lt;br /&gt;
* [[Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red]]&lt;br /&gt;
* [[Codebase_f%C3%BCr_LPC1xxx]]&lt;br /&gt;
* [[ARM-elf-GCC-Tutorial]]&lt;br /&gt;
* [[AVR32]]&lt;br /&gt;
* [[Blackfin]]&lt;br /&gt;
* [[AT91SAM9260]]&lt;br /&gt;
* [[STM32]]&lt;br /&gt;
* [[JTAG]]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/EFM32 EFM32]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.mySTM32.de Online Tutorial für den STM32]&lt;br /&gt;
* [http://www.myXMC.de Online Tutorial für den XMC von Infineon]&lt;br /&gt;
* [http://www.myUGL.de Online Tutorial für freie Grafikbibliothek, STM32, STM32F429, TFT, Touch]&lt;br /&gt;
* [http://embdev.net/forum/arm-gcc ARM-GCC Forum] im englischsprachigen &amp;quot;Ableger&amp;quot; von mikrocontroller.net embdev.net u.a. für WinARM, Yagarto, CS Codebench&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-m/index.php Cortex-M Produktseite von ARM]&lt;br /&gt;
* [http://infocenter.arm.com/help/index.jsp Infocenter von ARM Ltd.]&lt;br /&gt;
* [http://www.open-research.org.uk/ARMuC/ ARMuC ARM microcontroller Wiki]&lt;br /&gt;
* [http://chaosradio.ccc.de/cre151.html Chaosradio Express - Die ARM-Architektur]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
*ARM Systems Developer&#039;s Guide (2004) ISBN 1558608745 [http://books.google.de/books?id=HKKUkDQE17QC&amp;amp;output=html Im Buch blättern] [http://www.mkp.com/companions/defaultindividual.asp?isbn=9781558608740 Programmbeispiele aus dem Buch, u.a. FFT, FIR/IIR-Filter, Division, Wurzel]&lt;br /&gt;
*ARM Assembly Language - an Introduction (2007) ISBN 1847536964 [http://books.google.de/books?id=8KJX5R8mMvsC&amp;amp;output=html Im Buch blättern]   [http://www.lulu.com/content/1172076 Verlagsseite &amp;quot;Book on demand&amp;quot;]&lt;br /&gt;
*ARM Rechnerarchitekturen für System-on-Chip-Design (2002) ISBN 3826608542&lt;br /&gt;
*Co-Verification of Hardware and Software for Arm Soc Design (2004) ISBN 0750677309&lt;br /&gt;
*ARM System-on-Chip Architecture (2000) ISBN 0201675196 [http://books.google.de/books?id=J_Fu_YTVD9gC&amp;amp;printsec=frontcover&amp;amp;output=html&amp;amp;source=gbs_summary_r&amp;amp;cad=0 Im Buch blättern]&lt;br /&gt;
*ARM Architecture Reference Manual ISBN 0201737191 [http://books.google.de/books?id=O5G-6WX1xWsC&amp;amp;printsec=frontcover&amp;amp;output=html&amp;amp;source=gbs_summary_r&amp;amp;cad=0 Im Buch blättern]&lt;br /&gt;
*Messen, Steuern und Regeln mit ARM-Mikrocontrollern ISBN 3772340172 [http://books.google.de/books?id=TKs4kN-zNYQC&amp;amp;output=html im Buch blättern]&lt;br /&gt;
*Programming Arm Microcontrollers: Using C and the Lpc2100 Family (2005? /ab 1. Dezember 2008) ISBN 0321263359&lt;br /&gt;
*Arm Assembly: Fundamentals and Techniques (ab 1. März 2009) ISBN 1439806101&lt;br /&gt;
*Reliable Embedded Systems: Using 8051 and ARM Microcontrollers (2007) ISBN 0321252918 600 Seiten mit CD [http://vig.pearsoned.co.uk/catalog/academic/product/0,1144,0321252918-TOC,00.html Inhaltsverzeichnis]&lt;br /&gt;
* C und C++ für Embedded Systems (u.a. ARM Cortex-M3) mitp-Verlag 2008 ISBN 382665949X&lt;br /&gt;
* The Definitive Guide to the Arm Cortex-M0 (Joseph Yiu) Newnes Verlag ISBN 0123854776&lt;br /&gt;
* The Definitive Guide to the Arm Cortex-M3 (Joseph Yiu) Newnes Verlag ISBN 185617963X&lt;br /&gt;
&lt;br /&gt;
== Artikel aus der Kategorie ARM ==&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;ARM&amp;lt;/ncl&amp;gt;&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;EFM32&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/XMCxxxx &#039;&#039;&#039;Infineon XMCxxxx&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Cortex-A ARM Cortex A]&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM| ]]&lt;/div&gt;</summary>
		<author><name>217.86.180.189</name></author>
	</entry>
</feed>