bouton-hal.c
El botón de usuario de la placa (GPIOC/GPIO_PIN_13, 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 Nucleo H7 (STM32H743ZI, Cortex-M7 @ 480 MHz) programada via ST-LINK (USB), 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 GPIOC/GPIO_PIN_13 (bouton USER de la carte (PC13), 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 basado en la Nucleo-H743ZI: el codigo va en main.c, los perifericos se declaran en el .ioc y Run via ST-LINK. El monitor serie del ST-LINK muestra los printf a 115200.
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 GPIOB
#define LED_PIN GPIO_PIN_0
#define BTN_PORT GPIOC
#define BTN_PIN GPIO_PIN_13
/* 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);
}
}
}
}