Forum: Compiler & IDEs Warum gibt es kein HAL_GPIO_RegisterCallback


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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?


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.