Satura rādītājs:

STM32CubeMX pogas atkāpšanās ar pārtraukumu: 5 soļi
STM32CubeMX pogas atkāpšanās ar pārtraukumu: 5 soļi

Video: STM32CubeMX pogas atkāpšanās ar pārtraukumu: 5 soļi

Video: STM32CubeMX pogas atkāpšanās ar pārtraukumu: 5 soļi
Video: Створюємо проект в STM32CubeMX, а program, build, flash, debug в VSC 2024, Jūlijs
Anonim
STM32CubeMX poga atkāpjas ar pārtraukumu
STM32CubeMX poga atkāpjas ar pārtraukumu

Sveiki, šajā apmācībā es centīšos sniegt savu vienkāršo risinājumu, lai novērstu pogu atlēcienu, kas ir ļoti nopietna problēma. Internetā ir daudz videoklipu, kas piedāvā risinājumu šai problēmai, taču neviens no tiem nav paredzēts ārējiem pārtraukumiem. Visos šajos videoklipos pogas nospiešana tiek pārbaudīta, izmantojot neefektīvu aptaujas metodi. Tātad, sāksim!

1. darbība. Prasības aparatūrai un programmatūrai

Aparatūras prasības:

  • STM32 ARM izstrādes padome
  • Dators

Prasības programmatūrai:

  • STM32CubeMX
  • Keil uVision5

2. darbība. Izprotiet problēmu

Izpratne par problēmu
Izpratne par problēmu

Tātad, mēs cenšamies atrast risinājumu pogas atlēkšanas problēmai. Tāpēc mums ir jāsaprot jautājums. Tātad, nospiežot pogu, tam vajadzētu nonākt stāvoklī, kas ir pretējs iepriekšējam stāvoklim. Piemēram, ja tas bija AUGSTS, tam jābūt ZEMAM, un, ja tas bija ZEMS, tad tam jābūt AUGSTAM. Tomēr tas ir ideāls stāvoklis (PROTEUS:)) Patiesībā, nospiežot pogu, tas sāk atlēkt starp HIGH un LOW, pirms nonāk dīkstāvē. Tātad, izliekas, ka tas ir vairākas reizes nospiests, kas rada problēmas. Tātad, ko mums vajadzētu darīt?

Šeit es vēlos atzīmēt, ka šajā piemērā mēs izmantosim ārēju pārtraukumu, lai noteiktu pogas nospiešanu. Tātad, pēc pogas nospiešanas noteikšanas mums jāgaida nedaudz laika, piemēram, 50 mS, lai sasniegtu dīkstāvi, un vēlreiz pārbaudiet, vai poga ir dīkstāvē. Ja tas ir dīkstāvē, mēs varam turpināt savu uzdevumu. Nu redzēsim kodu:)

3. darbība: STM32CubeMX konfigurācija

STM32CubeMX konfigurācija
STM32CubeMX konfigurācija

Tātad mums vispirms ir jāiespējo mūsu spiedpogas ārējais pārtraukums (šeit es pieņemu, ka jūs izmantojat STM32F407VG atklāšanas paneli):

  • Cilnē "Pinout & Configuration" noklikšķiniet uz tapas PA0, kas ir savienota ar spiedpogu, un izvēlieties GPIO_EXTI0, kas ļauj piespraust ārēji.
  • Mainiet tapas "lietotāja etiķeti" uz "Push_Button" vai jebko citu, ko vēlaties.

Pēc tam mums ir jākonfigurē taimeris, lai izveidotu 50 ms laika aizkavi:

  • Ievadiet sadaļu "Taimeri"
  • Noklikšķiniet uz TIM1
  • Kā pulksteņa avotu izvēlieties "Iekšējais pulkstenis"
  • Konfigurācijā (ja vēlaties saprast šo sadaļu, lūdzu, skatiet šo pamācību, ļoti ieteicamo "Servo motora vadība ar STM32F4 ARM MCU"):

    • Iestatiet prescaler kā 32000
    • Un skaitīšanas periods līdz 50
  • Cilnē "NVIC iestatījumi" iespējojiet visus pārtraukumus

Iespējot LED kā izeju:

Noklikšķiniet uz PD12 un iestatiet kā "GPIO_Output"

Pēc tam konfigurējiet pulksteni, kā parādīts attēlā, un ģenerējiet kodu.

4. solis: Keil programmatūras izstrāde

Pirmkārt, mēs definējam stāvokļa mainīgo, kas nodrošinās, ka mēs nesākam taimeri ārējā pārtraukumā, kad notika atsitiens:

/ * LIETOTĀJA KODS SĀK PFP */bool state = true; / * LIETOTĀJA KODS BEIDZA PFP */

Pēc tam mēs rakstām ISR ārējam pārtraukumam:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); valsts = nepatiesa; } cits {_NOP (); }}

Nospiežot pogu, mēs pārbaudām, vai tā bija mūsu noteiktā spiedpoga un vai stāvoklis ir patiess. Sākumā stāvoklis būs patiess, lai ievadītu paziņojumu if. Pēc ievadīšanas mēs sākam taimeri un padarām stāvokli nepatiesu, lai nodrošinātu, ka atlecošais taimeris netiks restartēts.

Pēc tam taimera pārtraukšanai mēs rakstām ISR:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Novērst neizmantoto argumentu (-u) apkopošanas brīdinājumu * / UNUSED (htim);

/* PIEZĪME. Šo funkciju nevajadzētu mainīt, ja ir nepieciešama atzvanīšana, HAL_TIM_PeriodElapsedCallback varētu tikt ieviests lietotāja failā */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIIN12, GPIIN12) stāvoklis = taisnība; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * LIETOTĀJA KODA END 4 */

Pēc 50 ms mēs pārbaudām, vai poga vēl nav atiestatīta vai atlaista, ja jā, tad mēs zinām, ka poga ir gaidīšanas stāvoklī. Pēc tam mēs pārslēdzam gaismas diodi, padarām stāvokli patiesu, lai varētu noteikt citu pogu nospiešanas un apturēšanas taimeri, lai varētu to atkal sākt.

Tātad, šis process nodrošinās to, ka mēs novērsīsim atlēcienu problēmu.

5. darbība. Secinājums

Tas bija pogas debounce kods. Es gribu atzīmēt, ka šo kodu izstrādāju es un es neesmu programmētājs. Tātad, noteikti var būt kļūdas. Ja jums ir labāks risinājums, lūdzu, ņemiet to vērā. Neaizmirstiet, ja rodas kādas problēmas, lūdzu, rakstiet man, un es centīšos palīdzēt.

Ieteicams: