Innholdsfortegnelse:

STM32CubeMX -knappen avsluttes med avbrudd: 5 trinn
STM32CubeMX -knappen avsluttes med avbrudd: 5 trinn

Video: STM32CubeMX -knappen avsluttes med avbrudd: 5 trinn

Video: STM32CubeMX -knappen avsluttes med avbrudd: 5 trinn
Video: Monitoring the RPM of a 12Vdc Three Wire Cooler Fan with Arduino, with speed control potentiometer 2024, Juli
Anonim
STM32CubeMX -knappen avsluttes med avbrudd
STM32CubeMX -knappen avsluttes med avbrudd

Hei, i denne opplæringen vil jeg prøve å gi min enkle løsning for å forhindre knappestopp som er et veldig alvorlig problem. På internett er det mange videoer som tilbyr løsning på dette problemet, men ikke noen av dem for ekstern avbrudd. I alle disse videoene kontrolleres knappetrykk ved avstemningsmetode som er ineffektiv. Så, la oss begynne!

Trinn 1: Krav til maskinvare og programvare

Krav til maskinvare:

  • STM32 ARM utviklingstavle
  • En datamaskin

Programvarekrav:

  • STM32CubeMX
  • Keil uVision5

Trinn 2: Forstå problemet

Forstå problemet
Forstå problemet

Så vi prøver å finne en løsning på knappestoppproblemet. Derfor må vi forstå problemet. Så når vi trykker på en knapp, bør den komme i en tilstand som er motsatt av sin tidligere tilstand. For eksempel, hvis det var HØYT, må det være LAVT, og hvis det var LAVT, må det være HØYT. Imidlertid er dette en ideell tilstand (i PROTEUS:)) I virkeligheten, når vi trykker på en knapp, begynner den å sprette mellom HØY og LAV før den kommer til inaktiv tilstand. Så later som om den har blitt trykket flere ganger, noe som forårsaker problemer. Så hva skal vi gjøre?

Her vil jeg merke til at i dette eksemplet vil vi bruke ekstern avbrudd for å oppdage knappetrykk. Så, etter at vi har oppdaget knappetrykk, må vi vente litt tid, for eksempel 50 ms for å nå inaktiv tilstand og kontrollere om knappen er inaktiv eller ikke. Hvis den er i inaktiv tilstand, kan vi fortsette med oppgaven vår. Så la oss se koden:)

Trinn 3: STM32CubeMX -konfigurasjon

STM32CubeMX -konfigurasjon
STM32CubeMX -konfigurasjon

Så vi må først aktivere ekstern avbrudd for trykknappen vår (jeg antar at du bruker STM32F407VG discovery board):

  • I kategorien "Pinout & Configuration" klikker du på pin PA0 som er koblet til trykknappen og velger GPIO_EXTI0 som muliggjør ekstern avbrudd på den pin.
  • Endre "brukeretiketten" på pinnen til "Push_Button" eller hva du vil.

Deretter må vi konfigurere tidtaker for å lage 50 ms tidsforsinkelse:

  • Gå til delen "Timere"
  • Klikk på TIM1
  • Velg "Intern klokke" som en klokke kilde
  • I konfigurasjon (Hvis du vil forstå denne delen, vennligst se denne opplæringen, sterkt anbefalt "Servomotorstyring med STM32F4 ARM MCU"):

    • Sett forhåndsskaler til 32000
    • Og kontraperiode til 50
  • I kategorien "NVIC -innstillinger" aktiverer du alle avbruddene

Aktiver LED som utgang:

Klikk på PD12 og angi som "GPIO_Output"

Konfigurer deretter klokken som på bildet ovenfor og generer koden.

Trinn 4: Programvareutvikling av Keil

Først definerer vi tilstandsvariabel som vil sikre at vi ikke starter timer inne i ekstern avbrudd når hoppet skjedde:

/ * USER CODE BEGIN PFP */bool state = true; / * BRUKERKODE END PFP */

Deretter skriver vi ISR for ekstern avbrudd:

ugyldig HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); tilstand = usann; } annet {_NOP (); }}

Når du trykker på knappen, sjekker vi om det var vår definerte trykknapp og om tilstanden er sann. I begynnelsen vil staten være sann for å angi if -setningen. Etter å ha angitt starter vi timeren og gjør tilstanden usann for å sikre at hoppet ikke starter timeren på nytt.

Deretter skriver vi ISR for tidsavbrudd:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Forhindre ubrukt argument (er) for samlingsvarsel * / UBRUKT (htim);

/* MERK: Denne funksjonen bør ikke endres når tilbakeringing er nødvendig, HAL_TIM_PeriodElapsedCallback kan implementeres i brukerfilen */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_); tilstand = sant; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * BRUKERKODE SLUTT 4 */

Etter 50 ms kontrollerer vi om knappen ennå er i tilbakestillingsstatus eller slippes. Hvis ja, vet vi at knappen er i inaktiv tilstand. Deretter bytter vi LED, gjør tilstanden sann for å kunne oppdage et nytt knappetrykk og stoppe timeren for å kunne starte den igjen.

Så denne prosessen vil sikre at vi forhindrer problemer med å hoppe.

Trinn 5: Konklusjon

Dette var kode for knappebesparelse. Jeg vil merke at denne koden ble utviklet av meg, og jeg er ikke en ekspert programmerer. Så det kan sikkert være feil. Vær oppmerksom på det hvis du har en bedre løsning. Ikke glem, skriv til meg hvis du støter på noe, så skal jeg prøve å hjelpe.

Anbefalt: