İçindekiler:

STM32CubeMX Düğmesi Kesintili Geri Dönme: 5 Adım
STM32CubeMX Düğmesi Kesintili Geri Dönme: 5 Adım

Video: STM32CubeMX Düğmesi Kesintili Geri Dönme: 5 Adım

Video: STM32CubeMX Düğmesi Kesintili Geri Dönme: 5 Adım
Video: #8 ESP-IDF FreeRTOS Queue-2 2024, Temmuz
Anonim
STM32CubeMX Düğmesi Kesintili Geri Dönme
STM32CubeMX Düğmesi Kesintili Geri Dönme

Merhaba, bu derste çok ciddi bir sorun olan düğme sıçramasını önlemek için basit bir çözüm sunmaya çalışacağım. İnternette bu soruna çözüm önerecek çok video var ama hiçbiri harici kesme için değil. Bu videoların tamamında butona basılması verimsiz olan yoklama yöntemi ile kontrol edilmektedir. Haydi başlayalım!

Adım 1: Donanım ve Yazılım Gereksinimleri

Donanım Gereksinimleri:

  • STM32 ARM geliştirme kurulu
  • Bir bilgisayar

Yazılım gereksinimleri:

  • STM32CubeMX
  • Keil uVision5

Adım 2: Sorunu Anlamak

Problemi Anlamak
Problemi Anlamak

Bu yüzden buton zıplama sorununa çözüm bulmaya çalışıyoruz. Bu nedenle, sorunu anlamalıyız. Yani bir butona bastığımızda önceki durumunun tam tersi bir duruma gelmelidir. Örneğin, YÜKSEK ise DÜŞÜK, DÜŞÜK ise YÜKSEK olmalıdır. Ancak bu ideal bir durumdur (PROTEUS'ta:)) Gerçekte, bir düğmeye bastığımızda, boş duruma gelmeden önce YÜKSEK ve DÜŞÜK arasında gidip gelmeye başlar. Yani, birkaç kez basıldığını iddia ediyor ve bu da sorunlara neden oluyor. Peki, ne yapmalıyız?

Burada belirtmek isterim ki bu örnekte butona basıldığını algılamak için harici kesme kullanacağız. Yani butona basıldığını tespit ettikten sonra, boş duruma gelmek için 50mS gibi bir süre beklememiz ve butonun boş durumda olup olmadığını tekrar kontrol etmemiz gerekiyor. Boştaysa, görevimize devam edebiliriz. O halde kodu görelim:)

Adım 3: STM32CubeMX Yapılandırması

STM32CubeMX Yapılandırması
STM32CubeMX Yapılandırması

Bu nedenle, önce basmalı düğmemiz için harici kesmeyi etkinleştirmemiz gerekiyor (burada STM32F407VG keşif kartını kullandığınızı varsayıyorum):

  • "Pinout & Configuration" sekmesinde, butona bağlı olan PA0 pinine tıklayın ve bu pin üzerinde harici kesmeyi sağlayan GPIO_EXTI0'ı seçin.
  • Pimin "kullanıcı etiketini" "Push_Button" veya istediğiniz herhangi bir şeyle değiştirin.

Ardından, 50mS zaman gecikmesi oluşturmak için zamanlayıcıyı yapılandırmamız gerekiyor:

  • "Zamanlayıcılar" bölümüne girin
  • TIM1'e tıklayın
  • Saat kaynağı olarak "Dahili Saat"i seçin
  • Konfigürasyonda (Bu bölümü anlamak istiyorsanız lütfen bu öğreticiye bakın, şiddetle tavsiye edilen "STM32F4 ARM MCU ile Servo Motor Kontrolü"):

    • Ön ölçekleyiciyi 32000 olarak ayarla
    • Ve 50'ye karşı süre
  • "NVIC Ayarları" sekmesinde tüm kesintileri etkinleştirin

LED'i çıkış olarak etkinleştirin:

PD12'ye tıklayın ve "GPIO_Output" olarak ayarlayın

Ardından, saati yukarıdaki resimdeki gibi yapılandırın ve kodu oluşturun.

Adım 4: Keil Yazılım Geliştirme

İlk olarak, sıçrama gerçekleştiğinde harici kesme içinde zamanlayıcıyı başlatmamamızı sağlayacak durum değişkenini tanımlıyoruz:

/* KULLANICI KODU BEGIN PFP */bool state = true; /* KULLANICI KODU SON PFP */

Ardından, harici kesme için ISR yazıyoruz:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); durum = yanlış; } başka{ _NOP(); } }

Düğmeye basıldığında, tanımlı düğmemiz olup olmadığını ve durumun doğru olup olmadığını kontrol ederiz. Başlangıçta if ifadesini girmek için durum doğru olacaktır. Girdikten sonra zamanlayıcıyı başlatır ve sıçramanın zamanlayıcıyı yeniden başlatmamasını sağlamak için durumu yanlış yaparız.

Ardından, zamanlayıcı kesmesi için ISR yazıyoruz:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* Kullanılmayan argüman(lar) derlemesini engelle uyarı */ UNUSED(htim);

/* NOT: Geri arama gerektiğinde bu fonksiyon değiştirilmemelidir, HAL_TIM_PeriodElapsedCallback kullanıcı dosyasında uygulanabilir */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); durum = doğru; HAL_TIM_Base_Stop_IT(&htim1); } }

/* KULLANICI KODU SON 4 */

50mS'den sonra düğmenin henüz sıfırlama durumunda mı yoksa serbest mi kaldığını kontrol ediyoruz, evet ise o zaman düğmenin boşta olduğunu biliyoruz. Daha sonra ledi açarız, başka bir tuşa basmak için durumu doğru yaparız ve tekrar başlatabilmek için timer'ı durdururuz.

Dolayısıyla bu işlem sıçrama sorununun önüne geçmemizi sağlayacaktır.

Adım 5: Sonuç

Bu, düğmenin geri dönmesi için koddu. Bu kodun benim tarafımdan geliştirildiğini ve uzman bir programcı olmadığımı belirtmek isterim. Yani, kesinlikle hatalar olabilir. Daha iyi bir çözümünüz varsa lütfen not edin. Unutmayın, herhangi bir sorunla karşılaşırsanız lütfen bana yazın, yardımcı olmaya çalışırım.

Önerilen: