Cuprins:
- Pasul 1: Cerințe hardware și software
- Pasul 2: Înțelegerea problemei
- Pasul 3: Configurare STM32CubeMX
- Pasul 4: Dezvoltarea software-ului Keil
- Pasul 5: Concluzie
Video: Butonul STM32CubeMX Debounce cu întrerupere: 5 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:44
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
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
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:
Butonul Mute Microsoft Teams: 4 pași
Butonul de dezactivare a sunetului Microsoft Teams: Construiți un buton ușor de accesat pentru a vă dezactiva / dezactiva sunetul în timpul unui apel Microsoft Teams! Pentru că 2020. Acest proiect folosește un Adafruit Circuit Playground Express (CPX) și un buton mare pentru a crea un buton de mut pentru echipele Microsoft prin intermediul tastei rapide
Proiectarea unui controler de întrerupere programabil în VHDL: 4 pași
Proiectarea unui controler de întrerupere programabil în VHDL: sunt copleșit de tipul de răspunsuri pe care le primesc în acest blog. Mulțumesc băieți că mi-ați vizitat blogul și m-ați motivat să vă împărtășesc cunoștințele. De data aceasta, voi prezenta designul unui alt modul interesant pe care îl vedem în toate SOC - Interrupt C
Senzor de blocare a luminii Arduino (modul de întrerupere foto) - Păstrarea cardurilor în siguranță (prototip): 4 pași
Senzor de blocare a luminii Arduino (modul de întrerupere foto) - Păstrarea cardurilor în siguranță (prototip): Acest proiect este un prototip și în acest proiect voi discuta despre modul în care cardurile dvs. - cum ar fi cardurile de credit, cardurile de debit, cardurile cadou - pot fi păstrate sigur. Aruncați o privire la imaginile de mai sus pentru a vedea cum funcționează acest proiect. Permiteți-mi să vă arunc o privire asupra
Cum se realizează un circuit de întrerupere automată: 9 pași
Cum se face un circuit de întrerupere automată: Hii prietene, astăzi voi face un circuit de întrerupere automată folosind tranzistorul 2N2222A. Acest circuit este foarte simplu. Să începem
Arduino - întrerupere periodică: 4 pași
Arduino - întrerupere periodică: acest instructabil este despre utilizarea unei întreruperi periodice pentru sincronizarea în programele Arduino. Acesta este un pas pentru un programator Arduino în devenire care știe că Arduino poate face mai mult, dar nu știe cum să facă acest lucru. Dacă există o performanță