Difference between revisions of "ARM Embedded Tutorial - Simple GPIO on and off output/de"

From Free Pascal wiki
Jump to navigationJump to search
(One intermediate revision by the same user not shown)
Line 1: Line 1:
{{Translate}}
+
{{LanguageBar}}
  
 
=Einfache GPIO Ein und Aus-gabe=
 
=Einfache GPIO Ein und Aus-gabe=
 +
 
Ein Port besteht aus '''16''' Pins, aus diesem Grund sind bei den meisten Register die unteren '''16Bit''' belegt.<br>
 
Ein Port besteht aus '''16''' Pins, aus diesem Grund sind bei den meisten Register die unteren '''16Bit''' belegt.<br>
 
Ausnahme '''CRx''' und '''BSRR''', Bei '''BSRR''' kann man die oberen 16Bit brauchen, um Pins zu setzten.
 
Ausnahme '''CRx''' und '''BSRR''', Bei '''BSRR''' kann man die oberen 16Bit brauchen, um Pins zu setzten.
  
 
== Register für Portzugriff ==
 
== Register für Portzugriff ==
 +
 
Für GPIO-Zugriffer, stehen folgende Register zu Verfügung:
 
Für GPIO-Zugriffer, stehen folgende Register zu Verfügung:
 
* '''CRL''' - Funktions-Register LOW.
 
* '''CRL''' - Funktions-Register LOW.
Line 11: Line 13:
 
* '''IDR''' - Input Data Register
 
* '''IDR''' - Input Data Register
 
* '''ODR''' - Output Data Register
 
* '''ODR''' - Output Data Register
* '''BSRR''' - Bit Reset Register
+
* '''BSRR''' - Bit Set Reset Register
* '''BRR''' - Bit Set Reset Register
+
* '''BRR''' - Bit Reset Register
 
* '''LCKR''' - Port Configuration Lock Register
 
* '''LCKR''' - Port Configuration Lock Register
 +
 
Bei allen Register bis auf '''CRL''' und '''CRH''', entspricht jedes Bit des Pin des Controllers.
 
Bei allen Register bis auf '''CRL''' und '''CRH''', entspricht jedes Bit des Pin des Controllers.
  
 
==GPIO einschalten==
 
==GPIO einschalten==
 +
 
Bevor man man auf die GPIO zugreifen kann, müssen diese eingeschalten werden.<br>Ohne die ist '''kein''' Zugriff möglich !
 
Bevor man man auf die GPIO zugreifen kann, müssen diese eingeschalten werden.<br>Ohne die ist '''kein''' Zugriff möglich !
 
Dies geschieht folgendermassen für die PortA - PortC.
 
Dies geschieht folgendermassen für die PortA - PortC.
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
RCC.APB2ENR := RCC.APB2ENR or (%111 shl 2);
 
RCC.APB2ENR := RCC.APB2ENR or (%111 shl 2);
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 25: Line 30:
 
==Direkte Portmanipulation==
 
==Direkte Portmanipulation==
  
Bevor man einen GPIO-Pin auf '''HIGH''' schalten kann, muss man diesen als Ausgang konfigurieren. Dies geht über die Register '''CRL''' und '''CRH'''.<br>
+
Bevor man einen GPIO-Pin auf '''HIGH''' schalten kann, muss man diesen als Ausgang konfigurieren. Dies geht über die Register '''CRL''' und '''CRH'''.
Ich habe für diese Mini-Beispiele meistens den '''PortC Pin13''' gewählt, da an diesem die LED des STM32F103C angeschlosssen ist.<br>
+
 
 +
Ich habe für diese Mini-Beispiele meistens den '''PortC Pin13''' gewählt, da an diesem die LED des STM32F103C angeschlosssen ist.
 +
 
 
'''Achtung:''' Die LED leuchtet '''inventiert''', da die Anode an der Stromversorgung hängt.
 
'''Achtung:''' Die LED leuchtet '''inventiert''', da die Anode an der Stromversorgung hängt.
 +
 
=== '''CRx''' - Pin-Funktion einstellen ===
 
=== '''CRx''' - Pin-Funktion einstellen ===
 +
 
Für die Funktionseinstellung steht pro Pin ein Nibble (4Bit) zu Verfügung.
 
Für die Funktionseinstellung steht pro Pin ein Nibble (4Bit) zu Verfügung.
 
Pin13 an PortC auf Ausgabe. Da '''13''' höher als '''7''' ist, wird dafür das HIGH-Register '''CRH''' verwendet.
 
Pin13 an PortC auf Ausgabe. Da '''13''' höher als '''7''' ist, wird dafür das HIGH-Register '''CRH''' verwendet.
 
'''13 - 8 = 5'''; Somit ist es das fünfte Nibble in '''CHR'''.  
 
'''13 - 8 = 5'''; Somit ist es das fünfte Nibble in '''CHR'''.  
 
Pin0 - Pin7 würde man mit '''CHL''' konfigurieren.
 
Pin0 - Pin7 würde man mit '''CHL''' konfigurieren.
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
PortC.CRH := $00300000;  
 
PortC.CRH := $00300000;  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
=== '''IDR''' - Ganzer Port auslesen ===
 
=== '''IDR''' - Ganzer Port auslesen ===
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
// Ist Pin13 HIGH ?
 
// Ist Pin13 HIGH ?
 
Result := PortC.ODR and (1 shl 13) > 0;  
 
Result := PortC.ODR and (1 shl 13) > 0;  
Line 43: Line 55:
  
 
=== '''ODR''' - Ganzer Port beschreiben ===
 
=== '''ODR''' - Ganzer Port beschreiben ===
 +
 
Mit dieser Funktion, wird der '''ganze''' Port auf einmal beschrieben.
 
Mit dieser Funktion, wird der '''ganze''' Port auf einmal beschrieben.
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
// Nur Pin13 wird auf HIGH gestellt.
 
// Nur Pin13 wird auf HIGH gestellt.
 
PortC.ODR := 1 shl 13;  
 
PortC.ODR := 1 shl 13;  
Line 54: Line 67:
  
 
=== '''BSRR''' - Einzelne Pin auf LOW ===
 
=== '''BSRR''' - Einzelne Pin auf LOW ===
 +
 
Mit dieser Funktion, kann man einzelne Pins auf '''LOW''' stellen.
 
Mit dieser Funktion, kann man einzelne Pins auf '''LOW''' stellen.
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
// Stellt nur Pin13 auf LOW, die anderen bleiben unverändert.
 
// Stellt nur Pin13 auf LOW, die anderen bleiben unverändert.
 
PortC.BSRR := 1 shl 13;  
 
PortC.BSRR := 1 shl 13;  
Line 61: Line 76:
  
 
=== '''BSRR''' - Ganzer Port anhand der Bit-Maske ändern ===
 
=== '''BSRR''' - Ganzer Port anhand der Bit-Maske ändern ===
 +
 
Mit dieser Funktion, kann man einzelne Pins auf '''LOW''' stellen.
 
Mit dieser Funktion, kann man einzelne Pins auf '''LOW''' stellen.
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
// Stellt nur Pin13 auf LOW, PIN12 auf HIGH, die anderen bleiben unverändert.
 
// Stellt nur Pin13 auf LOW, PIN12 auf HIGH, die anderen bleiben unverändert.
 
PortC.BSRR := (1 shl 13) + ((1 shl 12) shl 16);  
 
PortC.BSRR := (1 shl 13) + ((1 shl 12) shl 16);  
Line 68: Line 85:
  
 
=== '''BRR''' - Einzelne Pin auf HIGH ===
 
=== '''BRR''' - Einzelne Pin auf HIGH ===
 +
 
Mit dieser Funktion, kann man einzelne Pins auf '''HIGH''' stellen.
 
Mit dieser Funktion, kann man einzelne Pins auf '''HIGH''' stellen.
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
// Stellt nur Pin13 auf HIGH, die anderen bleiben unverändert.
 
// Stellt nur Pin13 auf HIGH, die anderen bleiben unverändert.
 
PortC.BSRR := 1 shl 13;  
 
PortC.BSRR := 1 shl 13;  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
Die oberen 16 Bit von '''BSRR''' entsprechen den 16Bit von '''BRR'''.
 
Die oberen 16 Bit von '''BSRR''' entsprechen den 16Bit von '''BRR'''.
  
 
== Siehe auch ==
 
== Siehe auch ==
 +
 
* Übersichtseite [[ARM Embedded Tutorial/de]]
 
* Übersichtseite [[ARM Embedded Tutorial/de]]
  
Line 83: Line 104:
 
[[Category:ARM]]
 
[[Category:ARM]]
 
[[Category:Arduino]]
 
[[Category:Arduino]]
 +
{{AutoCategory}}

Revision as of 08:35, 21 January 2020

Deutsch (de) English (en) русский (ru)

Einfache GPIO Ein und Aus-gabe

Ein Port besteht aus 16 Pins, aus diesem Grund sind bei den meisten Register die unteren 16Bit belegt.
Ausnahme CRx und BSRR, Bei BSRR kann man die oberen 16Bit brauchen, um Pins zu setzten.

Register für Portzugriff

Für GPIO-Zugriffer, stehen folgende Register zu Verfügung:

  • CRL - Funktions-Register LOW.
  • CRH - Funktions-Register HIGH.
  • IDR - Input Data Register
  • ODR - Output Data Register
  • BSRR - Bit Set Reset Register
  • BRR - Bit Reset Register
  • LCKR - Port Configuration Lock Register

Bei allen Register bis auf CRL und CRH, entspricht jedes Bit des Pin des Controllers.

GPIO einschalten

Bevor man man auf die GPIO zugreifen kann, müssen diese eingeschalten werden.
Ohne die ist kein Zugriff möglich ! Dies geschieht folgendermassen für die PortA - PortC.

RCC.APB2ENR := RCC.APB2ENR or (%111 shl 2);

Direkte Portmanipulation

Bevor man einen GPIO-Pin auf HIGH schalten kann, muss man diesen als Ausgang konfigurieren. Dies geht über die Register CRL und CRH.

Ich habe für diese Mini-Beispiele meistens den PortC Pin13 gewählt, da an diesem die LED des STM32F103C angeschlosssen ist.

Achtung: Die LED leuchtet inventiert, da die Anode an der Stromversorgung hängt.

CRx - Pin-Funktion einstellen

Für die Funktionseinstellung steht pro Pin ein Nibble (4Bit) zu Verfügung. Pin13 an PortC auf Ausgabe. Da 13 höher als 7 ist, wird dafür das HIGH-Register CRH verwendet. 13 - 8 = 5; Somit ist es das fünfte Nibble in CHR. Pin0 - Pin7 würde man mit CHL konfigurieren.

PortC.CRH := $00300000;

IDR - Ganzer Port auslesen

// Ist Pin13 HIGH ?
Result := PortC.ODR and (1 shl 13) > 0;

ODR - Ganzer Port beschreiben

Mit dieser Funktion, wird der ganze Port auf einmal beschrieben.

// Nur Pin13 wird auf HIGH gestellt.
PortC.ODR := 1 shl 13; 

// Alle Pin auf LOW.
PortC.ODR := 0;

BSRR - Einzelne Pin auf LOW

Mit dieser Funktion, kann man einzelne Pins auf LOW stellen.

// Stellt nur Pin13 auf LOW, die anderen bleiben unverändert.
PortC.BSRR := 1 shl 13;

BSRR - Ganzer Port anhand der Bit-Maske ändern

Mit dieser Funktion, kann man einzelne Pins auf LOW stellen.

// Stellt nur Pin13 auf LOW, PIN12 auf HIGH, die anderen bleiben unverändert.
PortC.BSRR := (1 shl 13) + ((1 shl 12) shl 16);

BRR - Einzelne Pin auf HIGH

Mit dieser Funktion, kann man einzelne Pins auf HIGH stellen.

// Stellt nur Pin13 auf HIGH, die anderen bleiben unverändert.
PortC.BSRR := 1 shl 13;

Die oberen 16 Bit von BSRR entsprechen den 16Bit von BRR.

Siehe auch

Autor: Mathias