Forum: Compiler & IDEs Warum gibt es kein HAL_GPIO_RegisterCallback


von Flötenhannes (Gast)


Lesenswert?

Hallo,

es gibt ja bei den STM32 seit ein paar Jahren diverse Peripherals, zu 
denen man seine eigenen Callbacks registrieren kann, z.B.
1
HAL_DMA_RegisterCallback(&hdma_usart1_tx, HAL_DMA_XFER_CPLT_CB_ID, &UART_DMA_TransferComplete);
Für die GPIO kann ich aber keine solche Funktion finden. Warum ist das 
eigentlich so? Gerade da würde es doch Sinn machen, sich damit nur auf 
den interessierenden Pin zu konzentrieren.

von Interrupt (Gast)


Lesenswert?

Leg dir einen Interrupt auf den Pin.

von Bauform B. (bauformb)


Lesenswert?

Flötenhannes schrieb:
> Für die GPIO kann ich aber keine solche Funktion finden. Warum ist das
> eigentlich so?

Weil du nach EXTI statt GPIO suchen müsstest. Aber niemand benutzt 
freiwillig solche Interrupts; zwischen Pin und NVIC gibt es kein Filter.
Oder habe ich die Frage nicht verstanden?

von W.S. (Gast)


Lesenswert?

Flötenhannes schrieb:
> es gibt ja bei den STM32 seit ein paar Jahren diverse Peripherals, zu
> denen man seine eigenen Callbacks registrieren kann,...

Ach nein. Du verwechselst da was, nämlich eine Softwareumgebung von ST 
mit den Mikrocontrollern von ST.
Deine Callbacks sind lediglich Erweiterungen irgendwelcher Interupts. 
Aber wenn du nicht gerade einen Interrupt für Zustandswechsel eines 
Ports haben willst, dann kann es für das Verwenden des Ports auch keinen 
Callback-Mechanismus in deinen Bibliotheken geben.
Versuche einmal, hinter all deinem Bibliothekszeug die Peripherie auf 
dem Silizium und deren Funktionen zu vestehen.

W.S.

von Flötenhannes (Gast)


Lesenswert?

Bauform B. schrieb:
> Weil du nach EXTI statt GPIO suchen müsstest.
Danke, das war die halbe Miete.
Aber EXTI scheint irgendwie eine Ausnahme zu sein: Normalerweise kann 
man die Nutzung von Registr CallBack bei CubeMX über
Project Manager | Advanced Settings | Register CallBack
über ENABLE aktivieren. Aber dort gibt es kein EXTI. Auch in 
stm32f1xx_hal_conf.h, wo das dann seine Wirkung zeigt, gibt es das nicht 
für EXTI.

W.S. schrieb:
> Aber wenn du nicht gerade einen Interrupt für Zustandswechsel eines
> Ports haben willst, dann kann es für das Verwenden des Ports auch keinen
> Callback-Mechanismus in deinen Bibliotheken geben.
Genau das will ich aber: Auswerten eines Bewegungsmelders per interrupt.

von Bauform B. (bauformb)


Lesenswert?

Flötenhannes schrieb:
> Aber EXTI scheint irgendwie eine Ausnahme zu sein

schuld ist wohl die EXTI-Hardware, die hat ein paar Sonderfälle und 
Unterschiede von Chip zu Chip. Vielleicht war es zu einfach zu 
schwierig, das HAL-konform sauber abzubilden.

Du könntest einen Input Capture Interrupt verwenden. Das geht zwar nicht 
mit jedem Pin, aber immerhin mit 18 von 48 bzw. mit 26 von 64 Pins. Alle 
Timer außer TIM6 und TIM7 können das (also die Hardware, HAL kenne ich 
nicht). Bonus: dank digitalem Filter reagieren sie nicht so leicht auf 
Störimpulse.

Ich frage solche Eingänge so nebenbei in irgendeinem Timer-Interrupt ab. 
Aber das ist natürlich Geschmackssache.

von Flötenhannes (Gast)


Lesenswert?

Ich habe es jetzt "old school" mit
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
gemacht (überschreiben der weak-Definition). Ist zwar nicht schön, 
erfüllt aber (zumindest erstmal) seinen Zweck.
Wobei ich gerade merken durfte, daß GPIO_Pin dort nicht, wie im Manual 
und den Treibern beschrieben, mit 0..15, sondern mit dem Wert der 
Registerposition gehandelt wird. Also
Pin Px0 => 1
Pin Px1 => 2
Pin Px2 => 4
Pin Px3 => 8
usw..

von Flötenhannes (Gast)


Lesenswert?

...wobei die Pins tatsächlich auch so definiert sind, und das dann auch 
funktioniert:
#define GPIO_PIN_0                 ((uint16_t)0x0001)  /* Pin 0 selected 
*/
#define GPIO_PIN_1                 ((uint16_t)0x0002)  /* Pin 1 selected 
*/
#define GPIO_PIN_2                 ((uint16_t)0x0004)  /* Pin 2 selected 
*/
#define GPIO_PIN_3                 ((uint16_t)0x0008)  /* Pin 3 selected 
*/
Also muß man wohl tatsächlich immer durchgängig mit dem HAL-Zeugs 
arbeiten...

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?


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.