Obsah:

Odpojenie tlačidla STM32CubeMX s prerušením: 5 krokov
Odpojenie tlačidla STM32CubeMX s prerušením: 5 krokov

Video: Odpojenie tlačidla STM32CubeMX s prerušením: 5 krokov

Video: Odpojenie tlačidla STM32CubeMX s prerušením: 5 krokov
Video: Toggle relay using push-button on STM32 Nucleo 2024, Júl
Anonim
Tlačidlo STM32CubeMX odbúranie s prerušením
Tlačidlo STM32CubeMX odbúranie s prerušením

Ahoj, v tomto návode sa pokúsim poskytnúť svoje jednoduché riešenie na zabránenie odrazu tlačidiel, čo je veľmi vážny problém. Na internete existuje veľa videí, ktoré ponúkajú riešenie tohto problému, ale žiadne z nich nie sú určené na externé prerušenie. Vo všetkých týchto videách je stlačenie tlačidla kontrolované metódou hlasovania, ktorá je neúčinná. Začnime teda!

Krok 1: Požiadavky na hardvér a softvér

Hardvérové požiadavky:

  • Vývojová doska STM32 ARM
  • Počítač

Požiadavky na softvér:

  • STM32CubeMX
  • Keil uVision5

Krok 2: Pochopenie problému

Pochopenie problému
Pochopenie problému

Pokúšame sa teda nájsť riešenie problému s odrážaním tlačidiel. Preto musíme problému porozumieť. Keď teda stlačíme tlačidlo, mal by prísť stav, ktorý je opačný ako predchádzajúci stav. Ak napríklad bola VYSOKÁ, musí byť NÍZKA a ak bola NÍZKA, potom musí byť VYSOKÁ. Toto je však ideálny stav (v PROTEUS:)) V skutočnosti, keď stlačíme tlačidlo, začne skákať medzi VYSOKÝMI a NÍZKYMI, než príde do nečinného stavu. Takže predstiera, že bolo niekoľkokrát stlačené, čo spôsobuje problémy. Čo by sme teda mali urobiť?

Tu chcem poznamenať, že v tomto prípade použijeme externé prerušenie na detekciu stlačenia tlačidla. Potom, čo zistíme stlačenie tlačidla, musíme chvíľu počkať, napríklad 50 mS, aby sme dosiahli pohotovostný stav a znova skontrolovali, či je tlačidlo v pohotovostnom stave alebo nie. Ak je v nečinnom stave, môžeme pokračovať v našej úlohe. Pozrime sa teda na kód:)

Krok 3: Konfigurácia STM32CubeMX

Konfigurácia STM32CubeMX
Konfigurácia STM32CubeMX

Najprv teda musíme pre naše tlačidlo povoliť externé prerušenie (tu predpokladám, že používate zisťovaciu dosku STM32F407VG):

  • Na karte „Pinout a konfigurácia“kliknite na pin PA0, ktorý je pripojený k tlačidlu, a zvoľte GPIO_EXTI0, ktorý na tomto pine umožňuje externé prerušenie.
  • Zmeňte „štítok používateľa“špendlíka na „tlačidlo_ push“alebo čokoľvek, čo chcete.

Potom musíme nakonfigurovať časovač, aby sa vytvorilo časové oneskorenie 50 mS:

  • Vstúpte do sekcie „Časovače“
  • Kliknite na TIM1
  • Ako zdroj hodín vyberte „Interné hodiny“
  • V konfigurácii (Ak chcete porozumieť tejto časti, prečítajte si tento návod, dôrazne odporúčaný „Ovládanie servomotora s MCU STM32F4 ARM“):

    • Nastaviť predzosilňovač na 32 000
    • A počítadlo období do 50
  • Na karte „Nastavenia NVIC“povoľte všetky prerušenia

Povoliť LED ako výstup:

Kliknite na PD12 a nastavte ako „GPIO_Output“

Potom nakonfigurujte hodiny ako na obrázku vyššie a vygenerujte kód.

Krok 4: Vývoj softvéru Keil

Najprv definujeme stavovú premennú, ktorá zabezpečí, že nespustíme časovač vo vonkajšom prerušení, keď dôjde k odrazu:

/ * KÓD UŽÍVATEĽA ZAČÍNA PFP */bool state = true; / * KÓD UŽÍVATEĽA KONIEC PFP */

Potom napíšeme ISR pre externé prerušenie:

neplatné HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); stav = nepravda; } else {_NOP (); }}

Po stlačení tlačidla skontrolujeme, či to bolo naše definované tlačidlo a či je stav pravdivý. Na začiatku bude stav pravdivý, aby bolo možné zadať príkaz if. Po zadaní spustíme časovač a urobíme stav false, aby sme zaistili, že odrážanie nespustí časovač.

Potom napíšeme ISR pre prerušenie časovača:

neplatné HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Zabrániť upozorneniu na kompiláciu nepoužitých argumentov * / UNUSED (htim);

/* POZNÁMKA: Táto funkcia by nemala byť upravovaná, ak je potrebné spätné volanie, HAL_TIM_PeriodElapsedCallback by bolo možné implementovať do užívateľského súboru */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_12); stav = pravda; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * KÓD UŽÍVATEĽA KONIEC 4 */

Po 50 mS skontrolujeme, či je tlačidlo ešte v stave reset alebo uvoľnené, ak áno, vieme, že tlačidlo je v nečinnom stave. Potom prepneme led, uvedieme stav na true, aby sme dokázali detekovať ďalšie stlačenie tlačidla a zastaviť časovač, aby sme ho mohli znova spustiť.

Tento proces teda zabezpečí, aby sme predišli problémom s odrážaním.

Krok 5: Záver

Toto bol kód pre odblokovanie tlačidiel. Chcem poznamenať, že tento kód som vyvinul ja a nie som odborný programátor. Chyby sa teda určite môžu vyskytnúť. Ak máte lepšie riešenie, poznamenajte si to. Nezabudnite, ak narazíte na nejaký problém, napíšte mi a pokúsim sa vám pomôcť.

Odporúča: