Forum: Mikrocontroller und Digitale Elektronik STM32 GPIO setzen, löschen, abfragen


von Heikon (Gast)


Lesenswert?

hi,
als Einsteiger beschäftige ich mich gerade mit den GPIOs.
Dazu habe ich folgende Frage:

Um einen Pin zu setzen oder zu löschen gibts ja 3 Möglichkeiten:

1. Berechnung der Bit-Band Adresse des entsprechenden Pins und diesen
direkt setzen (soll am schnellsten gehen)

2. Per Befehl GPIOx->ODR = 00001000;

3. Per BSRR Register

Welche Unterschiede haben die Möglichkeiten 2 und 3....??
Beide greifen auf das ODR zu und setzen / löschen den Pin.

Warum nutzt man nicht immer den Bit-Band Zugriff?
Da der Compiler ja die meiste Arbeit übernimmt ist das zeit- und
codemäßig die schnellste und effektivste Lösung!

Und wofür benötige ich eigentlich 3 Register, um einen vordefinierten
PortPin zu setzen, zu lesen, zu löschen?? Ja ich weiß, dass hat ST so
gemacht, aber ich erkenne keinen Sinn dabei.
Ein normales PortDataRegister hätte doch ausgereicht, um auch
verschiedenste Einstellungen (Input, Output OD, PP) an einem Port zu
realisieren.

Vielen Dank für eure Hilfe.

Heiko

@Moderator: habe den beitrag mit einem anderen Betreff nochmal 
eingestellt, war so per Suchen in Betreff nicht auffindbar.
Wenn dann bitte den Beitrag mit "STM32L1xx, ..." löschen und nicht 
diesen hier

von Hannes S. (Gast)


Lesenswert?

Wenn man ein einzelnes Bit im ODR setzen will, ohne die anderen zu 
verändern dann ist der Zugriff langsam, da man erst das ODR lesen 
müsste, den gelesenen Wert ver-odern, dann wieder schreiben müsste.
Deshalb hat ST das BSRR/BRR eingebaut - hier kann das Bit verändert 
werden, ohne dass man vorher lesen muss.

Den gleichen Effekt hat auch das Bitbanding, eigentlich bräuchte man 
daher das BSRR/BRR nicht. Ich meine aber irgendwo gelesen zu haben, dass 
Bitbanding einen Tick langsamer ist, ich selbst benutze immer den 
Zugriff über BSRR/BRR.

Ausserdem könnte es auch sein, dass ST einfach die GPIOs vom STM8 
übernommen hat und da war das halt damals so realisiert...

von Turbo J (Gast)


Lesenswert?

> Warum nutzt man nicht immer den Bit-Band Zugriff?

Weil auch der intern einen load-modify-store Zyklus über den Bus fahren 
muss. Bei BSRR/BRR brauchts nur einen store-Zyklus auf dem Bus.


Außerdem kann man mit Bit-Band nicht mehrere Bits auf einmal 
setzen/löschen.

von ZiZi (Gast)


Lesenswert?

Heikon schrieb:
> hi,

> Welche Unterschiede haben die Möglichkeiten 2 und 3....??
> Beide greifen auf das ODR zu und setzen / löschen den Pin.
>
> Warum nutzt man nicht immer den Bit-Band Zugriff?
> Da der Compiler ja die meiste Arbeit übernimmt ist das zeit- und
> codemäßig die schnellste und effektivste Lösung!
>

Der Compiler tut da gar nix, das ist alles hardwaremässig verdrahtet.

> Und wofür benötige ich eigentlich 3 Register, um einen vordefinierten
> PortPin zu setzen, zu lesen, zu löschen?? Ja ich weiß, dass hat ST so
> gemacht, aber ich erkenne keinen Sinn dabei.

Doch, der Sinn ist der dass wir hier miteinenander sprechen ;-).

> Ein normales PortDataRegister hätte doch ausgereicht, um auch
> verschiedenste Einstellungen (Input, Output OD, PP) an einem Port zu
> realisieren.
>

Stimmt. Aber die verschiedenen Möglichkeiten haben schon ihren Sinn.
Die Unterschiede hat vorher auch schon jemand erklärt.

In den meisten Fällen wird ein Halbleiterhersteller die Periperhieblöcke
einfach von einer Vorgängergeneration oder von einem anderen Typ
übernehmen, was äusserst sinnvoll ist, auch speziell für die Anwender,
die bereits Software für einen verwandten Controller haben und sich eher
an einer bugfreien Hardware freuen dürfen, als wenn immer
alles neu wiedererfunden würde.

Bit-banding ist eine Spezialität des M3. Kann Vor- und Nachteile
bez. Portabilität haben. Ich würde es eher nicht verwenden,
da man mit Verwendung der Register eher im "Kontext" bleibt, d.h
für die Initialisierung des betreffenden I/O Blocks muss man
sowieso die Register beschreiben, warum dann nicht auch für die
Ein/Ausgabe selbst. Mit BB würde ich sagen, kommt man eher
durch den Hintereingang. Aber letztlich ist das Ganze Geschmackssache.

Nachteil ist halt, das es für Neulinge jetzt halt 10-mal solange
dauert, die verschiedenen Möglichkeiten zu erfassen.

ZiZi



> Vielen Dank für eure Hilfe.
>
> Heiko
>
> @Moderator: habe den beitrag mit einem anderen Betreff nochmal
> eingestellt, war so per Suchen in Betreff nicht auffindbar.
> Wenn dann bitte den Beitrag mit "STM32L1xx, ..." löschen und nicht
> diesen hier

von (prx) A. K. (prx)


Lesenswert?

ZiZi schrieb:

> Bit-banding ist eine Spezialität des M3. Kann Vor- und Nachteile
> bez. Portabilität haben. Ich würde es eher nicht verwenden,
> da man mit Verwendung der Register eher im "Kontext" bleibt,

Bei I/O-Portbits ist es unnötig, dank BSRR/BRR.

In anderen Fällen kann BB als ununterbrechbare Bitmanipulation einen 
entscheidenden Vorteil gegenüber explizitem read-modify-write haben. 
Beispielsweise wenn ein Register im Hauptprogramm und in einem 
Interrupt-Handler manipuliert wird.

von Heikon (Gast)


Lesenswert?

Alles klar, danke schön für die schnellen Erklärungen.

von Peter D. (peda)


Lesenswert?

Hannes S. schrieb:
> Den gleichen Effekt hat auch das Bitbanding, eigentlich bräuchte man
> daher das BSRR/BRR nicht. Ich meine aber irgendwo gelesen zu haben, dass
> Bitbanding einen Tick langsamer ist, ich selbst benutze immer den
> Zugriff über BSRR/BRR.

Man kann aber über Bitbanding gleichzeitg setzen und löschen, z.B. die 4 
IO-Pins für den Datenbus zum LCD.
Mit BSRR/BRR muß man erst die 0- und 1-Bits separieren und die 0-Bits 
invertieren.


Peter

von Ulrich P. (uprinz)


Lesenswert?

Neben den Gründen, die hier schon genannt wurden gibt es noch weitere, 
deren Existenzberechtigung im Anwendungsbereich des CortexM3 liegt.
Es ist eine CPU, die speziell für machine-control geschaffen wurde.

So bietet das BSRR die Möglichkeit, dass man zuerst einmal in mehreren 
Zyklen eine neue Konfiguration eines GPIO Ports zusammen stellt, in dem 
man die zu setzenden und zu löschenden Bits in der entsprechenden Hälfte 
dieses Registers vorbereitet. Dann schreibt man das BSRR Register und 
alle bits werden sychron umgeschaltet. Das ist gerade dann interessant, 
wenn man andere Hardware ansprechen oder irgend einen Bus emulieren 
will.

Eine Frage war noch, warum ein GPIO für ein Signal verschieden Bits hat, 
die seinen Zustand repräsentieren. Es gibt einmal ein Register ODR, das 
sagt, wie ein Pin gesetzt ist, also wie die Software ihn per Zugriff auf 
ODR,BSRR,BRR eingestellt hat. Dann gibt es noch das INR, dass den 
tatsächlichen Zustand des Signals wiedergibt. Das hat durchaus Sinn, 
denn man kann einen Pin auch als OD (open Drain) konfigurieren, also so, 
dass er nuch aktiv nach GND ziehen kann, aber nicht nach VCC. Damit kann 
man den Pin auf 1 setzen, aber eine angeschlossene Peripherie darf ihn 
auf 0 halten, z.B. bis sie so weit ist, weitere Daten zu verarbeiten. 
I2C ist ein Bus der auf diesem Prinzip basiert.

Oft ist es nicht der komplette Zugriff auf einen GPIO, der von einem 
Interrupt so gestört werden könnte, dass etwas daran angeschlossenes 
nicht mehr zuverlässig funktioniert, sondern das Timing beim Zugriff 
selbst. Es ist, dank BSRR nicht mehr erforderlich extra die Interrupts 
zu sperren um eine synchrone Änderung des GPIO zu erreichen.

Gruß, Ulrich

von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:

> Man kann aber über Bitbanding gleichzeitg setzen und löschen, z.B. die 4
> IO-Pins für den Datenbus zum LCD.

Nur Bit für Bit einzeln.

> Mit BSRR/BRR muß man erst die 0- und 1-Bits separieren und die 0-Bits
> invertieren.

Das BSRR kann Bits sowohl setzen als auch löschen, wobei setzen gewinnt 
wenn beides für das gleiche Bit verlangt wird. Damit lassen sich über
  port->BSRR = 0x000F0000 | data;
alle 4 Datenbits auf den Portbits 0..3 gleichzeitig setzen.

von Cell1985266 (Gast)


Lesenswert?

wenn ich aber  zwei BSRR befehle mache, einen für GPIOE_Pin1 und danach 
ein BSRR auf GPIOE_Pin2

dann leuchten keine der beiden LED's
wenn ich aber nur einen mache dann leuchte die entsprechende LED.

woran liegt das ?

von (prx) A. K. (prx)


Lesenswert?

Woher soll jemand ausser dir wissen, was genau du machst?
Soll heissen: Zeig den entsprechenden Code.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.