Forum: Mikrocontroller und Digitale Elektronik STM32F103 Wann GOIO_ODR,PIOBSRR und BRR?!


von kein gast (Gast)


Lesenswert?

Wann benutzt man was und wieso soll das andere nicht genutzt werden laut 
Datenblatt...ist aber dennoch vorhanden!?!
GPIO_ODR
PIO_BSRR
PIO_BRR


Wo ist der Unterschied bei
PIO_BSRR
PIO_BRR?

von Gerd P. (litart)


Lesenswert?

Hallo Unbekannter,

es wäre nett wenn Du uns nicht groß suchen lässt sondern uns einen Teil 
der Arbeit abnimmst Dir zu helfen.

Bitte einen Link auf das Datenblatt auf das Du Dich beziehst und einen 
Hinweis auf die entscheidenden Textpassagen (wie Seitenzahl, 
Kapitel.Unterpunkt).
Ich habe z.B. das DAtenblatt "DocID13587 Rev 17" vom August 2015.

Gruß
Gerd

von RTFM (Gast)


Lesenswert?

siehe Referenzmanual RM0008 s. 159
"Each I/O port bit is freely programmable, however the I/O port 
registers have to be
accessed as 32-bit words (half-word or byte accesses are not allowed). 
The purpose of the
GPIOx_BSRR and GPIOx_BRR registers is to allow atomic read/modify 
accesses to any of
the GPIO registers. This way, there is no risk that an IRQ occurs 
between the read and the
modify access."

und s. 173 für die Register

von kein gast (Gast)


Lesenswert?

Ich war davon ausgegangen das der Controller so bekannt ist, das das Ref 
nicht erforderlich ist..
Ich war auch davon ausgegangen das es bei allen oder vielen STM32 gleich 
ist
https://www.st.com/resource/en/reference_manual/cd00171190.pdf

von RTFM (Gast)


Lesenswert?

kein gast schrieb:
> Ich war auch davon ausgegangen das es bei allen oder vielen STM32 gleich
> ist

Ja ist auch so, und die Antwort auf deine Fragen findest du auch u. a. 
in dem von dir verlinkten Dokument

von kein gast (Gast)


Lesenswert?

da ich es aber offenbar nicht oder falsch verstehe..Frage 
ich..verstehste?!
Vielleicht kommen ja noch hilfreiche Antworten von anderen.

von RTFM (Gast)


Lesenswert?

kein gast schrieb:
> da ich es aber offenbar nicht oder falsch verstehe..Frage
> ich..verstehste?!

Was genau denn an der oben zitierten Passage verstehst du nicht?

Auf das OutputDataRegister(ODR) kann 32-Bit-Word weise lesend und 
schreibend zugegriffen werden. Wenn du jetzt ein einzelnes Bit hier 
ändern willst, musst du das Register ins RAM kopieren, das Bit ändern 
und das modifzierte Wort zurück in das Register schreiben. Wenn jetzt 
genau nach dem kopieren des Registers ins RAM ein Interrupt ausgelöst 
wird, in dessen Routine z.B. ein anderer Output-Pin gesetzt wird, ist 
nach der Interruptroutine die Sicherung des ODR im RAM nicht mehr 
aktuell und würde dann den Output-Pin wieder zurücksetzen.

Daher setzt man Bits über das BitSetResetRegister (BSRR). Damit kann das 
nicht passieren. Welches Bit hier welche Bedeutung hat um den Pin zu 
setzten oder zu löschen ist dem Referenzmanual zu entnehmen.
Mit dem BitResetRegister (BRR) funktioniert im Prinzip genauso wie das 
BSRR, nur das hier nur gelöscht werden kann und die indizierung im 
Register eine andere ist.

von kein gast (Gast)


Lesenswert?

und wofür benutze ist dann BSRR wenn es mit BRR auch geht?

Bei den meisten Beispielen finde ich immer ODRB != ODRB, nie BRRB != 
BRRB
um Leds zu toggeln z.B.

von NichtWichtig (Gast)


Lesenswert?

kein gast schrieb:
> Wo ist der Unterschied bei
> PIO_BSRR
> PIO_BRR?

Das S nicht gesehen ?

von RTFM (Gast)


Lesenswert?

kein gast schrieb:
> und wofür benutze ist dann BSRR wenn es mit BRR auch geht?

Schaue dir im RM die Register an. Das BSRR kann setzten und löschen, das 
BRR kann nur löschen. Beim BSRR löscht man jedoch z.B. Port 0 mit Bit 
16, beim BRR Port 0 mit Bit 0.

kein gast schrieb:
> Bei den meisten Beispielen finde ich immer ODRB != ODRB, nie BRRB !=
> BRRB

BRRB != BRRB würde auch nicht funktionieren. Lese im RM wie der Zugriff 
funktioniert. Für "sauberes" Toggeln müsst man sowas machen
GPIOX->BSRR = (GPIOX->ODR ^ GPIO_PIN_xx) | (GPIO_PIN_xx << 16);

von RTFM (Gast)


Lesenswert?

RTFM schrieb:
> GPIOX->BSRR = (GPIOX->ODR ^ GPIO_PIN_xx) | (GPIO_PIN_xx << 16);

oder auch nicht. Naja so ähnlich

von (Gast)


Lesenswert?

kein gast schrieb:
> und wofür benutze ist dann BSRR wenn es mit BRR auch geht?

In BRR muss man etwas anderes reinschreiben um den "S" Effekt zu haben.

> Bei den meisten Beispielen finde ich immer ODRB != ODRB, nie BRRB !=
> BRRB
> um Leds zu toggeln z.B.

BRR und BSRR lässt sich nicht lesen, das ist dazu da, atomar Bits zu 
setzen oder zu löschen. Atomar heisst, dass nichts dazwischenfunken 
kann.

In Wirklichkeit passiert etwas in der Art wenn man BRR schreibt:

* ODR wird eingelesen
* die Bits die man in BRR in den unteren 16 Bit gesetzt hat werden 
gesetzt, die Bits die in den oberen 16 Bit gesetzt hat werden gelöscht
* Neuer Wert wird nach ODR zurückgeschrieben.

Führt man das in Software aus benötigt man da gut und gerne 5-10 
Maschinenbefehle je nach dem was man genau macht. Diese Sequenz kann 
durch einen Interrupt unterbrochen werden. Wird im Interrupt dann der 
selbe Port benutzt (sprich Pins getoggelt o.ä.) gehen diese Änderungen 
verloren wenn die Sequenz nach Ende des Interrupts fortgesetzt wird.

Daher müsste man korrekterweise immer die Unterbrechungsanforderungen 
sperren, dann ODR manipulieren, dann die Unterbrechungsanforderungen 
wieder zulassen bzw. den vorherigen Zustand restaurieren. Das ist recht 
aufwändig und kostet auch einiges an Rechenzeit, darum gibt es den BRR 
uns BSRR Mechanismus, der das in Hardware erledigt, und nicht 
unterbrochen werden kann.

von (Gast)


Lesenswert?

rµ schrieb:
> kein gast schrieb:
>> und wofür benutze ist dann BSRR wenn es mit BRR auch geht?

möglicherweise habe ich BSRR und BRR vertauscht. sorry.

von kein gast (Gast)


Lesenswert?

also entspricht das schalten der Pins bei einem ATmega eher den GPIO_ODR 
Befehl?
Und das BSRR und BRR ist eher eine verbesserte Variante? Ähnlich wie bei 
der ATXMega Serie?

von kein gast (Gast)


Lesenswert?

???

von Stefan F. (Gast)


Lesenswert?

kein gast schrieb:
> also entspricht das schalten der Pins bei einem ATmega eher den GPIO_ODR
> Befehl?

Die GPIO_ODR Register entsprechen den PORT Registern der AVR 
Mikrocontroller.

> Und das BSRR und BRR ist eher eine verbesserte Variante? Ähnlich wie bei
> der ATXMega Serie?

"Verbessert" ist relativ. Damit kannst du einzelne Bits ändern, ohne das 
GPIO_ODR Register vorher lesen zu müssen. Dadurch entfällt die sonst 
notwendige UND bzw ODER Verknüpfung mit dem alten Zustand.

Die AVR können das mit ihren CBI und SBI Befehlen auch, welche der 
C-Compiler automatisch einsetzt. Die brauchen dafür keine extra 
speziellen Register.

Kennst du diese Seite schon?: http://stefanfrings.de/stm32/stm32f1.html

von W.S. (Gast)


Lesenswert?

Stefan F. schrieb:
> Die GPIO_ODR Register entsprechen den PORT Registern der AVR
> Mikrocontroller.

Nicht so ganz. Man hat hier GPIO_IDR und GPIO_ODR - und das ist nicht 
exakt dasselbe.

Generell muß man sagen, daß es bei den meiten Cortexen weitaus mehr 
Möglichkeiten gibt, mit den Portpins umzugehen als bei den kleineren 8 
Bit Controllern.

Das sind bei manchen Typen eben W/O-Register zum selektierten 
Setzen/Rücksetzen von Pins und bei anderen eben auch Arrays von Bools 
als Bytes bis hin zu LongBools, um separat auf Portbits zugreifen zu 
können. Sowas schafft bei gezieltem Einsatz in den Lowlevel-Treibern 
einiges an Effizienz.

OK, es gibt aber auch taube Nüsse unter den Cortexen. Darf man auch 
nicht vergessen.

W.S.

von Carl D. (jcw2)


Lesenswert?

Mit BSRR kann man auch wunderbar "Bitfields" auf IO-Ports legen. Der 
Trick ist, daß Set Prio über Reset hat.
Wenn z.B. Bit5..2 einen 4-Bit Wert darstellen sollen,
kann man damit:
1
for(int i=0;i<16;i++) {
2
  GpioA->BSRR = 0b1111<<(16+2)     // Pin5..2 löschen
3
              | ((i & 0b1111)<<2); // Pin5..2 In i gesetzte Bits setzen
4
}
die IO-Pins "hochzählen", bzw. auf einen beliebigen (Variablen) Wert 
setzen, wenn diese 4Bit z.B. D3..7 eines typischen LCD darstellen 
sollen.

von Carl D. (jcw2)


Lesenswert?

Stefan F. schrieb:
> kein gast schrieb:
>> also entspricht das schalten der Pins bei einem ATmega eher den GPIO_ODR
>> Befehl?
.
> Die GPIO_ODR Register entsprechen den PORT Registern der AVR
> Mikrocontroller.
.
>> Und das BSRR und BRR ist eher eine verbesserte Variante? Ähnlich wie bei
>> der ATXMega Serie?
.
> "Verbessert" ist relativ. Damit kannst du einzelne Bits ändern, ohne das
> GPIO_ODR Register vorher lesen zu müssen. Dadurch entfällt die sonst
> notwendige UND bzw ODER Verknüpfung mit dem alten Zustand.
>
> Die AVR können das mit ihren CBI und SBI Befehlen auch, welche der
> C-Compiler automatisch einsetzt. Die brauchen dafür keine extra
> speziellen Register.
so man sich auf einzelne Bits beschränkt.

von Stefan F. (Gast)


Lesenswert?

W.S. schrieb:
> Nicht so ganz. Man hat hier GPIO_IDR und GPIO_ODR - und das ist nicht
> exakt dasselbe.

Dementsprechend haben AVR PIN und PORT Register. Das war schon richtig.

> Das sind bei manchen Typen eben W/O-Register zum selektierten
> Setzen/Rücksetzen von Pins
> Sowas schafft bei gezieltem Einsatz in den Lowlevel-Treibern
> einiges an Effizienz.

AVR sind beim Setzen, Löschen und Abfragen einzenler Bits effizienter, 
weil sie dafür besondere CPU Befehle haben.

Die "kleinen" Aufgaben erfüllen AVR mit halber Taktfrequenz und nur 
einem Bruchteil des Speicher genau so schnell - teilweise sogar 
schneller.

Carl D. schrieb:
> so man sich auf einzelne Bits beschränkt.

Ja, dieser Vorteil gilt nur für einzelne Bits.

von W.S. (Gast)


Lesenswert?

Stefan F. schrieb:
> AVR sind beim Setzen, Löschen und Abfragen einzenler Bits effizienter,
> weil sie dafür besondere CPU Befehle haben.

Sieht bei den PIC's genauso aus: BSF, BCF, BTFSZ usw.

Der Grund hinter sowas ist, daß die Architektur anders ist, nämlich 
Harvard. Bei v.Neumann kann man sich sowas ohne Verrenkungen nicht 
leisten.

W.S.

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.