Kazalo:

Odmik gumba STM32CubeMX s prekinitvijo: 5 korakov
Odmik gumba STM32CubeMX s prekinitvijo: 5 korakov

Video: Odmik gumba STM32CubeMX s prekinitvijo: 5 korakov

Video: Odmik gumba STM32CubeMX s prekinitvijo: 5 korakov
Video: Полное руководство по Google Forms - универсальный инструмент для опросов и сбора данных онлайн! 2024, November
Anonim
Gumb STM32CubeMX se prekine s prekinitvijo
Gumb STM32CubeMX se prekine s prekinitvijo

Pozdravljeni, v tej vadnici bom poskušal dati svojo preprosto rešitev za preprečevanje odskoka gumbov, kar je zelo resna težava. Na internetu obstaja veliko videoposnetkov, ki ponujajo rešitev za to težavo, vendar ne za zunanje prekinitve. V vseh teh videoposnetkih se pritisk na gumb preveri z metodo glasovanja, ki je neučinkovita. Torej, začnimo!

Korak 1: Strojne in programske zahteve

Strojne zahteve:

  • Razvojna plošča STM32 ARM
  • Računalnik

Zahteve za programsko opremo:

  • STM32CubeMX
  • Keil uVision5

2. korak: Razumevanje problema

Razumevanje problema
Razumevanje problema

Zato poskušamo najti rešitev za problem odbijanja gumbov. Zato moramo razumeti vprašanje. Torej, ko pritisnemo gumb, bi moralo priti v stanje, ki je v nasprotju s prejšnjim stanjem. Če je na primer visoko, mora biti nizko, če pa nizko, mora biti visoko. Vendar je to idealno stanje (v PROTEUS -u:)) V resnici, ko pritisnemo gumb, se začne premikati med VISIM in NIZKIM, preden pride v stanje mirovanja. Torej se pretvarja, da je bil večkrat pritisnjen, kar povzroča težave. Kaj bi torej morali narediti?

Tukaj želim opozoriti, da bomo v tem primeru uporabili zunanjo prekinitev za zaznavanje pritiska na gumb. Torej, ko zaznamo pritisk gumba, moramo počakati nekaj časa, na primer 50 ms, da pridemo v stanje mirovanja in ponovno preverimo, ali je gumb v stanju mirovanja ali ne. Če je v stanju mirovanja, lahko nadaljujemo z nalogo. Pa poglejmo kodo:)

3. korak: Konfiguracija STM32CubeMX

Konfiguracija STM32CubeMX
Konfiguracija STM32CubeMX

Zato moramo najprej omogočiti zunanjo prekinitev za naš gumb (tukaj predvidevam, da uporabljate ploščo za odkrivanje STM32F407VG):

  • Na zavihku "Pinout & Configuration" kliknite na pin PA0, ki je povezan s potisnim gumbom, in izberite GPIO_EXTI0, ki omogoča zunanjo prekinitev na tem pinu.
  • Spremenite "uporabniško oznako" pin na "Push_Button" ali karkoli želite.

Nato moramo nastaviti časovnik, da ustvarimo časovno zakasnitev 50 mS:

  • Vstopite v razdelek »Časovniki«
  • Kliknite na TIM1
  • Kot vir ure izberite "Notranja ura"
  • V konfiguraciji (če želite razumeti ta razdelek, glejte to vadnico, zelo priporočljivo "Nadzor servo motorja s STM32F4 ARM MCU"):

    • Predkaler nastavite na 32000
    • In obračunsko obdobje do 50
  • Na zavihku "Nastavitve NVIC" omogočite vse prekinitve

Omogoči LED kot izhod:

Kliknite na PD12 in nastavite kot "GPIO_Output"

Nato nastavite uro kot na zgornji sliki in ustvarite kodo.

4. korak: Razvoj programske opreme Keil

Najprej določimo spremenljivko stanja, ki bo zagotovila, da ne bomo zagnali časovnika znotraj zunanje prekinitve, ko se je zgodilo odbijanje:

/ * KODA UPORABNIKA SE ZAČNE PFP */bool stanje = true; / * KODA UPORABNIKA KONEC PFP */

Nato za zunanjo prekinitev napišemo ISR:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); stanje = napačno; } else {_NOP (); }}

Ko pritisnemo gumb, preverimo, ali je to naš definirani gumb in ali je stanje res. Na začetku bo stanje resnično, če želite vnesti stavek if. Po vnosu zaženemo časovnik in stanje naredimo napačno, da zagotovimo, da se odbijanje ne bo znova zagnalo.

Nato za časovno prekinitev napišemo ISR:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Prepreči opozorila o sestavljanju neuporabljenih argumentov * / UNUSED (htim);

/* OPOMBA: Te funkcije ne smete spreminjati, kadar je potreben povratni klic, HAL_TIM_PeriodElapsedCallback bi lahko izvedli v uporabniški datoteki */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD_, GPIO_); stanje = res; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * KOD UPORABNIKA END 4 */

Po 50mS preverimo, ali je gumb še v ponastavljenem stanju ali sproščen, če da, potem vemo, da je gumb v stanju mirovanja. Nato preklopimo LED, nastavimo stanje v resnico, da lahko zaznamo nov pritisk gumba in ustavimo časovnik, da ga lahko znova zaženemo.

Tako bo ta postopek zagotovil, da preprečimo težave z odbijanjem.

5. korak: Zaključek

To je bila koda za razveljavitev gumbov. Želim opozoriti, da sem to kodo razvil jaz in nisem strokovnjak za programiranje. Torej lahko pride do napak. Če imate boljšo rešitev, jo upoštevajte. Ne pozabite, če naletite na kakšno težavo, mi pišite in poskusil vam bom pomagati.

Priporočena: