stm32f3discovery

stm32f3discovery

Auf dem Entwicklerbord ist eine single-core ARM Cortex-M4F Prozessor. Er hat 256 KiB "Flash" Speicher und 48 KiB RAM.

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)

Serial Peripheral Interface

Das SPI ist Interface für synchrone und serielle Kommunikation.

Funktionsweise

Es werden alle Teilnehmer an folgenden drei Leitungen angschloseen:

  • SCLK (auch SCK genannt) wird vom Host zur Synchronisation ausgegeben
  • MOSI ist eine Datenleitung vom Host zum Client
  • MISO ist eine Datenleitung vom Client zum Host

Es gibt eine weitere Leitung vom Host zu jedem Client mit dem Namen SS (oft auch CS oder STE genannt). Diese wählt einen Client aus, in dem sie dessen SS Leitung auf null setzt. In dem Folgendem Bild sehen Sie ein möglichen Aufbau. (Ich habe die Begriffe "Master" und "Slave" gegen "Host" und "Client" ausgetauscht. )

SPI Aufbau

Für die Übertragung haben sich folgende vier Modi durchgesetzt:

ModeCPOLCPHA
000
101
210
311

Die Modi werden durch die Parameter "Clock Polarity" (CPOL) und "Clock Phase" (CPHA) festgelegt. Bei CPOL=0 ist der Clock Idle Low, bei CPOL=1 ist der Clock Idle High. Das beutet, dass bei CPOL = 0 ein bit versendet wird, wenn die Clock auf 1 ist.

CPHA gibt an, bei der wievielten Flanke die Daten übernommen werden sollen. Bei CPHA=0 werden sie bei der ersten Flanke übernommen und bei CPHA=1 bei der zweiten. Dies wurde bei dem folgendem Bild visualisiert.

Quelle: Wikipedia

Der Host legt seine Daten immer kurz nach der fallenden Flanke von SCK an.