STM32, generalisierte Pinansteuerung á la PORTA |= (1 << i)

Gast #4125272
Lesenswert?
• ▲
▼
Hallo,

ich fange gerade an, mich mit dem STM32 zu beschäftigen. In einem 
Projekt würde ich gerne aus einer n,m-Matrix einzelne Bits einer Spalte 
an Pins übergeben und dieses in einer Schleife abarbeiten lassen.

Beim AVR war dieses recht leicht möglich:

Bsp.:

uint8_t irgendEineMatrix [n][m] = { {1,0,0,1,1, bla.....}{0,0,0,1,1, 
foo....     ... ... } };

Ich möchte nun die Matrix entlang m ablaufen lassen und für jede Spalte 
alle n-Einträge auf eine 1 prüfen und dieses entsprechend auf einen Port 
abbilden:

for (uint8_t j=0; j<m; j++)
{
for (uint8_t i=0; i<n; i++)
{
if {irgendEineMatrix[i][j] == 1}
PORTA |= (1 << i);
else
PORTA &= ~(1 << i);
}
}

Ich versuche mich gerade CMSIS-konform und da gibt es für solche 
Ausgaben den Struktureintrag:

GPIO_SetBits(GPIOx, i);

So scheint das jedenfalls nicht zu funktionieren.

Hat einer von euch einen Hinweis für mich?

Mit Gruß

Mike

P.S. Ja, die Clock-Source ist aktiv und der Pin als Ausgang (Out-PP) 
konfiguriert. Eine Ausgabe auf einen festen Pin z.B. GPIO_Pin_8 
funktioniert.
Gast #4125314
Lesenswert?
• ▲
▼
gibt die einzeiler:
1
  GPIOB->BSRR|= GPIO_Pin_4;  // set
2

3
  GPIOB->BRR |= GPIO_Pin_4;  // clear
4

5
  
6
  if( GPIOB->IDR & GPIO_Pin_5  ){  // get
7
  }

das BSRR  oder BRR ging auch mit löschen ...
also wäre man bei einem register und bitmanipulation
(Firma: KHTronik) #4125336
Lesenswert?
• ▲
▼
Hallo Mike,

ich machs mal mut CUBE :-):
1
uint8_t irgendEineMatrix [n][m] = { {1,0,0,1,1, bla.....}{0,0,0,1,1, foo....     ... ... } };
2

3
// Pins für die Bits (auch in mehreren Ports)
4
uint16_t pins[][] = { {GPIO_PIN_0, GPIO_PIN_1, ...}, {...}, ... };
5
// Ports für die Pins
6
uint16_t ports = { {GPIOA, GPIOB, ...}, {...}, ...};
7

8
for (uint8_t j=0; j<m; j++) {
9
  for (uint8_t i=0; i<n; i++) {
10
    HAL_GPIO_writePin(ports[i][j], pins[i][j],
11
       irgendEineMatrix[i][j] == 1 ? GPIO_PIN_SET : PIO_PIN_RESET);
12
    }
13
  }
14
}
Und, am Rande, zum Thema CUBE/HAL: ich habe auch gut Zeit gebraucht, 
mich in diese Umgebung einzuarbeiten. Nachdem die Integration in eclipse 
läuft schätze ich aber das Tool für Pinout uns Setup sehr. Ausserdem ist 
die Dokumentation auf dem Weg zu besserer Qualität.

Grüße, Kurt
#4125352
Lesenswert?
• ▲
▼
Ich verwende auch immer die Einzeiler und greife direkt auf hardware 
register zu, ist deutlich effizienter als diese CMSIS.
(ich hab da mal reingeschaut, optimierter code sieht GANZ anders aus!)
1
GPIOx->BSRRH = 1<<i;   // pin auf low
2
GPIOx->BSRRL = 1<<i;   // pin auf high

Lies hierzu das entsprechende Headerfile und das reference manual
(Firma: KHTronik) #4125375
Lesenswert?
• ▲
▼
Hallo,
Optimierung unterliegt stregen Regeln:

Erst einmal messen!

don't do it
don't do it yet
find a better algorithm

:-)

Die Einzeiler könnte man unter Regel 3 einordnen, aber spätestens wenn 
man die Beziehung Datenbit <-> Bitposition nicht mehr direkt auf das 
Register abbilden will/kann, sollte man abstrakter programmieren.

Der Vorteil der Verwendung von HAL liegt in einer größeren Allgemeinheit 
des Codes und in der Unterstützung durch das CUBE-Tool.

Nach nunmehr >40 Jahren von Assembler bis Java traue halte ich in vielen 
Fällen Optimierung für einen Popanz. Dies besonders dann, wenn nicht 
vorher der Engpass klar bestimmt wird.

Grüße, Kurt

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.