bouton-hal.c

STM32F4DISCOVERY (kit Discovery STM32F407VGT6) · Archivo : bouton-hal.c · Lenguaje : C · Uso : Lire un bouton avec anti-rebond et allumer la LED

El botón de usuario de la placa (GPIOA/GPIO_PIN_0, activo en HIGH) alterna el LED en cada pulsación. El antirrebote por muestreo a 50 Hz es el patrón estándar en C embebido, sin interrupciones ni esperas bloqueantes.

Hardware

Una STM32F407G-DISC1 (Discovery F4, Cortex-M4 @ 168 MHz) con ST-LINK integrado, pines de 3,3 V. Nada para empezar: el botón de usuario viene cableado de fábrica. Opcionalmente un botón externo hacia 3,3 V.

Cableado

Botón interno: ya conectado a GPIOA/GPIO_PIN_0 (bouton USER de la carte (PA0), actif a l'etat HIGH). Botón externo: entre el pin y 3.3 V, con pull-down interno.

Funcionamiento

Cada 20 ms se lee y guarda el estado del pin; un paso de 0→1 (flanco de subida) llama a HAL_GPIO_TogglePin. Dos muestras consecutivas iguales filtran el rebote.

Ejecución

Proyecto STM32CubeIDE « STM32F407G-DISC1 »: pega el codigo en main.c, configura el .ioc, Run. La placa tiene 4 LED (PD12-PD15) y el boton USER en PA0.

Variantes

Pasa a una interrupción EXTI con callback HAL_GPIO_EXTI_Callback, o añade una pulsación larga (contador de muestras).

bouton-hal.c

// Bouton utilisateur + LED, anti-rebond par echantillonnage.
#include "main.h"

#define LED_PORT GPIOD
#define LED_PIN  GPIO_PIN_12
#define BTN_PORT GPIOA
#define BTN_PIN  GPIO_PIN_0
/* Bouton actif a l'etat HIGH. */

uint32_t tEchantillon = 0;
uint8_t stable = 0, precedent = 0;

int main(void) {
  HAL_Init();
  SystemClock_Config();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  GPIO_InitTypeDef g = {0};
  g.Pin = LED_PIN; g.Mode = GPIO_MODE_OUTPUT_PP;
  HAL_GPIO_Init(LED_PORT, &g);
  g.Pin = BTN_PIN; g.Mode = GPIO_MODE_INPUT; g.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(BTN_PORT, &g);

  for (;;) {
    if (HAL_GetTick() - tEchantillon >= 20) {   // 50 Hz
      tEchantillon = HAL_GetTick();
      precedent = stable;
      stable = (HAL_GPIO_ReadPin(BTN_PORT, BTN_PIN) == GPIO_PIN_SET);
      if (stable && !precedent) {               // front montant
        HAL_GPIO_TogglePin(LED_PORT, LED_PIN);
      }
    }
  }
}

← Volver a la ficha