Forum: Mikrocontroller und Digitale Elektronik Gibt es in der lib für den STM32 eine Funktion, bei der.


von 1993 (Gast)


Lesenswert?

Guten Abend,

ich möchte in ein Register einen hex-Wert (value) schreiben: GPIOD->ODR 
|= value; so dass nur die bestimmten Bits verändert werden und alle 
anderen Bits gleich bleiben.

Nn der lib für den STM32F4 habe ich bisher nur folgende Funktionen 
gefunden:

GPIO_Write(GPIOB, 0x1234);
GPIO_SetBits(GPIOA, GPIO_Pin_0);

Mit der zweiten Funktion kann ich nur die Bits "manuell" verändern und 
nicht mit einem Wert beschreiben und bei der zweiten Funktion werden 
eben alle anderen Bits auf Null gesetzt.

Gibt es dort keine Funktion, die dem Befehl |= entspricht ?

von W.S. (Gast)


Lesenswert?

1993 schrieb:
> Guten Abend

Ja, ebenso guten Abend.

Mein Rat: fang endlich mal an, das RefManual zu deinem Chip zu lesen, 
anstatt in sowas wie der ST-Lib herumzustochern.

Vielleicht fällt dir beim verstehenden Lesen dabei ins Auge, was es für 
Register in den allgemeinen Ports gibt und welchem Zwecke sie dienen.

Und nochwas: zumindest ich erwarte schon ein bissel eigenen Antrieb 
deinerseits zum Wissenserwerb durch Lesen.

W.S.

von hex (Gast)


Lesenswert?

W.S. schrieb:
> Vielleicht fällt dir beim verstehenden Lesen dabei ins Auge, was es für
> Register in den allgemeinen Ports gibt und welchem Zwecke sie dienen.

Genau das habe ich gemacht. Ich habe zum Setzen der GPIOs das oben 
beschrieben ODR Register und zusätzlich noch das BSRRL und BSRRH 
Register. Hier könnte ich dann auch das Register BSRRL verwenden, das 
dann eben nur die gewünschten Pins überschreibt.

Nun möchte ich aber mit der Lib arbeiten und da hilft mir das Wissen 
über die Register auch nicht weiter.

von holger (Gast)


Lesenswert?

>Nun möchte ich aber mit der Lib arbeiten und da hilft mir das Wissen
>über die Register auch nicht weiter.

Man muss die "Lib" nicht auf Krampf verwenden wenn man weiss wie
es anders (und schneller!) geht.

Und niemand hindert dich daran folgendes zu tun:

GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_1 | GPIO_Pin_0);

Wenn man eine Lib verwendet sollte man schon auch die Funktionen
näher betrachten und die einfachsten Zusammenhänge erkennen können.

von hex (Gast)


Lesenswert?

holger schrieb:
> GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_1 | GPIO_Pin_0);
>
> Wenn man eine Lib verwendet sollte man schon auch die Funktionen
> näher betrachten und die einfachsten Zusammenhänge erkennen können.

Und wie soll ich das dann mit meiner variablen machen?
GPIO_SetBits(GPIOA, variable);
Denn dies macht keinen Sinn!

Also wenn ich eure Antworten richtig deute, dann gibt es in der Lib 
nichts passendes.

von Daniel H. (Firma: keine) (commander)


Lesenswert?

1
GPIO_Write(GPIOD, GPIO_ReadOutputData(GPIOD) | newBits);

"newBits" = alle zu setzenden Bits

: Bearbeitet durch User
von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

> GPIO_SetBits(GPIOA, GPIO_Pin_0);

Guck dir mal an was GPIO_Pin_0 ist. Das ist kein Magischer Befehl der 
deinen Controller dazu überredet den Pin zu setzen.
I.d.R. steck dahinter so was
#define GPIO_Pin_0 1`

Du kannst also ganz normal deine "Hex-Werte" (das kommt auch nicht von 
Magie) an GPIO_SetBits übergeben.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

1993 schrieb:
> ich möchte in ein Register einen hex-Wert (value) schreiben: GPIOD->ODR
> |= value; so dass nur die bestimmten Bits verändert werden und alle
> anderen Bits gleich bleiben.
> ...
> Gibt es dort keine Funktion, die dem Befehl |= entspricht ?

GPIO_SetBits(GPIOA, value);

Viele Worte, knappe Antwort.

von dasrotemopped (Gast)


Lesenswert?

bei ARM heißt die gesuchte Funktion Bit banding

Gruß,

dasrotemopped.

von Thomas E. (picalic)


Lesenswert?

Frank M. schrieb:
> GPIO_SetBits(GPIOA, value);
>
> Viele Worte, knappe Antwort.

Diese Möglichkeit scheint aber für den TO keinen Sinn zu machen:

hex schrieb:
> Und wie soll ich das dann mit meiner variablen machen?
> GPIO_SetBits(GPIOA, variable);
> Denn dies macht keinen Sinn!

(Ich kann's nicht nachvollziehen, wo damit das Problem sein soll...)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas E. schrieb:
> Diese Möglichkeit scheint aber für den TO keinen Sinn zu machen:
>
> hex schrieb:
>> Und wie soll ich das dann mit meiner variablen machen?
>> GPIO_SetBits(GPIOA, variable);

Weil er nicht verstanden hat, dass GPIO_Pin_0 usw. Bitmasken sind. 
Wahrscheinlich denkt er noch zu sehr an den AVR, wo PD0, PD1 usw. nur 
Bitnummern sind. Daher auch seine Frage nach dem "|=".

: Bearbeitet durch Moderator
von Dr. Sommer (Gast)


Lesenswert?

dasrotemopped schrieb:
> bei ARM heißt die gesuchte Funktion Bit banding

Langsamer als Zugriff auf das BSRR und nicht atomar, daher hier nicht 
geeignet.

von Jay (Gast)


Lesenswert?


von Thomas E. (picalic)


Lesenswert?

Dr. Sommer schrieb:
> Langsamer als Zugriff auf das BSRR und nicht atomar, daher hier nicht
> geeignet.

Bitbanding ist zum Setzen und Löschen von einzelnen Bits und da ist 
gerade Bitbanding garantiert atomar und schnell (für |= oder &= würde 
ich das nicht behaupten).

: Bearbeitet durch User
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.