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.
Port | Adressenbereich | Größe |
---|---|---|
A | 0x4800_0000 - 0x4800_03FF | 1 K |
B | 0x4800_0400 - 0x4800_07FF | 1 K |
C | 0x4800_0800 - 0x4800_0BFF | 1 K |
D | 0x4800_0C00 - 0x4800_0FFF | 1 K |
E | 0x4800_1000 - 0x4800_13FF | 1 K |
F | 0x4800_1400 - 0x4800_17FF | 1 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.
Bit | 0-1 | 2-3 | 4-5 | 6-7 | 8-9 | 10-11 | 12-13 | 14-15 | 16-17 | 18-19 | 20-21 | 22-23 | 24-25 | 26-27 | 28-29 | 30-31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Port | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Wert | Mode |
---|---|
0b00 | Eingabe |
0b01 | Ausgabe |
0b10 | Alternativer FN Mode |
0b11 | Analog |
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.
Bit | 0-1 | 2-3 | 4-5 | 6-7 | 8-9 | 10-11 | 12-13 | 14-15 | 16-17 | 18-19 | 20-21 | 22-23 | 24-25 | 26-27 | 28-29 | 30-31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Port | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Wert | Mode |
---|---|
0b00 | Low speed |
0b01 | Medium Speed |
0b10 | Low speed |
0b11 | High 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.
Bit | 0-1 | 2-3 | 4-5 | 6-7 | 8-9 | 10-11 | 12-13 | 14-15 | 16-17 | 18-19 | 20-21 | 22-23 | 24-25 | 26-27 | 28-29 | 30-31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Port | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Wert | Mode |
---|---|
0b00 | kein Vorwiderstand |
0b01 | Pull-up |
0b10 | Pull-Down |
0b11 | Reserviert |
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.
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. )
Für die Übertragung haben sich folgende vier Modi durchgesetzt:
Mode | CPOL | CPHA |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
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.
Der Host legt seine Daten immer kurz nach der fallenden Flanke von SCK an.