Forum: Mikrocontroller und Digitale Elektronik STM32F4 Portpins mit Variabler setzen in C


von Jörg B. (joerg-sh)


Lesenswert?

Hallo,
wie kann ich mit einer Int8 Variablen am einfachsten 8 Port Pins setzen?

Das gleich rückwärts wäre auch gut zu wissen, also 8 Port Pins in eine 
Variable.

Am besten wäre ein kleines Beispiel.

Vielen Dank in Voraus

Jörg

von mr. mo (Gast)


Lesenswert?

1
GPIOx->ODR = PortVal;

Wobei GPIOx dein Port ist wo du die Bits setzen willst und PortVal das 
Bitmuster als INT mit 16 Bits ist. Heisst also, du musst deine 8 Bit INT 
in eine passende mit 16 Bit packen.
Wobei ich mir gerade nicht sicher bin ob du weisst, dass der STM32F4 
teilweise mehr als 8 Pins pro Port hat.

von Jörg B. (joerg-sh)


Lesenswert?

mr. mo schrieb:

> Wobei ich mir gerade nicht sicher bin ob du weisst, dass der STM32F4
> teilweise mehr als 8 Pins pro Port hat.

weiß ich, ich habe aber nur 8 bit Variablen die ich Protokoll bedingt 
übertrage.

von mr. mo (Gast)


Lesenswert?

Schonmal probiert die 8bit als 16bit zu casten?, also:
1
uint8_t variable1;
2
uint16_t variable2;
3
4
variable2 = (uint16_t)variable1;

Ob es geht bin ich mir spontan gar nicht sicher. Wie man aus einer 
uint16_t zwei uint8_t macht ja, in der Richtung noch nie probiert.

von Jörg B. (joerg-sh)


Lesenswert?

Ich habe mich damit bis jetzt nicht beschäftigt. Habe mich in das 
CanOpen Protokoll eingearbeitet und jetzt möchte ich es auf die Hardware 
umsetzen.

von Jörg B. (joerg-sh)


Lesenswert?

Ich habe darüber noch mal nachgedacht. So werden ja aber alle 16 
Portpins verändert. Ich müsste also erst das Register sichern und die 
Hälfte die nicht verändert werden muss mit in die Variable schreiben???

von Phantomix X. (phantomix)


Lesenswert?

Jörg B. schrieb:
> Ich müsste also erst das Register sichern und die
> Hälfte die nicht verändert werden muss mit in die Variable schreiben???

Ja!!!einself

Das Portregister beim stm32 ist nunmal 16 Bit breit und wird immer so 
gelesen+geschrieben.

von Mike R. (thesealion)


Lesenswert?

Oder so etwas wie
1
GPIOx->BSRR = Variable + ((~Variable & 0x00FF)<<16);

von Jörg B. (joerg-sh)


Lesenswert?

Ich denke es ist besser eine Funktion zu schreiben.
Damit kann ich dann flexibel irgendwelche Portpins nutzen.

Ich müsste dann also die einzelnen 8 Bits der Variablen mit If abfragen.

Wie selektiert man nun jeweils ein einzelnes Bit?



Grüße

Jörg

von Jörg B. (joerg-sh)


Lesenswert?

1
if (key & 0x01)  
2
  
3
GPIO_SetBits(OPB0_Port , OPB0_Pin);
4
5
else 
6
  
7
GPIO_ResetBits(OPB0_Port , OPB0_Pin);
8
9
if (key & 0x02)  
10
  
11
GPIO_SetBits(OPB1_Port , OPB1_Pin);
12
13
else 
14
  
15
GPIO_ResetBits(OPB1_Port , OPB1_Pin);
16
17
......

Hab es schon heraus gefunden

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.