Cuprins:

Butonul STM32CubeMX Debounce cu întrerupere: 5 pași
Butonul STM32CubeMX Debounce cu întrerupere: 5 pași

Video: Butonul STM32CubeMX Debounce cu întrerupere: 5 pași

Video: Butonul STM32CubeMX Debounce cu întrerupere: 5 pași
Video: External interrupt #5 #external #interrupt #led #stm32 #pushbutton 2024, Noiembrie
Anonim
Butonul STM32CubeMX Debounce cu întrerupere
Butonul STM32CubeMX Debounce cu întrerupere

Bună, în acest tutorial voi încerca să dau soluția mea simplă pentru a preveni respingerea butonului, care este o problemă foarte gravă. Pe internet există multe videoclipuri pentru a oferi soluții la această problemă, dar nu dintre ele pentru întreruperi externe. În toate aceste videoclipuri, apăsarea butonului este verificată prin metoda de interogare, care este ineficientă. Asadar, hai sa incepem!

Pasul 1: Cerințe hardware și software

Cerințe hardware:

  • Placă de dezvoltare STM32 ARM
  • Un calculator

Cerințe software:

  • STM32CubeMX
  • Keil uVision5

Pasul 2: Înțelegerea problemei

Înțelegerea problemei
Înțelegerea problemei

Deci, încercăm să găsim o soluție pentru problema butonului. Prin urmare, trebuie să înțelegem problema. Deci, atunci când apăsăm un buton ar trebui să apară o stare care este opusă stării sale anterioare. De exemplu, dacă a fost ÎNALT trebuie să fie LOW și dacă a fost LOW atunci trebuie să fie HIGH. Cu toate acestea, aceasta este starea ideală (în PROTEUS:)) În realitate, atunci când apăsăm un buton începe să sară între HIGH și LOW înainte de a ajunge la starea de inactivitate. Deci, pretinde că a fost apăsat de mai multe ori ceea ce cauzează probleme. Deci, ce ar trebui să facem?

Aici vreau să menționez că, în acest exemplu, vom folosi întreruperea externă pentru a detecta apăsarea butonului. Deci, după ce detectăm apăsarea butonului, trebuie să așteptăm puțin timp, cum ar fi 50mS, pentru a ajunge la starea de repaus și pentru a verifica din nou dacă butonul este sau nu. Dacă este în stare de repaus, putem continua sarcina noastră. Deci, să vedem codul:)

Pasul 3: Configurare STM32CubeMX

Configurare STM32CubeMX
Configurare STM32CubeMX

Deci, trebuie mai întâi să activăm întreruperea externă pentru butonul nostru (presupun aici că utilizați placa de descoperire STM32F407VG):

  • În fila „Pinout & Configuration” faceți clic pe pinul PA0 care este conectat la butonul și alegeți GPIO_EXTI0 care permite întreruperea externă pe acel pin.
  • Schimbați „eticheta de utilizator” a pinului la „Push_Button” sau orice doriți.

Apoi, trebuie să configurăm temporizatorul pentru a crea o întârziere de 50mS:

  • Introduceți secțiunea „Cronometre”
  • Faceți clic pe TIM1
  • Alegeți „Ceas intern” ca sursă de ceas
  • În configurație (Dacă doriți să înțelegeți această secțiune, vă rugăm să consultați acest tutorial, foarte recomandat „Servomotor Control With STM32F4 ARM MCU”):

    • Setați prescalerul ca 32000
    • Și contra perioadă la 50
  • În fila „Setări NVIC” activați toate întreruperile

Activați LED-ul ca ieșire:

Faceți clic pe PD12 și setați ca „GPIO_Output”

Apoi, configurați ceasul ca în imaginea de mai sus și generați codul.

Pasul 4: Dezvoltarea software-ului Keil

În primul rând, definim variabila de stare care ne va asigura că nu pornim cronometrul în interiorul întreruperii externe când s-a întâmplat săritura:

/ * COD DE UTILIZATOR ÎNCEPE PFP * / starea bool = adevărat; / * CODUL UTILIZATORULUI PFP * /

Apoi, scriem ISR pentru întrerupere externă:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); state = false; } else {_NOP (); }}

La apăsarea butonului verificăm dacă a fost butonul nostru definit și dacă starea este adevărată. La început starea va fi adevărată pentru a introduce declarația if. După intrare, pornim cronometrul și facem starea falsă pentru a ne asigura că bouncing-ul nu va reporni cronometrul.

Apoi, scriem ISR pentru întreruperea temporizatorului:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim) {/ * Prevenirea avertismentului de compilare a argumentelor neutilizate * / UNUSED (htim);

/ * NOTĂ: Această funcție nu trebuie modificată, atunci când este nevoie de apel invers, apelul HAL_TIM_PeriodElapsedCallback ar putea fi implementat în fișierul utilizatorului * / if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD_), GPIO_; state = adevărat; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * CODUL UTILIZATORULUI 4 * /

După 50mS verificăm dacă butonul este încă în stare de resetare sau eliberat, dacă da, atunci știm că butonul este în stare de repaus. Apoi comutăm ledul, facem starea adevărată pentru a putea detecta un alt buton și apăsați cronometrul pentru a putea porni din nou.

Deci, acest proces ne va asigura că vom preveni o problemă de respingere.

Pasul 5: Concluzie

Acesta a fost codul pentru dezabonarea butoanelor. Vreau să menționez că acest cod a fost dezvoltat de mine și nu sunt un programator expert. Deci, cu siguranță pot exista erori. Dacă aveți o soluție mai bună, vă rugăm să o rețineți. Nu uitați, dacă întâmpinați vreo problemă, vă rog să mă scrieți și voi încerca să vă ajut.

Recomandat: