🛠 Réveil sur claquement : interruption click du MEMS, double révision et EXTI sur PE0/PE1
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
- Bus SPI1 : SCK PA5, MISO PA6, MOSI PA7, chip-select PE3.
- Interruptions MEMS : PE0 et PE1 (INT1/INT2), à configurer en entrée EXTI sur le STM32F407.
- Révisions : premières cartes = LIS302DL, cartes ultérieures = LIS3DSH. ST gère le dual dans le BSP CubeF4 (
stm32f4discovery_accelerometer.c) en lisant le chip ID au moment deBSP_ACCELERO_Init— les démos « Accelerometer » de ST utilisent la détection de claquement de ces puces.
Stratégie logicielle
- 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. - 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.
- 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.
- 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
- Oublier d'acquitter la source dans la puce : l'IT reste armée, votre EXTI repart immédiatement — le symptôme classique est une LED qui clignote en continu.
- Polluer l'ISR : le BSP avertit que l'I2C du codec audio peut être corrompu par des routines d'interruption longues — si votre projet combine audio et click, gardez les deux ISR minimales.
- Supposer une seule puce : un driver écrit « pour le LIS302DL » échoue silencieusement sur une carte à LIS3DSH ; le test d'entrée de votre code doit être le chip ID, jamais le numéro de broche.
- Confondre avec les autres Discovery : l'IMU 6 axes LSM330 (F401/F411 kits) a une toute autre arborescence de registres ; cette fiche ne couvre que le MEMS simple axe 3 axes sur SPI1 de la F4DISCOVERY d'origine.
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
- Premier téléversement sur la STM32F4DISCOVERY avec l'Arduino STM32duino
- Zephyr RTOS sur la STM32F4DISCOVERY : west build et west flash
- MicroPython sur la STM32F4DISCOVERY : REPL interactif et pilotage des LED
- STM32Cube HAL et BSP officiel : LED, bouton et accéléromètre avec détection automatique
- Lecture audio sur le codec CS43L22 : I2S, classe D et les limitations du BSP
- USB OTG FS sur le port micro-AB : se faire passer pour un périphérique classe CDC