Оглавление:

Устранение дребезга кнопки STM32CubeMX с прерыванием: 5 шагов
Устранение дребезга кнопки STM32CubeMX с прерыванием: 5 шагов

Видео: Устранение дребезга кнопки STM32CubeMX с прерыванием: 5 шагов

Видео: Устранение дребезга кнопки STM32CubeMX с прерыванием: 5 шагов
Видео: Устранение дребезга 🛎️ контактов кнопок STM32 CMSIS (STM32F411) 2024, Июль
Anonim
Кнопка STM32CubeMX устраняет дребезг с прерыванием
Кнопка STM32CubeMX устраняет дребезг с прерыванием

Привет, в этом уроке я постараюсь дать свое простое решение, чтобы предотвратить отскок кнопки, что является очень серьезной проблемой. В Интернете есть много видео, предлагающих решение этой проблемы, но ни одного из них для внешнего прерывания. Во всех этих видео нажатие кнопки проверяется методом опроса, что неэффективно. Итак, начнем!

Шаг 1. Требования к оборудованию и программному обеспечению

Требования к оборудованию:

  • Совет по развитию STM32 ARM
  • Компьютер

Программные требования:

  • STM32CubeMX
  • Keil uVision5

Шаг 2: понимание проблемы

Понимание проблемы
Понимание проблемы

Итак, мы пытаемся найти решение проблемы подпрыгивания кнопок. Следовательно, мы должны разобраться в проблеме. Итак, когда мы нажимаем кнопку, она должна перейти в состояние, противоположное предыдущему состоянию. Например, если он был ВЫСОКИЙ, он должен быть НИЗКИМ, а если НИЗКИЙ, то он должен быть ВЫСОКИМ. Однако это идеальное состояние (в PROTEUS:)). На самом деле, когда мы нажимаем кнопку, она начинает колебаться между ВЫСОКИМ и НИЗКИМ, прежде чем перейдет в состояние ожидания. Таким образом, он делает вид, что он был нажат несколько раз, что вызывает проблемы. Итак, что нам делать?

Здесь я хочу отметить, что в этом примере мы будем использовать внешнее прерывание для обнаружения нажатия кнопки. Итак, после того, как мы обнаружим нажатие кнопки, нам нужно подождать немного времени, например, 50 мс, чтобы перейти в состояние ожидания и еще раз проверить, находится ли кнопка в состоянии ожидания или нет. Если он находится в состоянии ожидания, мы можем продолжить выполнение нашей задачи. Итак, посмотрим код:)

Шаг 3: Конфигурация STM32CubeMX

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

Итак, нам нужно сначала включить внешнее прерывание для нашей кнопки (я предполагаю, что вы используете плату обнаружения STM32F407VG):

  • На вкладке «Распиновка и конфигурация» щелкните контакт PA0, который подключен к кнопке, и выберите GPIO_EXTI0, который разрешает внешнее прерывание на этом контакте.
  • Измените «метку пользователя» пина на «Push_Button» или что угодно.

Затем нам нужно настроить таймер, чтобы создать временную задержку 50 мс:

  • Войдите в раздел "Таймеры"
  • Нажмите на TIM1
  • Выберите «Internal Clock» в качестве источника синхронизации.
  • В конфигурации (если вы хотите понять этот раздел, обратитесь к этому руководству, настоятельно рекомендуется «Управление серводвигателем с помощью STM32F4 ARM MCU»):

    • Установите предварительный делитель на 32000
    • И счетчик периода до 50
  • На вкладке «Настройки NVIC» включите все прерывания.

Включить светодиод как выход:

Щелкните PD12 и установите "GPIO_Output"

Затем настройте часы, как показано на изображении выше, и сгенерируйте код.

Шаг 4: Разработка программного обеспечения Keil

Во-первых, мы определяем переменную состояния, которая гарантирует, что мы не запустим таймер внутри внешнего прерывания, когда произойдет отскок:

/ * КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ PFP * / bool state = true; / * КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ 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); состояние = ложь; } еще {_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_PIN_12); состояние = истина; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ 4 * /

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

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

Шаг 5: Заключение

Это был код для блокировки кнопок. Хочу отметить, что этот код был разработан мной, и я не являюсь опытным программистом. Так что ошибки наверняка могут быть. Если у вас есть лучшее решение, обратите внимание на него. Не забывайте, если у вас возникнут проблемы, напишите мне, и я постараюсь помочь.

Рекомендуемые: