Mündəricat:

STM32CubeMX Düyməsini kəsməklə çıxın: 5 addım
STM32CubeMX Düyməsini kəsməklə çıxın: 5 addım

Video: STM32CubeMX Düyməsini kəsməklə çıxın: 5 addım

Video: STM32CubeMX Düyməsini kəsməklə çıxın: 5 addım
Video: Программирование STM32 Blue Pill с помощью релейной логики ПЛК LDmicro 2024, Noyabr
Anonim
STM32CubeMX Düyməsini kəsmə ilə çıxarın
STM32CubeMX Düyməsini kəsmə ilə çıxarın

Salam, bu dərslikdə çox ciddi bir problem olan düymənin sıçramasının qarşısını almaq üçün sadə həllimi verməyə çalışacağam. İnternetdə bu problemin həllini təklif edəcək bir çox video var, ancaq xarici müdaxilə üçün deyil. Bu videoların hamısında düymə basması səmərəsiz olan sorğu üsulu ilə yoxlanılır. Beləliklə, başlayaq!

Addım 1: Avadanlıq və Proqram Tələbləri

Avadanlıq tələbləri:

  • STM32 ARM inkişaf lövhəsi
  • Kompüter

Proqram tələbləri:

  • STM32CubeMX
  • Keil uVision 5

Addım 2: Problemi anlamaq

Problemi Anlamaq
Problemi Anlamaq

Beləliklə, düymələrin sıçrayan probleminin həllini tapmağa çalışırıq. Ona görə də məsələni başa düşməliyik. Beləliklə, bir düyməyə basdığımızda, əvvəlki vəziyyətinə zidd olan bir vəziyyət gəlməlidir. Məsələn, YÜKSEK olsaydı DÜŞÜK, YÜKSƏK isə YÜKSƏK olmalıdır. Ancaq bu ideal vəziyyətdir (PROTEUS -da:)) Əslində, bir düyməyə basdığımız zaman boş vəziyyətə gəlməzdən əvvəl YÜKSƏK və DÜŞÜK arasında sıçramağa başlayır. Beləliklə, problemlərə səbəb olan bir neçə dəfə basıldığını iddia edir. Yaxşı, nə etməliyik?

Burada qeyd etmək istəyirəm ki, bu nümunədə düyməni basmağı aşkar etmək üçün xarici kəsilmədən istifadə edəcəyik. Beləliklə, düyməni basdıqdan sonra boş vəziyyətə çatmaq və düymənin boş vəziyyətdə olub olmadığını yenidən yoxlamaq üçün 50mS kimi bir az gözləməliyik. Boş vəziyyətdədirsə, vəzifəmizə davam edə bilərik. Beləliklə, kodu görək:)

Addım 3: STM32CubeMX Konfiqurasiyası

STM32CubeMX Konfiqurasiyası
STM32CubeMX Konfiqurasiyası

Beləliklə, əvvəlcə düyməmiz üçün xarici kəsilməni aktiv etməliyik (burada STM32F407VG kəşf lövhəsindən istifadə etdiyinizi düşünürəm):

  • "Pinout və Konfiqurasiya" sekmesinde, basma düyməsinə bağlı olan PA0 pininə basın və bu pin üzərində xarici müdaxiləni təmin edən GPIO_EXTI0 seçin.
  • Pinin "istifadəçi etiketini" "Push_Button" və ya istədiyiniz hər şeyə dəyişdirin.

Sonra 50mS vaxt gecikməsi yaratmaq üçün taymer konfiqurasiya etməliyik:

  • "Taymerlər" bölməsinə daxil olun
  • TIM1 düyməsini basın
  • Saat mənbəyi olaraq "Daxili Saat" ı seçin
  • Konfiqurasiyada (Bu bölümü başa düşmək istəyirsinizsə, bu təlimata baxın, yüksək tövsiyə olunan "STM32F4 ARM MCU ilə Servo Motor İdarəetmə"):

    • Öncədən ölçmə cihazını 32000 olaraq təyin edin
    • Və 50 -ə qarşı say
  • "NVIC Ayarları" sekmesinde bütün fasilələri aktiv edin

Çıxış olaraq LED -i aktiv edin:

PD12 düyməsini basın və "GPIO_Output" olaraq təyin edin

Sonra saatı yuxarıda göstərildiyi kimi konfiqurasiya edin və kodu yaradın.

Addım 4: Keil Proqram İnkişafı

Birincisi, sıçrayış baş verdikdə xarici fasilə içərisində taymeri başlamamağımızı təmin edəcək vəziyyət dəyişənini təyin edirik:

/ * KULLANICI KODU PFP BAŞLADI */bool state = true; / * İSTİFADƏÇİ KODU SON PFP */

Sonra xarici fasilə üçün ISR yazırıq:

boş HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); vəziyyət = yalan; } başqa {_NOP (); }}

Düymə basıldığında, müəyyən edilmiş düyməmiz olub olmadığını və vəziyyətin doğru olub olmadığını yoxlayırıq. If ifadəsinə girmək üçün əvvəlcə vəziyyət doğru olacaq. Daxil olduqdan sonra, taymeri işə salırıq və sıçrayışın taymeri yenidən başlamamasını təmin etmək üçün saxta vəziyyətə salırıq.

Sonra, taymer kəsilməsi üçün ISR yazırıq:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *İstifadə edilməmiş arqument (lər) tərtib xəbərdarlığı * / QULLANILMAMIŞ (htim);

/* DİQQƏT: Geri çağırma lazım olduqda bu funksiya dəyişdirilməməlidir.

HAL_TIM_PeriodElapsedCallback istifadəçi faylında tətbiq oluna bilər */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_) vəziyyət = doğru; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * İSTİFADƏÇİ KODU SON 4 */

50mS -dən sonra düymənin sıfırlama vəziyyətində olub olmadığını yoxlayırıqsa, bəli, bu düymənin boş vəziyyətdə olduğunu bilirik. Sonra yenidən açmaq üçün başqa bir düyməni basmaq və taymeri dayandırmaq üçün ledi dəyişirik, vəziyyəti doğru edirik.

Beləliklə, bu proses sıçrayış probleminin qarşısını almağımızı təmin edəcək.

Addım 5: Nəticə

Bu düyməni çıxarmaq üçün kod idi. Qeyd etmək istəyirəm ki, bu kod mənim tərəfimdən hazırlanmışdır və təcrübəli proqramçı deyiləm. Beləliklə, şübhəsiz ki, səhvlər ola bilər. Daha yaxşı bir həlliniz varsa, qeyd edin. Unutmayın, hər hansı bir problemlə qarşılaşsanız mənə yazın və kömək etməyə çalışacağam.

Tövsiyə: