General-purpose I/Os (GPIO)

Die Pins sind in Ports unterteilt. Dabei hat jeder Port 16 Pins. Die Ports sind nach den Buchstaben A, B, C, ... benannt. Die Pins werden von 0 bis 15 benannt. Jeder Pin kann als Input oder Output konfiguriert werden. Dabei kann man pull-up und pull-down Widerstände einstellen. Man kann außerden die Geschwindigkeit ändern. Die Pins sind besonders schnell. Sie können alle 2 clock cycles 1 gesetzt werden.

Jerder Port hat 10 32-bit Register. Davon sind 4 zur Konfiguration (GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR und GPIOx_PUPDR), zwei Datenregister (GPIOx_IDR und GPIOx_ODR), ein set / reset Register (GPIOx_BSRR), ein Register um die Pins zu Sperren (GPIOx_LCKR) und zwei weitere Register für alternative funktionen (GPIOx_AFRH and GPIOx_AFRL).

Die Register der Ports A bis F sind folgender Tabelle zu entnehmen.

PortAdressenbereichGröße
A0x4800_0000 - 0x4800_03FF1 K
B0x4800_0400 - 0x4800_07FF1 K
C0x4800_0800 - 0x4800_0BFF1 K
D0x4800_0C00 - 0x4800_0FFF1 K
E0x4800_1000 - 0x4800_13FF1 K
F0x4800_1400 - 0x4800_17FF1 K

GPIO port mode register (GPIOx_MODER)

Dieser Register ist am Offset 0x00 zu finden. Der Rigister wird benutzt um den IO Modus festzulegen. Jeder Mode wird mit 2 Bits spezifiziert. So können mit den 32 Bit alle 16 Pins angesprochen werden. Die folgende Tabellen Spezifizieren die Konfigurationsmöglichkeiten.

Bit0-12-34-56-78-910-1112-1314-1516-1718-1920-2122-2324-2526-2728-2930-31
Port0123456789101112131415
WertMode
0b00Eingabe
0b01Ausgabe
0b10Alternativer FN Mode
0b11Analog

Anmerkung: Auf dem STM32F303xB/xC und STM32F358x werden 0b10 und 0b11 nicht unterstützt.

GPIO port output type register (GPIOx_OTYPER)

Dieser Register ist am Offset 0x04 zu finden. Bit 16 bis 31 sind Reserviert und sollten nicht genutzt werden. In Bit 0 bis 15 kann man zwischen den Ausgabe Typen

  • 0: Output push-pull (Standard)
  • 1: Output open-drain2

entscheiden.

GPIO port output speed register (GPIOx_OSPEEDR)

Dieser Register ist am Offset 0x08 zu finden. Dieser Register wird benutzt um die Ausgabegeschwindigkeit festzulegen. Jeder Mode wird mit 2 Bits spezifiziert. So können mit den 32 Bit alle 16 Pins angesprochen werden. Die folgende Tabellen Spezifizieren die Konfigurationsmöglichkeiten.

Bit0-12-34-56-78-910-1112-1314-1516-1718-1920-2122-2324-2526-2728-2930-31
Port0123456789101112131415
WertMode
0b00Low speed
0b01Medium Speed
0b10Low speed
0b11High speed

GPIO port pull-up/pull-down register (GPIOx_PUPDR)

Dieser Register ist am Offset 0x0C zu finden. Dieser Register wird benutzt um die Vorwiderstände zu schalten. Jeder Mode wird mit 2 Bits spezifiziert. So können mit den 32 Bit alle 16 Pins angesprochen werden. Die folgende Tabellen Spezifizieren die Konfigurationsmöglichkeiten.

Bit0-12-34-56-78-910-1112-1314-1516-1718-1920-2122-2324-2526-2728-2930-31
Port0123456789101112131415
WertMode
0b00kein Vorwiderstand
0b01Pull-up
0b10Pull-Down
0b11Reserviert

GPIO port input data register (GPIOx_IDR)

Dieser Register ist am Offset 0x10 zu finden. Bit 16 bis 31 sind Reserviert und sollten nicht genutzt werden. Aus Bit 0 bis 15 kann man die jeweiligen Eingabewerte des Ports lesen. Es besteht keine Schreibberechtigung.

GPIO port output data register (GPIOx_ODR)

Dieser Register ist am Offset 0x14 zu finden. Bit 16 bis 31 sind Reserviert und sollten nicht genutzt werden. In Bit 0 bis 15 kann man die jeweiligen Ausgaben des Ports schreiben.

GPIO port bit set/reset register (GPIOx_BSRR)

Dieser Register ist am Offset 0x18 zu finden. Bit 0 bis 15 werden genutzt, um den entsprechenden Pin zu setzten. Bit 16 bis 31 werden genutzt, um um den entsprechenden Pin auf 0 zurück zu setzten. Es gibt keine Leseberechtigung in dem Register. Bei einem Leseversuch wird 0 zurück gegeben.

GPIO port configuration lock register (GPIOx_LCKR)

Das Sperren von Registern unterstützte ich anfangs auch nicht. Eine Beschreibung wird später hinzugefügt.

GPIOx_AFRL und GPIOx_AFRH

Diese Register unterstützte ich Erstmal nicht. Eine Beschreibung wird später hinzugefügt.

GPIO port bit reset register (GPIOx_BRR)

Dieser Register ist am Offset 0x28 zu finden. Bit 16 bis 31 sind Reserviert und sollten nicht genutzt werden. Bit 0 bis 15 werden genutzt, um die Ausgabe auf 0 zusetzten. Dazu muss in dem Bit 1 geschrieben werden. Bei 0 wird keine Aktion ausgeführt.


Meine Implementierung finden Sie hier und die Dokumentation hier.


1

Clock cycles dienen zur Synchronisation der CPU. 2: (Open-Collector-Ausgang)