Innehållsförteckning:

STM32CubeMX -knappen avbryter med avbrott: 5 steg
STM32CubeMX -knappen avbryter med avbrott: 5 steg

Video: STM32CubeMX -knappen avbryter med avbrott: 5 steg

Video: STM32CubeMX -knappen avbryter med avbrott: 5 steg
Video: Monitoring the RPM of a 12Vdc Three Wire Cooler Fan with Arduino, with speed control potentiometer 2024, November
Anonim
STM32CubeMX -knappen avbryter med avbrott
STM32CubeMX -knappen avbryter med avbrott

Hej, i denna handledning kommer jag att försöka ge min enkla lösning för att förhindra knappstopp, vilket är en mycket allvarlig fråga. På internet finns det många videor att erbjuda lösning på detta problem, men inga av dem för externt avbrott. I alla dessa videoklipp kontrolleras knapptryckning med en pollingmetod som är ineffektiv. Så, låt oss börja!

Steg 1: Krav på hårdvara och programvara

Hårdvarukrav:

  • STM32 ARM utvecklingskort
  • En dator

Programvarukrav:

  • STM32CubeMX
  • Keil uVision5

Steg 2: Förstå problemet

Förstå problemet
Förstå problemet

Så vi försöker hitta en lösning för problem med knappstopp. Därför måste vi förstå frågan. Så när vi trycker på en knapp bör det komma ett tillstånd som är motsatt till dess tidigare tillstånd. Om det till exempel var HIGH måste det vara LOW och om det var LOW måste det vara HIGH. Detta är dock idealläge (i PROTEUS:)) I själva verket, när vi trycker på en knapp börjar det studsa mellan HÖG och LÅG innan det kommer till viloläge. Så låtsas att den har tryckts in flera gånger vilket orsakar problem. Så vad ska vi göra?

Här vill jag notera att i detta exempel kommer vi att använda externt avbrott för att upptäcka knapptryckning. Så, efter att vi har upptäckt knapptryckning måste vi vänta lite tid, som 50 ms för att nå viloläge och kontrollera om knappen är i viloläge eller inte. Om det är i viloläge kan vi fortsätta med vår uppgift. Så, låt oss se koden:)

Steg 3: STM32CubeMX -konfiguration

STM32CubeMX -konfiguration
STM32CubeMX -konfiguration

Så vi måste först aktivera externt avbrott för vår tryckknapp (jag antar här att du använder STM32F407VG discovery board):

  • På fliken "Pinout & Configuration" klickar du på pin PA0 som är ansluten till tryckknappen och väljer GPIO_EXTI0 som möjliggör ett externt avbrott på den stiftet.
  • Ändra "användaretiketten" på stiftet till "Push_Button" eller vad du vill.

Sedan måste vi konfigurera timern för att skapa 50 ms tidsfördröjning:

  • Ange avsnittet "Timers"
  • Klicka på TIM1
  • Välj "Intern klocka" som en klocka
  • I konfiguration (Om du vill förstå det här avsnittet, se denna handledning, rekommenderas starkt "Servomotorstyrning med STM32F4 ARM MCU"):

    • Ställ in förkalkningsmedel som 32000
    • Och kontraperiod till 50
  • På fliken "NVIC -inställningar" aktiverar du alla avbrott

Aktivera LED som utgång:

Klicka på PD12 och ställ in som "GPIO_Output"

Konfigurera sedan klockan som i bilden ovan och generera koden.

Steg 4: Keil Software Development

Först definierar vi tillståndsvariabel som säkerställer att vi inte startar timern inuti externt avbrott när studsningen inträffade:

/ * USER CODE BEGIN PFP */bool state = true; / * ANVÄNDARKOD SLUT PFP */

Sedan skriver vi ISR för externt avbrott:

ogiltig HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); tillstånd = falskt; } annat {_NOP (); }}

När knappen trycks kontrollerar vi om det var vår definierade tryckknapp och om tillståndet är sant. I början kommer staten att vara sann för att ange if -satsen. Efter att ha angett startar vi timern och gör tillståndet falskt för att säkerställa att studsningen inte startar om timern.

Sedan skriver vi ISR för timeravbrott:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Förhindra varning av oanvända argument (er) * / ANVÄND (htim);

/* OBS: Den här funktionen bör inte ändras, när återuppringning behövs, HAL_TIM_PeriodElapsedCallback kan implementeras i användarfilen */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_); tillstånd = sant; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * ANVÄNDARKOD SLUT 4 */

Efter 50 ms kontrollerar vi om knappen ännu är i återställningsläge eller släppt, om ja då vet vi att knappen är i viloläge. Sedan växlar vi lysdioden, gör tillståndet sant för att kunna upptäcka ytterligare en knapptryckning och stoppa timern för att kunna starta den igen.

Så den här processen kommer att säkerställa att vi förhindrar studseproblem.

Steg 5: Slutsats

Detta var kod för knappavstängning. Jag vill notera att den här koden utvecklades av mig och jag är inte en expertprogrammerare. Så det kan säkert finnas fel. Om du har en bättre lösning, notera det. Glöm inte, om du stöter på några problem, skriv till mig så ska jag försöka hjälpa dig.

Rekommenderad: