![STM32CubeMX бутон Дебаунс с прекъсване: 5 стъпки STM32CubeMX бутон Дебаунс с прекъсване: 5 стъпки](https://i.howwhatproduce.com/images/002/image-4977-32-j.webp)
Съдържание:
2025 Автор: John Day | [email protected]. Последно модифициран: 2025-01-23 14:36
![Бутонът STM32CubeMX се отстранява с прекъсване Бутонът STM32CubeMX се отстранява с прекъсване](https://i.howwhatproduce.com/images/002/image-4977-33-j.webp)
Здравейте, в този урок ще се опитам да дам моето просто решение за предотвратяване на отскачането на бутоните, което е много сериозен проблем. В интернет има много видеоклипове, които предлагат решение на този проблем, но нито един от тях за външно прекъсване. Във всички тези видеоклипове натискането на бутон се проверява чрез метод на анкетиране, който е неефективен. Така че, нека започнем!
Стъпка 1: Изисквания към хардуера и софтуера
Хардуерни изисквания:
- STM32 ARM дъска за разработка
- Компютър
Софтуерни изисквания:
- STM32CubeMX
- Keil uVision5
Стъпка 2: Разбиране на проблема
![Разбиране на проблема Разбиране на проблема](https://i.howwhatproduce.com/images/002/image-4977-34-j.webp)
Така че, ние се опитваме да намерим решение на проблема с подскачането на бутоните. Затова трябва да разберем въпроса. Така че, когато натискаме бутон, той трябва да дойде в състояние, което е противоположно на предишното му състояние. Например, ако беше ВИСОК, той трябва да е НИСКИ, а ако беше НИСКИ, тогава трябва да е ВИСОК. Това обаче е идеално състояние (в PROTEUS:)) В действителност, когато натискаме бутон, той започва да скача между HIGH и LOW, преди да стигне до състояние на празен ход. Така че се преструва, че е натиснат няколко пъти, което създава проблеми. И така, какво трябва да направим?
Тук искам да отбележа, че в този пример ще използваме външно прекъсване, за да открием натискане на бутон. Така че, след като открием натискане на бутон, трябва да изчакаме малко време, например 50mS, за да достигнем състояние на празен ход и да проверим отново дали бутонът е в състояние на празен ход или не. Ако е в състояние на празен ход, можем да продължим към задачата си. И така, нека видим кода:)
Стъпка 3: Конфигурация на STM32CubeMX
![STM32CubeMX конфигурация STM32CubeMX конфигурация](https://i.howwhatproduce.com/images/002/image-4977-35-j.webp)
Така че, първо трябва да активираме външно прекъсване за нашия бутон (тук предполагам, че използвате дъска за откриване 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: Заключение
Това беше код за деблокиране на бутони. Искам да отбележа, че този код е разработен от мен и не съм експерт програмист. Така че със сигурност може да има грешки. Ако имате по -добро решение, моля, отбележете го. Не забравяйте, че ако срещнете някакъв проблем, моля, пишете ми и аз ще се опитам да помогна.
Препоръчано:
Прекъсване на променливотоковото захранване, LED пътеподдържаща батерия светлина: 8 стъпки
![Прекъсване на променливотоковото захранване, LED пътеподдържаща батерия светлина: 8 стъпки Прекъсване на променливотоковото захранване, LED пътеподдържаща батерия светлина: 8 стъпки](https://i.howwhatproduce.com/images/001/image-2320-j.webp)
Прекъсване на захранването с променлив ток, LED пътеводна светлина, поддържана от батерията: По време на скорошно прекъсване на захранването, в най -тъмните дълбини на мазето ми … една светлина наистина би била много удобна. За съжаление фенерчето ми беше на няколко тъмни стаи. Порових се малко, намерих светлината и се отправих към семейната стая. Моят wi
Бутон за отброяване на Arduino с бутон за почивка: 4 стъпки
![Бутон за отброяване на Arduino с бутон за почивка: 4 стъпки Бутон за отброяване на Arduino с бутон за почивка: 4 стъпки](https://i.howwhatproduce.com/images/005/image-13538-j.webp)
Бутон за обратно отброяване на Arduino с бутон за почивка: Тази инструкция ще ви научи как да създадете таймер за обратно броене с помощта на 4-цифрен 7-сегментен дисплей, който може да се нулира с бутон. Получих идеята да направя това, защото докато създавах едноцифрен 7-сегментен дисплей в клас, исках да създам нещо
Схема на бутон за алармен бутон за паника, използваща 555 IC таймер (част-1): 4 стъпки
![Схема на бутон за алармен бутон за паника, използваща 555 IC таймер (част-1): 4 стъпки Схема на бутон за алармен бутон за паника, използваща 555 IC таймер (част-1): 4 стъпки](https://i.howwhatproduce.com/images/008/image-23869-j.webp)
Схема на бутон за алармен бутон с помощта на таймер 555 (част-1): Алармена верига за паника се използва за незабавно изпращане на авариен сигнал до хората на близко място, за да се обадят за помощ или да ги предупредят. Възможната паническа ситуация може да бъде всяка, тя не се ограничава до няколко ситуации. Човек би могъл да запази
Схема на бутон за алармен бутон с паника, използваща 555 IC таймер (част-2): 3 стъпки
![Схема на бутон за алармен бутон с паника, използваща 555 IC таймер (част-2): 3 стъпки Схема на бутон за алармен бутон с паника, използваща 555 IC таймер (част-2): 3 стъпки](https://i.howwhatproduce.com/images/002/image-5652-35-j.webp)
Схема на бутон за алармен бутон с паника, използваща 555 IC таймер (част-2): Хей момчета! Запомнете част 1 от тази инструкция. Ако не погледнете тук. Продължаване по -нататък … Алармена верига за паника се използва за изпращане на спешен сигнал незабавно до хората на близко място, за да се обадят за помощ или да ги предупредят. Възможният тиган
AVR микроконтролер. Превключване на светодиодите чрез превключвател с бутон. Отстраняване на бутон: 4 стъпки
![AVR микроконтролер. Превключване на светодиодите чрез превключвател с бутон. Отстраняване на бутон: 4 стъпки AVR микроконтролер. Превключване на светодиодите чрез превключвател с бутон. Отстраняване на бутон: 4 стъпки](https://i.howwhatproduce.com/images/004/image-9193-j.webp)
AVR микроконтролер. Превключване на светодиодите чрез превключвател с бутон. Отстраняване на бутони: В този раздел ще научим как да направим код на програма C за ATMega328PU, за да превключва състоянието на трите светодиода според входа от превключвател на бутон. Също така, ние проучихме решения на проблема с „Switch Bounce“. Както обикновено, ние ще