STM32 direkter Port zugriff

OP #1820717
Lesenswert?
• ▲
▼
Hallo zusammen,

ich stehe gerade wieder vor einem Problem mit meinem STM32.
Ich habe ein Array mit den Werten 0 oder 1 und möchte das jetzt so 
schnell wie möglich auf einem Pin ausgeben.
Eine Möglichkeit wäre es jetzt z.b. so: (ptr ist ein Pointer auf das 
Array)
1
if(*ptr++ == 1)
2
  GPIOE->BSRR = GPIO_Pin_3;
3
else
4
  GPIOE->BRR = GPIO_Pin_3;
5

6
if(*ptr++ == 1)
7
  GPIOE->BSRR = GPIO_Pin_3;
8
else
9
  GPIOE->BRR = GPIO_Pin_3;
10

11
.
12
.
13
.
Zu gunsten der Geschwindigkeit und weil es nur 12 bit sind die gesetzt 
werden müssen würde ich es untereinander schreiben und in keiner 
Schleife.
Das Problem ist allerdings, dass auch die if-Abfrage Zeit kostet.
Gibt es eine Möglichkeit die Pins direkt anzusprechen?
Also in etwa so:
1
GPIOE->GPIO_Pin_3 = *ptr++;
Oder kann ich auch einfach auf den ganzen Port ein 16bit Wort legen, 
wobei eben nur die Bits durchkommen, wo der entsprechende Pin auch auf 
Ausgang geschlaten ist, also in etwa so:
1
GPIOE = 0x8; //0000 0000 0000 1000

Habe im Internet dazu leider nichs gefunden.
Danke für die Bemühungen :)

Gruß
Gast #1820732
Lesenswert?
• ▲
▼
du kannst den gesamten Port, oer nur ein Teil davon gleichzeitig 
schreiben, man muss nicht jedes Bit einzeln ansprechen!

Port komplet setzen
1
GPIOA->ODR = (GPIOA->ODR);


nur das obere Byte eines Ports setzen
1
GPIOA->ODR = ((GPIOA->ODR & 0x00FF) | (((uint16_t)datenbyte)<<8) );
OP #1820931
Lesenswert?
• ▲
▼
Hallo A.K.

Danke :)
Habs jetzt so gemacht:
1
GPIOE->BSRR = (Pin3<<16) | (data[x]<<3);
Funktioniert wunderbar.

Du hast im ersten Post soetwas vorgeschlagen:
1
  BSRR = Pin<<16 | array[i++];
das läuft ja dann, wenn ich das richtig verstanden habe, aufs gleich 
raus wie ich es gemacht habe und müsste die schnellste Methode sein 
oder?

Gruß

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.