Turinys:

STM32CubeMX mygtukas nustoja veikti su pertraukimu: 5 žingsniai
STM32CubeMX mygtukas nustoja veikti su pertraukimu: 5 žingsniai

Video: STM32CubeMX mygtukas nustoja veikti su pertraukimu: 5 žingsniai

Video: STM32CubeMX mygtukas nustoja veikti su pertraukimu: 5 žingsniai
Video: Timer Input Capture Mode Configuration and Calculation in STM32 Cube Mx | STM32F446RE | T - 16 2024, Lapkritis
Anonim
STM32CubeMX mygtukas neveikia su pertraukimu
STM32CubeMX mygtukas neveikia su pertraukimu

Sveiki, šioje pamokoje aš pabandysiu pateikti savo paprastą sprendimą, kaip užkirsti kelią mygtukų atšokimui, o tai yra labai rimta problema. Internete yra daug vaizdo įrašų, kurie siūlo šios problemos sprendimą, tačiau nė vienas iš jų nėra skirtas išoriniam pertraukimui. Visuose šiuose vaizdo įrašuose mygtuko paspaudimas tikrinamas neefektyviu apklausos metodu. Taigi, pradėkime!

1 žingsnis: Techninės ir programinės įrangos reikalavimai

Techninės įrangos reikalavimai:

  • STM32 ARM kūrimo lenta
  • Kompiuteris

Programinės įrangos reikalavimai:

  • STM32CubeMX
  • Keil uVision5

2 žingsnis: supraskite problemą

Problemos supratimas
Problemos supratimas

Taigi, mes bandome rasti mygtukų atšokimo problemos sprendimą. Todėl mes turime suprasti problemą. Taigi, kai paspaudžiame mygtuką, jis turi būti priešinga būsenai. Pavyzdžiui, jei jis buvo AUKŠTAS, jis turi būti ŽEMAS, o jei ŽEMAS, tada jis turi būti AUKŠTAS. Tačiau tai ideali būsena (PROTEUS:)) Iš tikrųjų, kai paspaudžiame mygtuką, jis pradeda šokinėti tarp HIGH ir LOW, kol ateina į tuščiosios eigos būseną. Taigi, apsimeta, kad jis buvo kelis kartus paspaustas, o tai sukelia problemų. Taigi, ką turėtume daryti?

Čia noriu pažymėti, kad šiame pavyzdyje, norėdami aptikti mygtukų paspaudimą, naudosime išorinį pertraukimą. Taigi, aptikę mygtuko paspaudimą, turime palaukti šiek tiek laiko, pvz., 50 mS, kad pasiektume tuščiosios eigos būseną, ir dar kartą patikrinti, ar mygtukas yra laukimo būsenos, ar ne. Jei jis neveikia, galime tęsti savo užduotį. Taigi pažiūrėkime kodą:)

3 veiksmas: „STM32CubeMX“konfigūravimas

„STM32CubeMX“konfigūracija
„STM32CubeMX“konfigūracija

Taigi, pirmiausia turime įjungti išorinį mūsų mygtuko pertraukimą (čia manau, kad naudojate STM32F407VG atradimo plokštę):

  • Skirtuke „Pinout & Configuration“spustelėkite kaištį PA0, prijungtą prie mygtuko, ir pasirinkite GPIO_EXTI0, kuris įgalina išorinį to kaiščio pertraukimą.
  • Pakeiskite kaiščio „vartotojo etiketę“į „Push_Button“arba bet ką, ko norite.

Tada turime sukonfigūruoti laikmatį, kad sukurtume 50 mS laiko uždelsimą:

  • Įveskite skyrių „Laikmačiai“
  • Spustelėkite TIM1
  • Pasirinkite „Vidinis laikrodis“kaip laikrodžio šaltinį
  • Konfigūracijoje (jei norite suprasti šį skyrių, skaitykite šią mokymo programą, labai rekomenduojama „Servo variklio valdymas su STM32F4 ARM MCU“):

    • Nustatykite prescaler kaip 32000
    • Ir prieš 50
  • Skirtuke „NVIC nustatymai“įjunkite visus pertraukimus

Įjungti LED kaip išvestį:

Spustelėkite PD12 ir nustatykite kaip „GPIO_Output“

Tada sukonfigūruokite laikrodį, kaip parodyta aukščiau esančiame paveikslėlyje, ir sugeneruokite kodą.

4 žingsnis: „Keil“programinės įrangos kūrimas

Pirma, mes apibrėžiame būsenos kintamąjį, kuris užtikrins, kad nepaleisime laikmačio išorinio pertraukimo metu, kai atsitiko:

/ * NAUDOTOJO KODAS PRADĖJA PFP */bool state = true; / * NAUDOTOJO KODAS PABAIGA PFP */

Tada mes rašome ISR išoriniam pertraukimui:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); būsena = klaidinga; } dar {_NOP (); }}

Kai paspaudžiamas mygtukas, patikriname, ar tai buvo mūsų apibrėžtas mygtukas, ir ar būsena teisinga. Pradžioje būsena bus teisinga, kad įvestų teiginį „if“. Įėję įjungiame laikmatį ir nustatome būseną klaidingą, kad užtikrintume, jog atšokęs laikmatis nebus paleistas iš naujo.

Tada užrašome ISR, kad būtų nutrauktas laikmatis:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Neleisti nepanaudotų argumentų (-ų) kompiliavimo įspėjimo * / UNUSED (htim);

/* PASTABA: šios funkcijos negalima keisti, kai reikia atgalinio ryšio, „HAL_TIM_PeriodElapsedCallback“būtų galima įdiegti vartotojo faile */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin_ GPPIN_12; būsena = tiesa; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * NAUDOTOJO KODAS PABAIGA 4 */

Po 50 ms patikriname, ar mygtukas dar yra atstatytas arba atleistas, jei taip, tada žinome, kad mygtukas yra laukimo būsenoje. Tada perjungiame šviesos diodą, padarome būseną teisingą, kad galėtume aptikti kitą mygtuko paspaudimo ir sustabdymo laikmatį, kad galėtume jį vėl paleisti.

Taigi šis procesas užtikrins, kad išvengsime atšokimo problemos.

5 žingsnis: Išvada

Tai buvo mygtuko išjungimo kodas. Noriu pastebėti, kad šį kodą sukūriau aš ir nesu programuotojas ekspertas. Taigi, klaidų tikrai gali būti. Jei turite geresnį sprendimą, atkreipkite dėmesį. Nepamirškite, jei susidursite su kokia nors problema, parašykite man ir aš pasistengsiu padėti.

Rekomenduojamas: