bouton_it.c

nRF52833-DK (id boards.json : nrf52833-dk) · Fichier : bouton_it.c · Langage : C · Usage : Basculer la LED par interruption sur le bouton

Le bouton sw0 (P0.11 sur le DK, bouton S1) pilote la LED par interruption de front. Le guide utilisateur du DK insiste : les boutons n’ont pas de pull-up externe, le firmware doit activer GPIO_PULL_UP ou lire un faux état haut permanent.

Matériel requis

Une carte nRF52833-DK (Nordic, SoC nRF52833 Cortex-M4F, BLE 5) alimentée par USB : 4 LEDs sur P0.13-P0.16 (actives au niveau bas) et 4 boutons sur P0.11, P0.12, P0.24, P0.25 (actifs bas, pull-up interne à activer). La carte seule ; le bouton S1 du DK (ou le bouton utilisateur du MDK) suffit pour tester.

Câblage

Aucun câblage. Pour un bouton externe entre une broche du connecteur et GND, déclarer le pull-up dans l’overlay devicetree.

Fonctionnement

gpio_pin_interrupt_configure_dt arme le front actif (niveau bas ici) ; l’ISR se contente de toggler la LED — la règle Zephyr est de garder les callbacks GPIO les plus courts possible.

Exécution

Projet Zephyr : west build -b nrf52833dk/nrf52833 puis west flash (J-Link embarqué) ; console série 115200 sur le connecteur USB UART.

Variantes

Remplacer le toggle par un k_sem_give pour réveiller un thread, armer les deux fronts (EDGE_BOTH), ou ajouter les boutons sw1 à sw3 du DK.

bouton_it.c

/* Interruption GPIO sur sw0 : chaque appui bascule la LED0.
 * DK : sw0 = bouton S1 sur P0.11, actif bas, PULL-UP INTERNE
 * OBLIGATOIRE (aucune résistance externe sur le DK).
 * MDK : sw0 = bouton utilisateur. */
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

static const struct gpio_dt_spec btn =
	GPIO_DT_SPEC_GET(DT_ALIAS(sw0), gpios);
static const struct gpio_dt_spec led =
	GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);
static struct gpio_callback btn_cb_data;

static void sur_appui(const struct device *port,
		      struct gpio_callback *cb, uint32_t pins)
{
	ARG_UNUSED(port); ARG_UNUSED(cb); ARG_UNUSED(pins);
	gpio_pin_toggle_dt(&led);   /* callback = contexte d'IT : léger */
}

int main(void)
{
	gpio_pin_configure_dt(&led, GPIO_OUTPUT_INACTIVE);
	gpio_pin_configure_dt(&btn, GPIO_PULL_UP);
	gpio_pin_interrupt_configure_dt(&btn, GPIO_INT_EDGE_TO_ACTIVE);
	gpio_init_callback(&btn_cb_data, sur_appui, BIT(btn.pin));
	gpio_add_callback(btn.port, &btn_cb_data);

	while (1) {
		k_msleep(100);      /* le thread main n'a rien à faire */
	}
	return 0;
}

← Retour à la fiche