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.
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
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
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