Odvajanje gumba STM32CubeMX s prekidom: 5 koraka
Odvajanje gumba STM32CubeMX s prekidom: 5 koraka
Anonim
STM32CubeMX tipka se odvaja s prekidom
STM32CubeMX tipka se odvaja s prekidom

Bok, u ovom vodiču pokušat ću dati svoje jednostavno rješenje za sprječavanje odskakivanja gumba što je vrlo ozbiljan problem. Na internetu postoji mnogo videozapisa koji nude rješenje za ovaj problem, ali nema njih za vanjske prekide. U svim ovim videozapisima pritisak na gumb provjerava se metodom prozivanja koja je neučinkovita. Dakle, počnimo!

Korak 1: Zahtjevi hardvera i softvera

Hardverski zahtjevi:

  • Razvojna ploča STM32 ARM
  • Računalo

Softverski zahtjevi:

  • STM32CubeMX
  • Keil uVision5

Korak 2: Razumijevanje problema

Razumijevanje problema
Razumijevanje problema

Stoga pokušavamo pronaći rješenje za problem odskakivanja gumba. Stoga moramo razumjeti problem. Dakle, kada pritisnemo gumb, ono bi trebalo doći u stanje koje je suprotno od prethodnog stanja. Na primjer, ako je bilo VISOKO, mora biti NISKO, a ako je bilo NISKO, onda mora biti VISOKO. Međutim, ovo je idealno stanje (u PROTEUS -u:)) U stvarnosti, kada pritisnemo gumb, ono počinje poskakivati između VISOKOG i NISKOG prije nego dođe u stanje mirovanja. Dakle, pretvara se da je pritisnut nekoliko puta što uzrokuje probleme. Dakle, što bismo trebali učiniti?

Ovdje želim napomenuti da ćemo u ovom primjeru koristiti vanjski prekid kako bismo detektirali pritisak gumba. Dakle, nakon što otkrijemo pritisak gumba, moramo pričekati malo vremena, na primjer 50mS kako bismo dosegli stanje mirovanja i ponovno provjerili je li gumb u stanju mirovanja ili ne. Ako je u stanju mirovanja, možemo nastaviti sa svojim zadatkom. Pa da vidimo kod:)

Korak 3: Konfiguracija STM32CubeMX

Konfiguracija STM32CubeMX
Konfiguracija STM32CubeMX

Dakle, prvo moramo omogućiti vanjski prekid za naš gumb (ovdje pretpostavljam da koristite ploču za otkrivanje STM32F407VG):

  • Na kartici "Pinout & Configuration" kliknite na pin PA0 koji je spojen na gumb i odaberite GPIO_EXTI0 koji omogućuje vanjski prekid na tom pinu.
  • Promijenite "korisničku oznaku" igle u "Push_Button" ili sve što želite.

Zatim moramo konfigurirati mjerač vremena kako bismo stvorili odgodu od 50 ms:

  • Uđite u odjeljak "Odbrojavanje vremena"
  • Kliknite na TIM1
  • Odaberite "Interni sat" kao izvor sata
  • U konfiguraciji (Ako želite razumjeti ovaj odjeljak, pogledajte ovaj vodič, visoko preporučena "Upravljanje servo motorom sa STM32F4 ARM MCU"):

    • Predskaler postavite na 32000
    • I razdoblje brojača do 50
  • Na kartici "NVIC Settings" omogućite sve prekide

Omogući LED kao izlaz:

Pritisnite PD12 i postavite kao "GPIO_Output"

Zatim konfigurirajte sat kao na gornjoj slici i generirajte kôd.

Korak 4: Razvoj softvera Keil

Prvo definiramo varijablu stanja koja će osigurati da ne pokrećemo mjerač vremena unutar vanjskog prekida kada se odskok dogodio:

/ * KORISNIČKI KOD POČINJE PFP */bool stanje = true; / * KORISNIČKI KOD KRAJ PFP */

Zatim pišemo ISR za vanjski prekid:

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

Kad pritisnemo gumb, provjeravamo je li to bio naš definirani gumb i je li stanje istinito. Na početku će stanje biti točno kako biste unijeli if naredbu. Nakon unosa pokrećemo mjerač vremena i postavljamo stanje lažno kako bismo bili sigurni da se odskakanje neće ponovno pokrenuti.

Zatim pišemo ISR za prekid timera:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Sprječavanje upozorenja kompilacije neiskorištenih argumenata * / UNUSED (htim);

/* NAPOMENA: Ova funkcija se ne smije mijenjati, kada je potreban povratni poziv, HAL_TIM_PeriodElapsedCallback mogao bi se implementirati u korisničku datoteku */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD_ GPIO_); stanje = istina; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * KORISNIČKI KOD KRAJ 4 */

Nakon 50mS provjeravamo je li gumb još uvijek u resetiranom stanju ili otpušten, ako da, onda znamo da je gumb u stanju mirovanja. Zatim prebacimo LED diodu, učinimo stanje istinitim kako bismo mogli otkriti još jedan pritisak gumba i zaustaviti mjerač vremena kako bismo ga mogli ponovno pokrenuti.

Dakle, ovaj će postupak osigurati da spriječimo problem poskakivanja.

Korak 5: Zaključak

Ovo je bio kôd za otkazivanje gumba. Želim napomenuti da sam ovaj kod razvio ja i da nisam stručan programer. Dakle, greške sigurno može biti. Ako imate bolje rješenje, zabilježite ga. Ne zaboravite, ako naiđete na bilo koji problem, pišite mi i pokušat ću vam pomoći.

Preporučeni: