Përmbajtje:

Butoni STM32CubeMX Debounce With Interrupt: 5 Hapa
Butoni STM32CubeMX Debounce With Interrupt: 5 Hapa

Video: Butoni STM32CubeMX Debounce With Interrupt: 5 Hapa

Video: Butoni STM32CubeMX Debounce With Interrupt: 5 Hapa
Video: Программирование STM32 Blue Pill с помощью релейной логики ПЛК LDmicro 2024, Korrik
Anonim
Butoni STM32CubeMX Debounce With Interrupt
Butoni STM32CubeMX Debounce With Interrupt

Përshëndetje, në këtë tutorial do të përpiqem të jap zgjidhjen time të thjeshtë për të parandaluar kërcimin e butonit i cili është çështje shumë serioze. Në internet ka shumë video për të ofruar zgjidhje për këtë çështje, por asnjëra prej tyre për ndërprerje të jashtme. Në të gjitha këto video shtypja e butonit kontrollohet me metodën e votimit e cila është joefikase. Pra, le të fillojmë!

Hapi 1: Kërkesat për harduer dhe softuer

Kërkesat për harduerin:

  • Bordi i zhvillimit STM32 ARM
  • Një kompjuter

Kërkesat e softuerit:

  • STM32CubeMX
  • Keil uVision5

Hapi 2: Kuptimi i problemit

Kuptimi i Problemit
Kuptimi i Problemit

Pra, ne përpiqemi të gjejmë zgjidhje për problemin e kërcimit të butonave. Prandaj, ne duhet ta kuptojmë çështjen. Pra, kur shtypim një buton duhet të vijë një gjendje e kundërt me gjendjen e mëparshme. Për shembull, nëse ishte I LART duhet të jetë I ULOWT dhe nëse ishte I UL thenT atëherë duhet të jetë LART. Sidoqoftë, kjo është gjendja ideale (në PROTEUS:)) Në realitet, kur shtypim një buton fillon të kërcejë midis HIGH dhe LOW para se të vijë në gjendje boshe. Pra, pretendon se është shtypur disa herë gjë që shkakton probleme. Pra, çfarë duhet të bëjmë?

Këtu dua të vërej se në këtë shembull, ne do të përdorim ndërprerës të jashtëm për të zbuluar shtypjen e butonit. Pra, pasi të zbulojmë shtypjen e butonit, duhet të presim pak kohë, si 50mS në mënyrë që të arrijmë gjendjen boshe dhe të kontrollojmë përsëri nëse butoni është në gjendje boshe apo jo. Nëse është në gjendje boshe, atëherë mund të vazhdojmë me detyrën tonë. Pra, le të shohim kodin:)

Hapi 3: Konfigurimi STM32CubeMX

Konfigurimi STM32CubeMX
Konfigurimi STM32CubeMX

Pra, së pari duhet të aktivizojmë ndërprerjen e jashtme për butonin tonë të shtypjes (supozoj këtu që ju përdorni tabelën e zbulimit STM32F407VG):

  • Në skedën "Pinout & Configuration" klikoni në pin PA0 e cila është e lidhur me butonin shtytës dhe zgjidhni GPIO_EXTI0 e cila mundëson ndërprerje të jashtme në atë pin.
  • Ndryshoni "etiketën e përdoruesit" të kunjit në "Push_Button" ose gjithçka që dëshironi.

Pastaj, ne duhet të konfigurojmë kohëmatësin në mënyrë që të krijojmë një vonesë kohore 50mS:

  • Shkruani seksionin "Kohëmatësit"
  • Klikoni në TIM1
  • Zgjidhni "Ora e Brendshme" si burim Orë
  • Në konfigurim (Nëse doni të kuptoni këtë seksion, ju lutemi referojuni këtij udhëzuesi, shumë të rekomanduar "Servo Motor Control With STM32F4 ARM MCU"):

    • Vendosni parashkruesin si 32000
    • Dhe periudha kundër 50
  • Në skedën "Cilësimet NVIC" aktivizoni të gjitha ndërprerjet

Aktivizoni LED si dalje:

Klikoni në PD12 dhe vendoseni si "GPIO_Output"

Pastaj, konfiguroni orën si në imazhin e dhënë më sipër dhe gjeneroni kodin.

Hapi 4: Zhvillimi i softuerit Keil

Së pari, ne përcaktojmë ndryshoren e gjendjes e cila do të sigurojë që të mos fillojmë kohëmatësin brenda ndërprerjes së jashtme kur ka ndodhur kërcimi:

/ * KODI I PERRDORUESIT FILLON PFP */bool state = true; / * KODI I PERRDORIMIT P ENDR PFP */

Pastaj, ne shkruajmë ISR për ndërprerjen e jashtme:

pavlefshme HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && gjendja == e vërtetë) {HAL_TIM_Base_Start_IT (& htim1); gjendje = false; } tjetër {_NOP (); }}

Kur shtypet butoni ne kontrollojmë nëse ishte butoni ynë i përcaktuar dhe nëse gjendja është e vërtetë. Në fillim gjendja do të jetë e vërtetë për të futur deklaratën if. Pas hyrjes ne fillojmë kohëmatësin dhe e bëjmë gjendjen false në mënyrë që të sigurohemi që kërcimi nuk do të rifillojë kohëmatësin.

Pastaj, ne shkruajmë ISR për ndërprerjen e kohëmatësit:

i pavlefshëm HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Parandaloni paralajmërimin e përpilimit të argumenteve të papërdorur * / PUSRDORUAR (htim);

/* SHENIM: Ky funksion nuk duhet të modifikohet, kur nevojitet përgjigja në telefon, HAL_TIM_PeriodElapsedCallback mund të zbatohet në skedarin e përdoruesit */ nëse (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPI12); gjendja = e vërtetë; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * KODI I PERRDORIMIT FUND 4 *//

Pas 50mS ne kontrollojmë nëse butoni është akoma në gjendje të rivendosur apo i lëshuar, nëse po atëherë e dimë që ai buton është në gjendje boshe. Pastaj ne ndryshojmë led -in, e bëjmë gjendjen të vërtetë në mënyrë që të jemi në gjendje të zbulojmë një shtypje tjetër butoni dhe të ndalim kohëmatësin në mënyrë që të jemi në gjendje ta fillojmë përsëri.

Pra, ky proces do të sigurojë që ne të parandalojmë çështjen e kërcimit.

Hapi 5: Përfundimi

Ky ishte kodi për heqjen e butonit. Dua të vërej se ky kod është zhvilluar nga unë dhe nuk jam programues ekspert. Pra, me siguri mund të ketë gabime. Nëse keni një zgjidhje më të mirë, ju lutemi vini re atë. Mos harroni, nëse hasni ndonjë problem ju lutem më shkruani dhe unë do të përpiqem t'ju ndihmoj.

Recommended: