Tabla de contenido:

Rebote del botón STM32CubeMX con interrupción: 5 pasos
Rebote del botón STM32CubeMX con interrupción: 5 pasos

Video: Rebote del botón STM32CubeMX con interrupción: 5 pasos

Video: Rebote del botón STM32CubeMX con interrupción: 5 pasos
Video: Configuración módulo serial (UART) STM32F746ZG 2024, Mes de julio
Anonim
Rebote del botón STM32CubeMX con interrupción
Rebote del botón STM32CubeMX con interrupción

Hola, en este tutorial intentaré dar mi solución simple para evitar que los botones reboten, lo cual es un problema muy serio. En Internet hay muchos videos para ofrecer una solución a este problema, pero ninguno para interrupciones externas. En todos estos videos, la presión del botón se verifica mediante un método de sondeo que es ineficaz. Entonces, ¡comencemos!

Paso 1: requisitos de hardware y software

Requisitos de hardware:

  • Placa de desarrollo STM32 ARM
  • Un ordenador

Requisitos de Software:

  • STM32CubeMX
  • Keil uVision5

Paso 2: Comprensión del problema

Entender el problema
Entender el problema

Por lo tanto, intentamos encontrar una solución para el problema de rebote de botones. Por tanto, tenemos que entender el problema. Entonces, cuando presionamos un botón, debería llegar a un estado opuesto al estado anterior. Por ejemplo, si era ALTO tiene que ser BAJO y si es BAJO, entonces tiene que ser ALTO. Sin embargo, este es el estado ideal (en PROTEUS:)) En realidad, cuando presionamos un botón, comienza a rebotar entre HIGH y LOW antes de llegar al estado inactivo. Entonces, finge que ha sido presionado varias veces lo que causa problemas. Entonces, ¿qué debemos hacer?

Aquí quiero señalar que en este ejemplo, usaremos una interrupción externa para detectar la pulsación de un botón. Entonces, después de que detectemos la presión del botón, debemos esperar un poco de tiempo, como 50 ms para alcanzar el estado inactivo y verificar nuevamente si el botón está inactivo o no. Si está en estado inactivo, podemos continuar con nuestra tarea. Entonces, veamos el código:)

Paso 3: Configuración de STM32CubeMX

Configuración STM32CubeMX
Configuración STM32CubeMX

Por lo tanto, primero debemos habilitar la interrupción externa para nuestro botón pulsador (supongo que aquí usa la placa de descubrimiento STM32F407VG):

  • En la pestaña "Pinout & Configuration", haga clic en el pin PA0 que está conectado al botón pulsador y elija GPIO_EXTI0 que habilita la interrupción externa en ese pin.
  • Cambie la "etiqueta de usuario" del pin a "Push_Button" o cualquier cosa que desee.

Luego, necesitamos configurar el temporizador para crear un retardo de tiempo de 50 ms:

  • Ingrese a la sección "Temporizadores"
  • Haga clic en TIM1
  • Elija "Reloj interno" como fuente de reloj
  • En la configuración (si desea comprender esta sección, consulte este tutorial, muy recomendable "Control de servomotor con STM32F4 ARM MCU"):

    • Establecer el prescaler como 32000
    • Y contador a 50
  • En la pestaña "Configuración de NVIC", habilite todas las interrupciones

Habilite el LED como salida:

Haga clic en PD12 y establezca como "GPIO_Output"

Luego, configure el reloj como se muestra en la imagen anterior y genere el código.

Paso 4: Desarrollo de software de Keil

Primero, definimos la variable de estado que asegurará que no iniciemos el temporizador dentro de la interrupción externa cuando ocurrió el rebote:

/ * CÓDIGO DE USUARIO COMIENZO PFP * / bool state = true; / * CÓDIGO DE USUARIO FIN PFP * /

Luego, escribimos ISR para interrupción externa:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && estado == true) {HAL_TIM_Base_Start_IT (& htim1); estado = falso; } más {_NOP (); }}

Cuando se presiona el botón, verificamos si era nuestro botón pulsador definido y si el estado es verdadero. Al principio, el estado será verdadero para poder ingresar la declaración if. Después de ingresar, iniciamos el temporizador y hacemos que el estado sea falso para asegurarnos de que el rebote no reiniciará el temporizador.

Luego, escribimos ISR para la interrupción del temporizador:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim) {/ * Prevenir la advertencia de compilación de argumentos no utilizados * / UNUSED (htim);

/ * NOTA: Esta función no debe modificarse, cuando se necesita la devolución de llamada, el HAL_TIM_PeriodElapsedCallback podría implementarse en el archivo de usuario * / if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD_12);_PIN estado = verdadero; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * CÓDIGO DE USUARIO FIN 4 * /

Después de 50 mS, verificamos si el botón aún está en estado de reinicio o suelto, si es así, sabemos que el botón está en estado inactivo. Luego cambiamos el led, hacemos que el estado sea verdadero para poder detectar otra pulsación de botón y detenemos el temporizador para poder volver a encenderlo.

Por lo tanto, este proceso garantizará que evitemos problemas de rebote.

Paso 5: Conclusión

Este era el código para el rebote del botón. Quiero señalar que este código fue desarrollado por mí y no soy un programador experto. Entonces, seguramente puede haber errores. Si tiene una mejor solución, tenga en cuenta. No lo olvides, si tienes algún problema escríbeme y trataré de ayudarte.

Recomendado: