Forum: Mikrocontroller und Digitale Elektronik GPIOA->MODER &= ~((3UL << 2*0) );


von Klaus B (Gast)


Lesenswert?

Hallo,

ich arbeite mich gerade in das Thema µC Programmierung ein.
In einem Beispiel bin ich auf folgende Zeile gestoßen:

GPIOA->MODER    &= ~((3UL << 2*0)  );

ich weiß, dass ein Bit manipuliert wird aber ich kann mit dem Code "3UL 
<< 2*0" nicht anfangen und habe auch in dem Artikel zur Bitmanipulation 
nichts gefunden.
Kann mir jemand helfen?
Vielen Dank
Klaus

von Ingo (Gast)


Lesenswert?

Ist mir auch etwas schleierhaft was das soll... Ein 3 << 2 tuts doch 
auch.

von Peter II (Gast)


Lesenswert?

Ingo schrieb:
> Ist mir auch etwas schleierhaft was das soll... Ein 3 << 2 tuts doch
> auch.

nicht wenn GPIOA->MODER 32bit ist und das ganze auf einer 8 oder 16 bit 
platform läuft.

von Timmo H. (masterfx)


Lesenswert?

Normalerweise ist das "0" ja die Pin-Nummer, dann würde das z.B. eher so 
aussehen:
1
GPIOA->MODER         &=  ~(0x03<<(2*PIN)) ;     // Mode mask
Wobei PIN dann z.B. der Übergabeparameter einer Funktion ist.

von Ingo (Gast)


Lesenswert?

Naja, das UL macht schon Sinn, aber das 2*0 verstehe ich nicht

von Timmo H. (masterfx)


Lesenswert?

Wie gesagt, normalerweise ist das "0" eine Pinnummer, bloß derjenige der 
das obige Beispiel gecoded hat, hat fest "pin0" eincodiert. Vermutlich 
wollte er so den Ursprung "2*PIN_nr" bewahren.

von (prx) A. K. (prx)


Lesenswert?

Ingo schrieb:
> Naja, das UL macht schon Sinn

Nicht wirklich, denn dieser Code findet sich in einem uvision Beispiel 
für ARM, Blinky.c.

Das 2*0 allerdings ergibt Sinn, wenn man von 2 Config-Bits pro Portbit 
ausgeht. Es sich also um Bit 0 handelt.

Ingo schrieb:
> Ein 3 << 2 tuts doch

Weil 2*0 == 2?

von Ingo (Gast)


Lesenswert?

Mist, zu eilig gewesen!

von Klaus B (Gast)


Lesenswert?

Vielen Dank für die ganze Hilfe.
Also ich habe jetzt gerade einfach mal etwas rumprobiert:
wenn ich

GPIOA->MODER &= ~((3UL << 2*0) );

ersetze durch

GPIOA->MODER &= ~((0x03 << 2*0)  );

Ändert sich an der Funktion auf dem Board nichts.
Kann ich also davon ausgehen dass es identisch ist?
Was mir aber immernoch nicht ganz klar ist: was war die ursprüngliche 
Überlegung der Person die den Code erstellt hat?

von Timmo H. (masterfx)


Lesenswert?

aus "~(3UL)" wird immer 0xFFFFFFFC, aus ~(0x03) kann je nach Compiler 
und Architektur auch nur ein 0xFC werden. Damit würden in diesem Fall 
auch die oberen Bits [31:8] zurückgesetzt, was aber in diesem Fall ja 
gerade nicht gewünscht ist.

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.