Съдържание:

STM32CubeMX бутон Дебаунс с прекъсване: 5 стъпки
STM32CubeMX бутон Дебаунс с прекъсване: 5 стъпки

Видео: STM32CubeMX бутон Дебаунс с прекъсване: 5 стъпки

Видео: STM32CubeMX бутон Дебаунс с прекъсване: 5 стъпки
Видео: STM32 - программирование для начинающих. Пошагово. CubeMX CubeIDE 2024, Юли
Anonim
Бутонът STM32CubeMX се отстранява с прекъсване
Бутонът STM32CubeMX се отстранява с прекъсване

Здравейте, в този урок ще се опитам да дам моето просто решение за предотвратяване на отскачането на бутоните, което е много сериозен проблем. В интернет има много видеоклипове, които предлагат решение на този проблем, но нито един от тях за външно прекъсване. Във всички тези видеоклипове натискането на бутон се проверява чрез метод на анкетиране, който е неефективен. Така че, нека започнем!

Стъпка 1: Изисквания към хардуера и софтуера

Хардуерни изисквания:

  • STM32 ARM дъска за разработка
  • Компютър

Софтуерни изисквания:

  • STM32CubeMX
  • Keil uVision5

Стъпка 2: Разбиране на проблема

Разбиране на проблема
Разбиране на проблема

Така че, ние се опитваме да намерим решение на проблема с подскачането на бутоните. Затова трябва да разберем въпроса. Така че, когато натискаме бутон, той трябва да дойде в състояние, което е противоположно на предишното му състояние. Например, ако беше ВИСОК, той трябва да е НИСКИ, а ако беше НИСКИ, тогава трябва да е ВИСОК. Това обаче е идеално състояние (в PROTEUS:)) В действителност, когато натискаме бутон, той започва да скача между HIGH и LOW, преди да стигне до състояние на празен ход. Така че се преструва, че е натиснат няколко пъти, което създава проблеми. И така, какво трябва да направим?

Тук искам да отбележа, че в този пример ще използваме външно прекъсване, за да открием натискане на бутон. Така че, след като открием натискане на бутон, трябва да изчакаме малко време, например 50mS, за да достигнем състояние на празен ход и да проверим отново дали бутонът е в състояние на празен ход или не. Ако е в състояние на празен ход, можем да продължим към задачата си. И така, нека видим кода:)

Стъпка 3: Конфигурация на STM32CubeMX

STM32CubeMX конфигурация
STM32CubeMX конфигурация

Така че, първо трябва да активираме външно прекъсване за нашия бутон (тук предполагам, че използвате дъска за откриване STM32F407VG):

  • В раздела "Pinout & Configuration" щракнете върху щифт PA0, който е свързан с бутона и изберете GPIO_EXTI0, който позволява външно прекъсване на този щифт.
  • Променете „потребителския етикет“на щифта на „Push_Button“или каквото искате.

След това трябва да конфигурираме таймера, за да създадем 50mS забавяне във времето:

  • Влезте в секцията „Таймери“
  • Кликнете върху TIM1
  • Изберете „Вътрешен часовник“като източник на часовник
  • В конфигурацията (Ако искате да разберете този раздел, моля, вижте този урок, силно препоръчително "Управление на серво мотора със STM32F4 ARM MCU"):

    • Задайте предусилвателя на 32000
    • И период на контра до 50
  • В раздела „Настройки на NVIC“активирайте всички прекъсвания

Активиране на LED като изход:

Кликнете върху PD12 и задайте като "GPIO_Output"

След това конфигурирайте часовника, както е показано на изображението по -горе, и генерирайте кода.

Стъпка 4: Разработка на софтуер на Keil

Първо, дефинираме променлива на състоянието, която ще гарантира, че няма да стартираме таймера вътре във външно прекъсване, когато се случи отскачането:

/ * ПОТРЕБИТЕЛСКИ КОД ЗАПОЧВА PFP */bool състояние = вярно; / * ПОТРЕБИТЕЛСКИ КОД КРАЙ PFP */

След това пишем ISR за външно прекъсване:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); състояние = невярно; } else {_NOP (); }}

Когато бутонът е натиснат, ние проверяваме дали това е нашият дефиниран бутон и дали състоянието е вярно. В началото състоянието ще бъде вярно, за да въведете оператора if. След влизане стартираме таймера и правим състояние false, за да гарантираме, че отскачането няма да рестартира таймера.

След това пишем ISR за прекъсване на таймера:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Предотвратяване на неизползвани аргументи (и) компилация предупреждение * / UNUSED (htim);

/* ЗАБЕЛЕЖКА: Тази функция не трябва да се променя, когато е необходимо обратното повикване, HAL_TIM_PeriodElapsedCallback може да бъде внедрен във потребителския файл */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD_ GPIO_); състояние = вярно; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * ПОТРЕБИТЕЛСКИ КОД КРАЙ 4 */

След 50 mS проверяваме дали бутонът все още е в състояние на нулиране или е освободен, ако да, тогава знаем, че бутонът е в състояние на празен ход. След това превключваме светодиода, правим състояние вярно, за да можем да открием друго натискане на бутон и таймер за спиране, за да можем да го стартираме отново.

Така че този процес ще гарантира, че ще предотвратим проблема с подскачането.

Стъпка 5: Заключение

Това беше код за деблокиране на бутони. Искам да отбележа, че този код е разработен от мен и не съм експерт програмист. Така че със сигурност може да има грешки. Ако имате по -добро решение, моля, отбележете го. Не забравяйте, че ако срещнете някакъв проблем, моля, пишете ми и аз ще се опитам да помогна.

Препоръчано: