ARM Embedded Tutorial - Simple GPIO on and off output/de
│ 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
- Übersichtseite ARM Embedded Tutorials/de
Autor: Mathias