Inhaltsverzeichnis:

STM32CubeMX-Tastenentprellung mit Interrupt - Gunook
STM32CubeMX-Tastenentprellung mit Interrupt - Gunook

Video: STM32CubeMX-Tastenentprellung mit Interrupt - Gunook

Video: STM32CubeMX-Tastenentprellung mit Interrupt - Gunook
Video: Как спрятать данные в ячейках Excel? 2024, Juli
Anonim
STM32CubeMX-Tasten-Entprellung mit Interrupt
STM32CubeMX-Tasten-Entprellung mit Interrupt

Hallo, in diesem Tutorial werde ich versuchen, meine einfache Lösung zu geben, um das Zurückspringen von Tasten zu verhindern, was ein sehr ernstes Problem ist. Im Internet gibt es viele Videos, die eine Lösung für dieses Problem bieten, aber keines davon für externe Unterbrechungen. In all diesen Videos wird der Tastendruck durch eine ineffiziente Abfragemethode überprüft. So lass uns anfangen!

Schritt 1: Hardware- und Softwareanforderungen

Hardware-Anforderungen:

  • STM32 ARM-Entwicklungsboard
  • Ein Computer

Software Anforderungen:

  • STM32CubeMX
  • Keil uVision5

Schritt 2: Das Problem verstehen

Das Problem verstehen
Das Problem verstehen

Wir versuchen also, eine Lösung für das Problem mit dem Prellen der Schaltfläche zu finden. Daher müssen wir das Problem verstehen. Wenn wir also eine Taste drücken, sollte ein Zustand eintreten, der seinem vorherigen Zustand entgegengesetzt ist. Wenn es beispielsweise HIGH war, muss es LOW sein, und wenn es LOW war, dann muss es HIGH sein. Dies ist jedoch der Idealzustand (in PROTEUS:)) In Wirklichkeit beginnt er, wenn wir einen Knopf drücken, zwischen HIGH und LOW zu hüpfen, bevor er in den Ruhezustand kommt. Also tut so, als ob es mehrmals gedrückt wurde, was zu Problemen führt. Also, was sollen wir tun?

Hier möchte ich anmerken, dass wir in diesem Beispiel einen externen Interrupt verwenden, um den Tastendruck zu erkennen. Nachdem wir den Tastendruck erkannt haben, müssen wir also eine Weile warten, z. B. 50 ms, um den Ruhezustand zu erreichen und erneut zu überprüfen, ob sich die Taste im Ruhezustand befindet oder nicht. Wenn es sich im Ruhezustand befindet, können wir mit unserer Aufgabe fortfahren. Also, lass uns den Code sehen:)

Schritt 3: STM32CubeMX-Konfiguration

STM32CubeMX-Konfiguration
STM32CubeMX-Konfiguration

Also müssen wir zuerst den externen Interrupt für unseren Taster aktivieren (ich gehe hier davon aus, dass Sie das STM32F407VG Discovery Board verwenden):

  • Klicken Sie auf der Registerkarte "Pinout & Configuration" auf den Pin PA0, der mit dem Taster verbunden ist, und wählen Sie GPIO_EXTI0, um einen externen Interrupt an diesem Pin zu aktivieren.
  • Ändern Sie das "Benutzerlabel" des Pins in "Push_Button" oder was Sie wollen.

Dann müssen wir den Timer konfigurieren, um eine Zeitverzögerung von 50 ms zu erzeugen:

  • Betreten Sie den Abschnitt "Timer"
  • Klicken Sie auf TIM1
  • Wählen Sie "Internal Clock" als Clock-Quelle
  • In der Konfiguration (Wenn Sie diesen Abschnitt verstehen möchten, lesen Sie bitte dieses Tutorial, dringend empfohlen "Servomotorsteuerung mit STM32F4 ARM MCU"):

    • Prescaler auf 32000. einstellen
    • Und Zählerperiode bis 50
  • Aktivieren Sie auf der Registerkarte "NVIC-Einstellungen" alle Interrupts

LED als Ausgang aktivieren:

PD12 anklicken und als "GPIO_Output" einstellen

Konfigurieren Sie dann die Uhr wie im obigen Bild und generieren Sie den Code.

Schritt 4: Keil Softwareentwicklung

Zuerst definieren wir eine Zustandsvariable, die sicherstellt, dass wir den Timer nicht innerhalb eines externen Interrupts starten, wenn ein Bounce aufgetreten ist:

/* BENUTZERCODE BEGIN PFP */bool state = true; /* BENUTZERCODE ENDE PFP */

Dann schreiben wir ISR für externen Interrupt:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); Zustand = falsch; } sonst{_NOP(); } }

Beim Drücken der Taste prüfen wir, ob es unsere definierte Taste war und ob der Zustand wahr ist. Am Anfang ist der Zustand wahr, um die if-Anweisung einzugeben. Nach der Eingabe starten wir den Timer und setzen den Zustand auf false, um sicherzustellen, dass das Bouncen den Timer nicht neu startet.

Dann schreiben wir ISR für Timer-Interrupt:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* Kompilierungswarnung für nicht verwendete Argumente verhindern */ UNUSED(htim);

/* HINWEIS: Diese Funktion sollte nicht geändert werden, wenn der Rückruf benötigt wird, der HAL_TIM_PeriodElapsedCallback könnte in der Benutzerdatei implementiert werden */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); Zustand = wahr; HAL_TIM_Base_Stop_IT(&htim1); } }

/* BENUTZERCODE ENDE 4 */

Nach 50mS prüfen wir, ob sich die Taste noch im Reset-Zustand befindet oder losgelassen wurde, wenn ja, dann wissen wir, dass sich die Taste im Ruhezustand befindet. Dann schalten wir die LED um, machen den Zustand wahr, um einen weiteren Tastendruck erkennen zu können, und stoppen den Timer, um ihn erneut starten zu können.

Dieser Prozess wird also sicherstellen, dass wir ein Bounce-Problem verhindern.

Schritt 5: Fazit

Dies war der Code für die Tastenentprellung. Ich möchte darauf hinweisen, dass dieser Code von mir entwickelt wurde und ich kein erfahrener Programmierer bin. Es kann also sicher zu Fehlern kommen. Wenn Sie eine bessere Lösung haben, notieren Sie es bitte. Vergessen Sie nicht, wenn Sie auf ein Problem stoßen, schreiben Sie mir bitte und ich werde versuchen zu helfen.

Empfohlen: