Tartalomjegyzék:

Az STM32CubeMX gomb visszakapcsolása megszakítással: 5 lépés
Az STM32CubeMX gomb visszakapcsolása megszakítással: 5 lépés

Videó: Az STM32CubeMX gomb visszakapcsolása megszakítással: 5 lépés

Videó: Az STM32CubeMX gomb visszakapcsolása megszakítással: 5 lépés
Videó: 18. ST7735 1.8" színes TFT kijelzők vezérlése - 2. rész 2024, November
Anonim
Az STM32CubeMX gomb megszakítással visszakapcsol
Az STM32CubeMX gomb megszakítással visszakapcsol

Szia, ebben az oktatóanyagban megpróbálok egyszerű megoldást adni a gombok visszapattanásának megakadályozására, ami nagyon komoly probléma. Az interneten sok videó kínál megoldást erre a problémára, de egyik sem külső megszakításra. Mindezekben a videókban a gombnyomást nem hatékony lekérdezési módszerrel ellenőrzik. Szóval, kezdjük!

1. lépés: Hardver- és szoftverkövetelmények

Hardverkövetelmények:

  • STM32 ARM fejlesztő tábla
  • Egy számítógép

Szoftverkövetelmények:

  • STM32CubeMX
  • Keil uVision5

2. lépés: A probléma megértése

A probléma megértése
A probléma megértése

Tehát megpróbálunk megoldást találni a gombok visszapattanásának problémájára. Ezért meg kell értenünk a kérdést. Tehát, amikor megnyomunk egy gombot, olyan állapotba kell kerülnie, amely ellentétes az előző állapotával. Például, ha MAGAS volt, akkor LOW -nak kell lennie, és ha LOW -nak, akkor HIGH -nak. Ez azonban ideális állapot (a PROTEUS -ban:)) A valóságban, amikor megnyomunk egy gombot, akkor elkezd ugrálni a HIGH és LOW között, mielőtt tétlen állapotba kerülne. Tehát úgy tesz, mintha többször megnyomták volna, ami problémákat okoz. Tehát mit kell tennünk?

Itt szeretném megjegyezni, hogy ebben a példában külső megszakítást fogunk használni a gombnyomások észleléséhez. Tehát, miután észleltük a gombnyomást, várnunk kell egy kis időt, például 50 mS, hogy elérjük az üresjáratot, és újra ellenőrizni kell, hogy a gomb készenléti állapotban van -e vagy sem. Ha készenléti állapotban van, folytathatjuk a feladatunkat. Akkor nézzük a kódot:)

3. lépés: STM32CubeMX konfiguráció

STM32CubeMX konfiguráció
STM32CubeMX konfiguráció

Tehát először engedélyeznünk kell a külső megszakítást a nyomógombunkhoz (itt feltételezem, hogy az STM32F407VG felfedezőlapot használja):

  • A "Pinout & Configuration" lapon kattintson a PA0 csapra, amely a nyomógombhoz van csatlakoztatva, és válassza a GPIO_EXTI0 lehetőséget, amely lehetővé teszi a külső megszakítást a tűn.
  • Változtassa meg a csap "felhasználói címkéjét" "Push_Button" -ra vagy bármi másra.

Ezután be kell állítanunk az időzítőt 50 mS késleltetés létrehozásához:

  • Lépjen be az "Időzítők" szakaszba
  • Kattintson a TIM1 gombra
  • Válassza ki a "Belső óra" lehetőséget óraforrásként
  • Konfigurációban (Ha szeretné megérteni ezt a részt, nézze meg ezt az oktatóanyagot, erősen ajánlott "Szervo motorvezérlés STM32F4 ARM MCU -val"):

    • Állítsa az előskálázót 32000 -re
    • És ellenpont az 50 -ig
  • Az "NVIC beállítások" lapon engedélyezze az összes megszakítást

A LED engedélyezése kimenetként:

Kattintson a PD12 elemre, és állítsa "GPIO_Output" értékre

Ezután konfigurálja az órát a fenti képen látható módon, és generálja a kódot.

4. lépés: Keil szoftverfejlesztés

Először definiáljuk az állapotváltozót, amely biztosítja, hogy ne indítsuk el az időzítőt a külső megszakításon belül, amikor ugrálás történt:

/ * A FELHASZNÁLÓI KÓD ELKEZDIK PFP */bool state = true; / * FELHASZNÁLÓI KÓD VÉGE PFP */

Ezután ISR -t írunk a külső megszakításhoz:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); állapot = hamis; } else {_NOP (); }}

Amikor megnyomjuk a gombot, ellenőrizzük, hogy ez volt -e a meghatározott nyomógombunk, és hogy az állapot igaz -e. Kezdetben az állapot igaz lesz az if utasítás megadásához. Belépés után elindítjuk az időzítőt, és hamis állapotot állítunk be annak érdekében, hogy az ugrálás ne indítsa újra az időzítőt.

Ezután ISR -t írunk az időzítő megszakításhoz:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Megakadályozza a nem használt argumentum (ok) összeállítási figyelmeztetést * / UNUSED (htim);

/* MEGJEGYZÉS: Ezt a funkciót nem szabad módosítani, ha visszahívásra van szükség, a HAL_TIM_PeriodElapsedCallback megvalósítható a felhasználói fájlban */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin_ állapot = igaz; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * FELHASZNÁLÓI KÓD VÉGE 4 */

50 ms után ellenőrizzük, hogy a gomb még visszaállított állapotban van -e, vagy elengedve, ha igen, akkor tudjuk, hogy a gomb tétlen állapotban van. Ezután átkapcsoljuk a LED -et, és az állapotot igazá tesszük, hogy felismerhessük az újabb gombnyomást és az időzítőt, hogy újra elindíthassuk.

Tehát ez a folyamat biztosítja, hogy megakadályozzuk a pattogó problémákat.

5. lépés: Következtetés

Ez a gomb lekapcsolásának kódja volt. Szeretném megjegyezni, hogy ezt a kódot én fejlesztettem ki, és nem vagyok szakértő programozó. Tehát biztosan lehetnek hibák. Ha van jobb megoldása, jegyezze meg. Ne felejtse el, ha bármilyen probléma merül fel, írjon nekem, és megpróbálok segíteni.

Ajánlott: