HAL driver STM32F103 wie Zustandsänderung an Taster erfassen

Gast #5221206
Lesenswert?

Hallo,

ich versuche gerad zuverlässig eine Zustandsänderung an einem Pin
des STM32F103 zu erfassen.

also

nur wenn sich der Zustand von 1 auf low ändert soll eine
Variable getoggelt werden

aktuell versuche ich es wie folgt:

void get_reset_switch_state(void)
{
    if ((rst_swt == 1) && (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 1))
    {
      rst_swt_new = rst_swt;// do nothing no level change since last 
time on input pin
    }
    else if((rst_swt == 0) && (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 
1))
    {
      rst_swt_new = 1;
    }
    else if((rst_swt == 1) && (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 
0))
    {
      rst_swt_new = 0;
    }
    else if((rst_swt == 0) && (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 
0))
    {
      rst_swt_new = rst_swt;// do nothing no level change since last 
time on input pin
    }
    else
    {
     rst_swt_new = 0; // default case for what everest
    }
    rst_swt = rst_swt_new; // next state (new) becomes current state;
}

das klappt aber nicht zuverlässig....
das muss doch einfacher gehen?
oder?
Gast #5221259
Lesenswert?

Mampf F. schrieb:
> Jörg K schrieb:
>> Ok welche Interrupt stehen mir da zur Verfügung?... ich bin noch nicht
>> so firm
>> in der HAL lib.
>
> Google mal nach EXTI HAL :)

ok hab mir jetzt einen Interrupt für den pin von CubeMX generieren 
lassen:

void EXTI4_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI4_IRQn 0 */
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
  /* USER CODE END EXTI4_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  /* USER CODE BEGIN EXTI4_IRQn 1 */

  /* USER CODE END EXTI4_IRQn 1 */
}

ist als External Interrupt Mode with Rising edge trigger detection
konfiguriert...

irgendwie geht das noch nicht ganz richtig...
kann es sein, dass mein Taster nicht entprellt wird?
vermutlich... wie geht das mit der HAL lib möglichst elegant?
oder ist der pin gelegentlich floating? hmmh
VG
Gast #5221265
Lesenswert?

Jörg K schrieb:
> Mampf F. schrieb:
>> Jörg K schrieb:
>>> Ok welche Interrupt stehen mir da zur Verfügung?... ich bin noch nicht
>>> so firm
>>> in der HAL lib.
>>
>> Google mal nach EXTI HAL :)
>
> ok hab mir jetzt einen Interrupt für den pin von CubeMX generieren
> lassen:
>
> void EXTI4_IRQHandler(void)
> {
>   /* USER CODE BEGIN EXTI4_IRQn 0 */
>   HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
>   /* USER CODE END EXTI4_IRQn 0 */
>   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
>   /* USER CODE BEGIN EXTI4_IRQn 1 */
>
>   /* USER CODE END EXTI4_IRQn 1 */
> }
>
> ist als External Interrupt Mode with Rising edge trigger detection
> konfiguriert...
>
> irgendwie geht das noch nicht ganz richtig...
> kann es sein, dass mein Taster nicht entprellt wird?
> vermutlich... wie geht das mit der HAL lib möglichst elegant?
> oder ist der pin gelegentlich floating? hmmh
> VG


ok schon gleich einen schritt weitergekommen --> hab an dem Pin den 
Pullup aktivert... nun schaut die Sache schon ziemlich gut aus :)

mal sehen, ob da doch noch ein paar Fallstricke kommen ;)
Gast #5221301
Lesenswert?

Jörg K schrieb:
> pegel schrieb:
>> HAL_GPIO_EXTI_Callback ist die Funktion, die dafür gedacht ist.
>
> muss das Tastenentprellen dann nicht auch noch gemacht werden?
>
> VG

und dann noch eine andere Sache, wie kann ich es machen,
dass eine Variable, die in

main.c

deklariert wurde
auch in der
stm32f1xx_it.c
sichtbar ist.
und gesetzt werden kann

volatile?
extern?
hä?
Gast #5221307
Lesenswert?

Jörg K schrieb:
> und dann noch eine andere Sache, wie kann ich es machen,
> dass eine Variable, die in
>
> main.c
>
> deklariert wurde
> auch in der
> stm32f1xx_it.c
> sichtbar ist.
> und gesetzt werden kann
>
> volatile?
> extern?
> hä?

ok frage selbst beantwortet:

in der main direkt deklarieren und
in der stm32f1xx_it.c
mit dem Zusatz extern
damit der weiß, die Variable gibt es schon anderswo ;)
Gast #5221308
Lesenswert?

Der Interrupt ist gut wenn ein klares Signal am Pin zu erwarten ist.
Für eine Taste würde ich HAL_Delay benutzen, das entprellt auf einfache 
Art.
Ist ein Timer Interrupt, der alle x ms den Tastenzustand abfragen kann.
Gast #5221315
Lesenswert?

Jörg K schrieb:
> in der main direkt deklarieren und
> in der stm32f1xx_it.c

Ich habe mir angewöhnt die HAL Funktionen zu nutzen und dabei die 
anderen c/h-Dateien möglichst in Ruhe zu lassen.

Die HAL Lib Beispiele sind auch so aufgebaut.

In diesen Fall sieh dir das GPIO_EXTI Beipielprojekt an. Der µC spielt 
dabei keine Rolle, kann auch für einen anderen sein.
Gast #5221382
Lesenswert?

Danke soweit für eure Hilfe hier....

meine Basisfunktionalität habe ich schon am Laufen...

nun würde ich gerne den Wert eine Variable
nicht flüchtig speichern,
also wenn die Versorgungsspannung weg ist, soll der
Wert erhalten bleiben, bzw. im Init aus dem Speicher gelesen werden
(a la..... oh ich schau mal nach, was der letzte betriebszustand war...

Kann ich das im Flash ablegen?
gibt es da schon nette Funktionen für?

VG
Gast #5221503
Lesenswert?

Jörg K schrieb:
> ich versuche gerad zuverlässig eine Zustandsänderung an einem Pin
> des STM32F103 zu erfassen.

Herrjemine, ist denn sowas derart schwer???

Wenn du nicht weißt, wie man sich eine sinnvolle Infrastruktur in seinem 
µC schafft, dann guck die die Quellen der ollen Lernbetty an. Ich hatte 
damal alles sowas dort vorgeturnt.

Siehe auch das da:
https://www.mikrocontroller.net/attachment/316790/STM32F103C8T6.ZIP
Dort ist zwar keine Tastenentprellung drin, aber eine 
STM32F103-Infrastruktur.

Prinzip für die Tasten:
- Timertick einrichten, alle 1 ms .. 10 ms
- im Timertick betreffende Pins geeignet abfragen
- abgefragte Pins entprellen.
- aus den entprellten Ergebnissen Events generieren, die du dann zwecks 
Abarbeitung in eine Event-Warteschlange einfüllen kannst. (diese 
entkoppelt den Timetick-Interrupt von den Abarbeitungen)
- in der Grundschleife von main die Event-Warteschlange leeren und 
abarbeiten lassen.

W.S.
Beitrag #5222951 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren