bouton_isr.c

ESP32-H2 · Fichier : bouton_isr.c · Langage : C · Usage : Réagir à un bouton par interruption GPIO

En ESP-IDF, un bouton se surveille par interruption : l'ISR s'exécute dès le front, la tâche affiche. L'attribut IRAM_ATTR est obligatoire car la flash peut être indisponible pendant l'interruption.

Matériel requis

Une carte ESP32-H2 (RISC-V 96 MHz, radio IEEE 802.15.4 uniquement — pas de Wi-Fi) type DevKitM-1, alimentée par USB. 1 bouton poussoir vers GND (GPIO9 sert aussi de BOOT : appui court OK).

Branchement

Bouton entre GPIO9 et GND ; la résistance de pull-up est activée par gpio_config. Toute broche avec matrice GPIO convient.

Fonctionnement

gpio_config arme l'interruption sur front descendant ; l'ISR ne fait qu'incrémenter un compteur volatile (règle d'or : ISR courte). La tâche compare et affiche à 20 Hz, ce qui filtre les rebonds. Programmez avec ESP-IDF (idf.py set-target esp32h2) ; le port USB-Serial/JTAG (GPIO26/27) sert de console et de port de flash. Maintenez Boot + Reset pour le mode download si besoin.

Pour aller plus loin

Réveillez le SoC par la même interruption (esp_sleep_enable_ext0_wakeup) pour un détecteur sur batterie.

bouton_isr.c

// bouton_isr.c — interruption sur front, compte les appuis.
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"

#define BROCHE 9                    // bouton vers GND (GPIO9 = BOOT du DevKit)
static volatile int appuis = 0;
static const char *TAG = "bouton";

static void IRAM_ATTR sur_appui(void *arg)
{
    appuis++;                       // le minimum en contexte d'ISR
}

void app_main(void)
{
    gpio_config_t io = {
        .pin_bit_mask = 1ULL << BROCHE,
        .mode = GPIO_MODE_INPUT,
        .pull_up_en = GPIO_PULLUP_ENABLE,
        .intr_type = GPIO_INTR_NEGEDGE,   // front descendant = appui
    };
    gpio_config(&io);
    gpio_install_isr_service(0);
    gpio_isr_handler_add(BROCHE, sur_appui, NULL);

    int vu = 0;
    while (1) {
        if (vu != appuis) { vu = appuis; ESP_LOGI(TAG, "appui n°%d", vu); }
        vTaskDelay(pdMS_TO_TICKS(50));   // anti-rebond par echantillonnage
    }
}

← Retour à la fiche