Innholdsfortegnelse:
- Trinn 1: Krav til maskinvare og programvare
- Trinn 2: Forstå problemet
- Trinn 3: STM32CubeMX -konfigurasjon
- Trinn 4: Programvareutvikling av Keil
- Trinn 5: Konklusjon
Video: STM32CubeMX -knappen avsluttes med avbrudd: 5 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:23
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
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
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:
STM32CubeMx mikrofon (STM32F407VG): 5 trinn
STM32CubeMx mikrofon (STM32F407VG): Hei! I dette prosjektet vil vi prøve å få lyd ved å bruke mikrofon (ekstern ikke innebygd mikrofon) og spille den gjennom høyttaler. Denne opplæringen vil være veldig kort, da jeg vil gi forklaringer på prosjektdeler ved å referere til noen videoer. Så la oss hoppe
Arduino Hall -effektsensor med avbrudd: 4 trinn
Arduino Hall Effect Sensor With Interrupts: Hei alle sammen, I dag skal jeg vise deg hvordan du kan koble en hall effect sensor til en Arduino og bruke den med en interrupt. Verktøy og materialer som brukes i videoen (tilknyttede lenker): Arduino Uno: http : //s.click.aliexpress.com/e/biNyW0zKHall -effekt sensorer: h
Arduino - Periodisk avbrudd: 4 trinn
Arduino - Periodic Interrupt: Denne instruksen handler om å bruke en periodisk avbrudd for timing i Arduino -programmer. Dette er et skritt for en spirende Arduino -programmerer som vet at Arduino kan gjøre mer, men ikke helt vet hvordan det skal skje. Hvis det er en forestilling pr
DIY batterinivåindikator/automatisk avbrudd for 12v batteri: 5 trinn (med bilder)
DIY batterinivåindikator/automatisk avbrudd for 12v batteri: DIYere … Vi har alle vært igjennom situasjonen da våre high end -ladere er opptatt med å lade de litiumpolymerbatteriene, men du må fortsatt lade det 12v blybatteriet og den eneste laderen du got er en blind …. Ja en blind som det
Arduino tonegenerator uten bibliotek eller serielle funksjoner (med avbrudd): 10 trinn
Arduino Tone Generator With No Library or Serial Functions (With Interrupts): Dette er ikke noe jeg normalt vil lære om, jeg foretrekker metallarbeidet mitt, men ettersom jeg er elektroteknikkstudent og må ta en klasse på mikrokontrollere ( Embedded Systems Design), jeg tenkte jeg skulle lage en instruks på en av mine sider