🛠 Réveil sur claquement : interruption click du MEMS, double révision et EXTI sur PE0/PE1

STM32F4DISCOVERY (kit Discovery STM32F407VGT6) · avance · Schéma : l'accéléromètre MEMS de la STM32F4DISCOVERY en SPI1 (SCK PA5, MISO PA6, MOSI PA7, CS PE3) avec ses deux broches d'interruption INT1/INT2 reliées à PE0/PE1 configurées en EXTI ; un bloc « chip ID » arbitre entre LIS302DL (révision ancienne) et LIS3DSH (révision récente) ; la LED rouge PD14 s'allume sur détection de claquement.

Objectif

Exploiter la fonction la plus sous-utilisée du MEMS de la STM32F4DISCOVERY : le claquement (click/tap) détecté matériellement, qui remonte sur les broches d'interruption INT PE0/PE1 et réveille le CPU sans polling. Le sujet est « avancé » parce qu'il faut arbitrer entre deux puces différentes (LIS302DL ou LIS3DSH selon la révision de carte) dont les registres de configuration du click ne se ressemblent pas.

Le matériel, exactement

Stratégie logicielle

  1. Initialisez via le BSP (BSP_ACCELERO_Init) pour bénéficier de l'auto-détection, puis lisez le composant détecté pour choisir la configuration click : le LIS302DL et le LIS3DSH n'ont ni les mêmes adresses de registres ni la même sémantique des seuils/durées de click.
  2. Configurez l'IT de click sur la ligne INT1 (route vers PE0) avec un seuil et une durée adaptés ; testez les deux axes avant de figer les réglages — la sensibilité « ressenti » dépend du boîtier et du support de la carte.
  3. EXTI sur PE0 : front montant, priorité basse, handler court — libérez la source dans la puce (lecture du registre de réponse au click, différente selon le composant) sinon l'interruption se réarme en boucle.
  4. En production, remplacez le toggle de LED par un flag + traitement en tâche, ou un réveil depuis Stop mode.

Squelette de code

#include "stm32f4_discovery.h"
#include "stm32f4_discovery_accelerometer.h"

static volatile uint8_t tapFlag = 0;

/* EXTI PE0 : front montant depuis INT1 du MEMS */
void HAL_GPIO_EXTI_Callback(uint16_t pin)
{
  if (pin == GPIO_PIN_0) {
    tapFlag = 1;      /* acquitte la source MEMS via le driver detecte */
  }
}

int main(void)
{
  HAL_Init;
  SystemClock_Config;                    /* 168 MHz */
  BSP_LED_Init(LED5);                      /* rouge = PD14 */
  BSP_ACCELERO_Init;                     /* chip ID -> LIS302DL ou LIS3DSH */

  MemsClickInit_DetectedPart;            /* a écrire : active le click sur */
                                           /* INT1 (vers PE0) avec seuil/duree */
  /* GPIO PE0 en EXTI rising via HAL_GPIO_Init */

  while (1) {
    if (tapFlag) {
      tapFlag = 0;
      BSP_LED_Toggle(LED5);
    }
  }
}

Pièges spécifiques

Vérification attendue

Un doigt claque sur la table à côté de la carte : la LED rouge (PD14) bascule, une fois et une seule par claquement. En inclinant doucement la carte sans la choquer, rien ne se passe — la détection est bien sur le transitoire, pas sur l'accélération statique. Consommez le mode Stop entre deux claquements pour un réveil sur batterie.

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels