INHOUDSOPGAWE:

STM32CubeMX -knoppie ontkoppel met onderbreking: 5 stappe
STM32CubeMX -knoppie ontkoppel met onderbreking: 5 stappe

Video: STM32CubeMX -knoppie ontkoppel met onderbreking: 5 stappe

Video: STM32CubeMX -knoppie ontkoppel met onderbreking: 5 stappe
Video: Routen van STM32L432KC Nano PCB 2024, November
Anonim
STM32CubeMX -knoppie ontkoppel met onderbreking
STM32CubeMX -knoppie ontkoppel met onderbreking

Hallo, in hierdie tutoriaal sal ek probeer om my eenvoudige oplossing te gee om knoppies te voorkom, wat 'n baie ernstige probleem is. Op die internet is daar baie video's om hierdie probleem op te los, maar nie een vir eksterne onderbrekings nie. In al hierdie video's word die druk op die knoppie gekontroleer volgens die peilingsmetode, wat ondoeltreffend is. So, laat ons begin!

Stap 1: Vereistes vir hardeware en sagteware

Hardeware vereistes:

  • STM32 ARM ontwikkelingsbord
  • N rekenaar

Sagteware vereistes:

  • STM32CubeMX
  • Keil uVision5

Stap 2: Verstaan die probleem

Verstaan die probleem
Verstaan die probleem

Ons probeer dus 'n oplossing vind vir die probleem met die weerkaatsing van knoppies. Daarom moet ons die kwessie verstaan. Dus, as ons op 'n knoppie druk, behoort dit 'n toestand te kry wat teenoor sy vorige toestand is. Byvoorbeeld, as dit HOOG was, moet dit LAAG wees en as dit LAAG is, moet dit HOOG wees. Dit is egter 'n ideale toestand (in PROTEUS:)) In werklikheid, as ons op 'n knoppie druk, begin dit weerkaats tussen HOOG en LAAG voordat dit in 'n ledige toestand kom. Dus, maak asof dit 'n paar keer ingedruk is, wat probleme veroorsaak. So, wat moet ons doen?

Hier wil ek daarop let dat ons in hierdie voorbeeld 'n eksterne onderbreking sal gebruik om die druk op die knoppie op te spoor. Dus, nadat ons die druk op die knoppie opgespoor het, moet ons 'n rukkie wag, soos 50mS, om die ledige toestand te bereik en weer te kontroleer of die knoppie in 'n ledige toestand is of nie. As dit in 'n ledige toestand is, kan ons voortgaan met ons taak. So, laat ons die kode sien:)

Stap 3: STM32CubeMX -opset

STM32CubeMX -opset
STM32CubeMX -opset

Ons moet dus 'n eksterne onderbreking vir ons drukknoppie aktiveer (ek neem hier aan dat u STM32F407VG -ontdekkingsbord gebruik):

  • Klik in die oortjie "Pinout & Configuration" op pin PA0 wat aan die drukknoppie gekoppel is en kies GPIO_EXTI0 wat eksterne onderbreking op die pin moontlik maak.
  • Verander die 'gebruikersetiket' van die pen in 'Push_Button' of enigiets wat u wil hê.

Dan moet ons die timer instel om 'n vertraging van 50 ms te skep:

  • Voer die afdeling "Timers" in
  • Klik op TIM1
  • Kies 'Interne klok' as 'n klokbron
  • In opset (as u hierdie afdeling wil verstaan, raadpleeg hierdie tutoriaal, 'Servomotorbeheer met STM32F4 ARM MCU'):

    • Stel prescaler as 32000 in
    • En die tydperk teen 50
  • Aktiveer alle onderbrekings op die oortjie "NVIC -instellings"

Aktiveer LED as uitset:

Klik op PD12 en stel dit in as "GPIO_Output"

Stel dan die klok op soos in die prent hierbo, en genereer die kode.

Stap 4: Keil sagteware -ontwikkeling

Eerstens definieer ons 'n staatsveranderlike wat sal verseker dat ons nie 'n timer in 'n eksterne onderbreking begin as 'n weerkaatsing plaasvind nie:

/ * USER CODE BEGIN PFP */bool state = true; / * GEBRUIKERSKODE EINDE PFP */

Dan skryf ons ISR vir eksterne onderbreking:

ongeldig HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); staat = vals; } anders {_NOP (); }}

As ons op die knoppie druk, kyk ons of dit ons gedefinieerde drukknoppie is en of die toestand waar is. Aan die begin is die toestand waar om die if -stelling in te voer. Nadat ons ingegaan het, begin ons die timer en maak die toestand onwaar om te verseker dat die weerkaatsing nie weer begin nie.

Dan skryf ons ISR vir timeronderbreking:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Voorkom ongebruikte argument (e) samestellingswaarskuwing * / ONGEBRUIKT (htim);

/* OPMERKING: hierdie funksie moet nie gewysig word as die terugbel nodig is nie, die HAL_TIM_PeriodElapsedCallback kan geïmplementeer word in die gebruikerslêer */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_; staat = waar; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * GEBRUIKERSKODE EINDE 4 */

Na 50mS kyk ons of die knoppie nog in 'n hersteltoestand is of vrygestel is, en indien wel, weet ons dat die knoppie in 'n ledige toestand is. Dan skakel ons die LED, maak die toestand waar om 'n ander druk op die knoppie te kan opspoor en stop die timer om dit weer te kan begin.

Hierdie proses sal dus verseker dat ons nie weerkaatsing voorkom nie.

Stap 5: Gevolgtrekking

Dit was 'n kode vir knoppie -ontbinding. Ek wil daarop let dat hierdie kode deur my ontwikkel is en dat ek nie 'n kundige programmeerder is nie. Daar kan dus foute wees. Let op as u 'n beter oplossing het. Moenie vergeet nie, as u 'n probleem ondervind, skryf dit aan my, en ek sal probeer om te help.

Aanbeveel: