Sisällysluettelo:

STM32CubeMX -painike poistuu keskeytyksestä: 5 vaihetta
STM32CubeMX -painike poistuu keskeytyksestä: 5 vaihetta

Video: STM32CubeMX -painike poistuu keskeytyksestä: 5 vaihetta

Video: STM32CubeMX -painike poistuu keskeytyksestä: 5 vaihetta
Video: #Шаг2.Создание первого проекта на stm32CubeMX. Мигание светодиода. stm32Blink_1. 2024, Joulukuu
Anonim
STM32CubeMX -painike poistuu keskeytyksen kanssa
STM32CubeMX -painike poistuu keskeytyksen kanssa

Hei, tässä opetusohjelmassa yritän antaa yksinkertaisen ratkaisuni estääksesi painikkeiden pomppimisen, mikä on erittäin vakava ongelma. Internetissä on monia videoita, jotka tarjoavat ratkaisun tähän ongelmaan, mutta ei muita ulkoiseen keskeytykseen. Kaikissa näissä videoissa painikkeen painallus tarkistetaan tehottomalla pollausmenetelmällä. Aloitetaan siis!

Vaihe 1: Laitteisto- ja ohjelmistovaatimukset

Laitteistovaatimukset:

  • STM32 ARM -kehityskortti
  • Tietokone

Ohjelmistovaatimukset:

  • STM32CubeMX
  • Keil uVision 5

Vaihe 2: Ongelman ymmärtäminen

Ongelman ymmärtäminen
Ongelman ymmärtäminen

Joten yritämme löytää ratkaisun painikkeiden pomppimisongelmaan. Siksi meidän on ymmärrettävä ongelma. Joten kun painamme painiketta, sen pitäisi tulla tila, joka on päinvastainen kuin edellinen tila. Jos esimerkiksi se oli KORKEA, sen on oltava MATALA ja jos se oli MATALA, sen on oltava KORKEA. Tämä on kuitenkin ihanteellinen tila (PROTEUS:)) Todellisuudessa painettaessa painiketta se alkaa pomppia HIGH ja LOW välillä ennen kuin se siirtyy valmiustilaan. Joten teeskentelee, että sitä on painettu useita kertoja, mikä aiheuttaa ongelmia. Joten mitä meidän pitäisi tehdä?

Tässä haluan huomata, että tässä esimerkissä käytämme ulkoista keskeytystä painikkeen painalluksen havaitsemiseksi. Joten kun olemme havainneet painikkeen painamisen, meidän on odotettava vähän aikaa, kuten 50 mS, jotta voimme saavuttaa valmiustilan ja tarkistaa uudelleen, onko painike valmiustila vai ei. Jos se on lepotilassa, voimme jatkaa tehtäväämme. Katsotaan siis koodia:)

Vaihe 3: STM32CubeMX -määritykset

STM32CubeMX -kokoonpano
STM32CubeMX -kokoonpano

Joten meidän on ensin otettava ulkoinen keskeytys käyttöön painikkeellemme (oletan tässä, että käytät STM32F407VG -etsintäkorttia):

  • Napsauta "Pinout & Configuration" -välilehdessä painiketta PA0, joka on kytketty painikkeeseen, ja valitse GPIO_EXTI0, joka mahdollistaa ulkoisen keskeytyksen kyseisellä tapilla.
  • Vaihda nastan "käyttäjän tarra" muotoon "Push_Button" tai mitä tahansa.

Sitten meidän on määritettävä ajastin 50 ms: n aikaviiveen luomiseksi:

  • Siirry "Ajastimet" -osioon
  • Napsauta TIM1
  • Valitse "Sisäinen kello" kellon lähteeksi
  • Kokoonpanossa (Jos haluat ymmärtää tämän osan, katso tämä opetusohjelma, erittäin suositeltava "Servomoottorin ohjaus STM32F4 ARM MCU: lla"):

    • Aseta esiasetin 32000
    • Ja vasta -aika 50: een
  • Ota kaikki keskeytykset käyttöön "NVIC -asetukset" -välilehdessä

Ota LED käyttöön ulostulona:

Napsauta PD12 ja aseta "GPIO_Output"

Määritä sitten kello kuten yllä olevassa kuvassa ja luo koodi.

Vaihe 4: Keil -ohjelmistokehitys

Ensinnäkin määritämme tilamuuttujan, joka varmistaa, ettemme käynnistä ajastinta ulkoisen keskeytyksen sisällä, kun pomppiminen tapahtui:

/ * USER CODE BEGIN PFP */bool state = true; / * KÄYTTÖKOODI LOPPU PFP */

Kirjoitetaan sitten ISR ulkoiselle keskeytykselle:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); tila = epätosi; } muu {_NOP (); }}

Kun painiketta painetaan, tarkistamme, onko se määritelty painike ja onko tila totta. Alussa tila on tosi voidakseen syöttää if -lauseen. Syöttämisen jälkeen aloitamme ajastimen ja teemme tilasta epätodellisen varmistaaksemme, että pomppiminen ei käynnistä ajastinta uudelleen.

Sitten kirjoitamme ISR ajastinkeskeytykselle:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Estä käyttämättömien argumenttien kokoamisvaroitus * / UNUSED (htim);

/* HUOMAUTUS: Tätä toimintoa ei saa muuttaa, kun soittopyyntöä tarvitaan, HAL_TIM_PeriodElapsedCallback voitaisiin toteuttaa käyttäjätiedostossa */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIIN, GPIIN12) tila = tosi; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * KÄYTTÄJÄKOODIN LOPPU 4 */

50 ms: n jälkeen tarkistamme, onko painike vielä nollaustilassa tai vapautettu, jos kyllä, tiedämme, että painike on lepotilassa. Sitten vaihdamme lediä, teemme tilasta totta, jotta voimme havaita toisen painalluksen ja pysäyttää ajastimen voidaksemme käynnistää sen uudelleen.

Joten tämä prosessi varmistaa, että estämme poistumisen ongelman.

Vaihe 5: Johtopäätös

Tämä oli painikkeen poiston koodi. Haluan huomata, että olen kehittänyt tämän koodin enkä ole asiantuntijaohjelmoija. Eli virheitä voi varmasti tulla. Jos sinulla on parempi ratkaisu, muista se. Älä unohda, jos kohtaat ongelmia, kirjoita minulle ja yritän auttaa.

Suositeltava: