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 ?
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.
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.
>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.
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.
1 | GPIO_Write(GPIOD, GPIO_ReadOutputData(GPIOD) | newBits); |
"newBits" = alle zu setzenden Bits
:
Bearbeitet durch User
> 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.
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.
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...)
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
dasrotemopped schrieb: > bei ARM heißt die gesuchte Funktion Bit banding Langsamer als Zugriff auf das BSRR und nicht atomar, daher hier nicht geeignet.
Beitrag "Gibt es in der lib für den STM32 eine Funktion, bei der." Beitrag "Re: Gibt es in der lib für den STM32 eine Funktion, bei der." Wie oft möchtest du noch deinen Namen wechseln?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.