Taula de continguts:

Botó STM32CubeMX Rebounce amb interrupció: 5 passos
Botó STM32CubeMX Rebounce amb interrupció: 5 passos

Vídeo: Botó STM32CubeMX Rebounce amb interrupció: 5 passos

Vídeo: Botó STM32CubeMX Rebounce amb interrupció: 5 passos
Vídeo: Устранение дребезга 🛎️ контактов кнопок STM32 CMSIS (STM32F411) 2024, Juliol
Anonim
Botó STM32CubeMX Rebounce amb interrupció
Botó STM32CubeMX Rebounce amb interrupció

Hola, en aquest tutorial intentaré donar la meva solució senzilla per evitar el rebot de botons, que és un problema molt greu. A Internet hi ha molts vídeos per oferir solució a aquest problema, però cap d'ells per a interrupcions externes. En tots aquests vídeos, es prem el botó mitjançant un mètode de sondeig que és ineficient. Comencem, doncs,

Pas 1: Requisits de maquinari i programari

Requisits de maquinari:

  • Taula de desenvolupament STM32 ARM
  • Un ordinador

Requisits de programari:

  • STM32CubeMX
  • Keil uVision5

Pas 2: entendre el problema

Comprensió del problema
Comprensió del problema

Per tant, intentem trobar una solució per al problema de rebot de botons. Per tant, hem d’entendre el problema. Per tant, quan premem un botó hauria d’arribar a un estat oposat al seu estat anterior. Per exemple, si era ALTA ha de ser BAIX i si era BAIX, ha de ser ALTA. Tanmateix, aquest és l'estat ideal (en PROTEUS:)) En realitat, quan premem un botó comença a rebotar entre HIGH i LOW abans que arribi a l'estat d'inactivitat. Per tant, fa veure que s’ha premut diverses vegades, cosa que provoca problemes. Què hem de fer, doncs?

Aquí vull assenyalar que, en aquest exemple, utilitzarem una interrupció externa per detectar la premuda de botó. Per tant, després de detectar el botó, hem d’esperar una estona de temps, com ara 50 mS, per arribar a l’estat inactiu i tornar a comprovar si el botó està inactiu o no. Si es troba en estat d'inactivitat, podem continuar amb la nostra tasca. Veiem el codi:)

Pas 3: Configuració de STM32CubeMX

Configuració STM32CubeMX
Configuració STM32CubeMX

Per tant, primer hem d’habilitar la interrupció externa per al nostre botó (suposo que aquí utilitzeu la placa de descobriment STM32F407VG):

  • A la pestanya "Fixació i configuració", feu clic al pin PA0 que està connectat al polsador i trieu GPIO_EXTI0 que permet la interrupció externa en aquest pin.
  • Canvieu l '"etiqueta d'usuari" del pin a "Push_Button" o qualsevol cosa que vulgueu.

A continuació, hem de configurar el temporitzador per tal de crear un retard de 50 mS:

  • Introduïu la secció "Temporitzadors"
  • Feu clic a TIM1
  • Trieu "Rellotge intern" com a font de rellotge
  • A la configuració (si voleu entendre aquesta secció, consulteu aquest tutorial, molt recomanable "Servo Motor Control With STM32F4 ARM MCU"):

    • Estableix el prescaler com a 32000
    • I contrapunt a 50
  • A la pestanya "Configuració NVIC", activeu totes les interrupcions

Activa el LED com a sortida:

Feu clic a PD12 i configureu com a "GPIO_Output"

A continuació, configureu el rellotge tal com es mostra a la imatge anterior i creeu el codi.

Pas 4: desenvolupament de programari Keil

En primer lloc, definim la variable d’estat que ens assegurarà que no iniciem el temporitzador dins d’una interrupció externa quan hagi rebotat:

/ * CODI D'USUARI COMENÇA PFP * / bool state = true; / * CODI D'USUARI FINAL PFP * /

A continuació, escrivim ISR per a una interrupció externa:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); estat = fals; } else {_NOP (); }}

Quan es prem el botó, comprovem si era el nostre botó definit i si l'estat és cert. Al principi, l'estat serà cert per introduir la sentència if. Després d’entrar, iniciem el temporitzador i fem que l’estat sigui fals per assegurar-nos que el rebot no reiniciarà el temporitzador.

A continuació, escrivim ISR per a la interrupció del temporitzador:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim) {/ * Eviteu l'advertiment de compilació d'arguments no utilitzats * / UNUSED (htim);

/ * NOTA: Aquesta funció no s'ha de modificar quan es necessiti la devolució de trucada, es podria implementar el HAL_TIM_PeriodElapsedCallback al fitxer d'usuari * / if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD_P, GPIO_); estat = cert; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * CODI USUARI FINAL 4 * /

Després de 50 mS comprovem si el botó encara està en estat de reinici o ha estat alliberat, si és així, sabem que el botó està en estat d'inactivitat. A continuació, commutem el led, fem que l'estat sigui cert per poder detectar un altre botó que premem i aturar el temporitzador per poder tornar-lo a iniciar.

Per tant, aquest procés garantirà que evitem problemes de rebot.

Pas 5: Conclusió

Aquest era el codi per a rebutjar botons. Vull assenyalar que aquest codi el vaig desenvolupar jo i no sóc un programador expert. Per tant, segurament pot haver-hi errors. Si teniu una solució millor, tingueu en compte. No ho oblideu, si teniu algun problema, escriviu-me i intentaré ajudar-vos.

Recomanat: