Spisu treści:

Odbicie przycisku STM32CubeMX z przerwaniem: 5 kroków
Odbicie przycisku STM32CubeMX z przerwaniem: 5 kroków

Wideo: Odbicie przycisku STM32CubeMX z przerwaniem: 5 kroków

Wideo: Odbicie przycisku STM32CubeMX z przerwaniem: 5 kroków
Wideo: Jak włączyć funkcje odbicie lustrzane zdjęcia na iPhone? 🆘 ZbitaSzybka 2024, Grudzień
Anonim
Odbicie przycisku STM32CubeMX z przerwaniem
Odbicie przycisku STM32CubeMX z przerwaniem

Cześć, w tym samouczku postaram się podać moje proste rozwiązanie, aby zapobiec odbijaniu się przycisków, co jest bardzo poważnym problemem. W Internecie jest wiele filmów oferujących rozwiązanie tego problemu, ale żaden z nich nie dotyczy przerwania zewnętrznego. We wszystkich tych filmach naciśnięcie przycisku jest sprawdzane metodą odpytywania, która jest nieefektywna. A więc zacznijmy!

Krok 1: Wymagania sprzętowe i programowe

Wymagania sprzętowe:

  • Płytka rozwojowa STM32 ARM
  • Komputer

Wymagania Systemowe:

  • STM32CubeMX
  • Keil uVision5

Krok 2: Zrozumienie problemu

Zrozumienie problemu
Zrozumienie problemu

Dlatego staramy się znaleźć rozwiązanie problemu odbijania się przycisków. Dlatego musimy zrozumieć problem. Tak więc, gdy naciśniemy przycisk, powinien pojawić się stan odwrotny do poprzedniego stanu. Na przykład, jeśli był WYSOKI, musi być NISKI, a jeśli był NISKI, to musi być WYSOKI. Jest to jednak stan idealny (w PROTEUSIE:)) W rzeczywistości, gdy naciśniemy przycisk, zanim przejdzie do stanu bezczynności, zaczyna on odbijać się między HIGH a LOW. Udaje więc, że został kilkakrotnie wciśnięty, co sprawia problemy. Co więc powinniśmy zrobić?

Tutaj chcę zauważyć, że w tym przykładzie użyjemy przerwania zewnętrznego w celu wykrycia naciśnięcia przycisku. Tak więc po wykryciu naciśnięcia przycisku musimy odczekać trochę czasu, np. 50mS, aby osiągnąć stan bezczynności i ponownie sprawdzić, czy przycisk jest w stanie bezczynności, czy nie. Jeśli jest w stanie bezczynności, możemy kontynuować nasze zadanie. Zobaczmy kod:)

Krok 3: Konfiguracja STM32CubeMX

Konfiguracja STM32CubeMX
Konfiguracja STM32CubeMX

Musimy więc najpierw włączyć zewnętrzne przerwanie dla naszego przycisku (zakładam, że używasz karty wykrywania STM32F407VG):

  • W zakładce "Pinout & Configuration" kliknij pin PA0, który jest podłączony do przycisku i wybierz GPIO_EXTI0, który włącza zewnętrzne przerwanie na tym pinie.
  • Zmień „etykietę użytkownika” pinezki na „Push_Button” lub cokolwiek chcesz.

Następnie musimy skonfigurować timer, aby stworzyć opóźnienie czasowe 50ms:

  • Wejdź do sekcji „Timery”
  • Kliknij na TIM1
  • Wybierz „Zegar wewnętrzny” jako źródło zegara
  • W konfiguracji (jeśli chcesz zrozumieć ten rozdział, zapoznaj się z tym samouczkiem, wysoce zalecane "Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM"):

    • Ustaw preskaler na 32000
    • I okres licznika do 50
  • W zakładce "Ustawienia NVIC" włącz wszystkie przerwania

Włącz diodę LED jako wyjście:

Kliknij PD12 i ustaw jako „GPIO_Output”

Następnie skonfiguruj zegar jak na obrazku powyżej i wygeneruj kod.

Krok 4: Rozwój oprogramowania Keil

Najpierw definiujemy zmienną stanu, która zapewni, że nie uruchomimy timera wewnątrz przerwania zewnętrznego, gdy nastąpi odbicie:

/* KOD UŻYTKOWNIKA POCZĄTEK PFP */bool state = true; /* KOD UŻYTKOWNIKA KONIEC PFP */

Następnie piszemy ISR dla przerwania zewnętrznego:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); stan = fałsz; } inny{ _NOP(); } }

Po naciśnięciu przycisku sprawdzamy, czy był to nasz zdefiniowany przycisk i czy stan jest prawdziwy. Na początku stan będzie prawdziwy, aby wprowadzić instrukcję if. Po wejściu uruchamiamy timer i ustawiamy stan na false, aby mieć pewność, że odbijanie nie spowoduje restartu timera.

Następnie piszemy ISR dla przerwania czasowego:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* Zapobieganie ostrzeżeniu o kompilacji nieużywanych argumentów */ UNUSED(htim);

/* UWAGA: Ta funkcja nie powinna być modyfikowana, gdy potrzebne jest wywołanie zwrotne, HAL_TIM_PeriodElapsedCallback może być zaimplementowany w pliku użytkownika */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); stan = prawda; HAL_TIM_Base_Stop_IT(&htim1); } }

/* KOD UŻYTKOWNIKA KONIEC 4 */

Po 50mS sprawdzamy, czy przycisk jest jeszcze w stanie zresetowanym lub zwolniony, jeśli tak to wiemy, że przycisk jest w stanie spoczynku. Następnie przełączamy diodę, ustawiamy stan na prawdziwy, aby móc wykryć kolejne naciśnięcie przycisku i zatrzymujemy timer, aby móc go ponownie uruchomić.

Tak więc ten proces zapewni, że unikniemy problemów z odbijaniem.

Krok 5: Wniosek

To był kod odbicia przycisku. Chcę zauważyć, że ten kod został opracowany przeze mnie i nie jestem doświadczonym programistą. Tak więc z pewnością mogą wystąpić błędy. Jeśli masz lepsze rozwiązanie, zanotuj je. Nie zapomnij, jeśli napotkasz jakiś problem, napisz do mnie, a postaram się pomóc.

Zalecana: