🛠 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.

Objetivo

Aprovechar la función más infrautilizada del MEMS de la STM32F4DISCOVERY: el clic (click/tap) detectado por hardware, que se reporta en los pines de interrupción INT PE0/PE1 y despierta la CPU sin polling. El tema es «avanzado» porque hay que arbitrar entre dos chips diferentes (LIS302DL o LIS3DSH según la revisión de la placa) cuyos registros de configuración del clic no se parecen.

El hardware, exactamente

Estrategia de software

  1. Inicialice mediante el BSP (BSP_ACCELERO_Init) para beneficiarse de la autodetección, luego lea el componente detectado para elegir la configuración del clic: el LIS302DL y el LIS3DSH no tienen ni las mismas direcciones de registro ni la misma semántica de umbrales/duraciones del clic.
  2. Configure la IT del clic en la línea INT1 (ruta hacia PE0) con un umbral y una duración adecuados; pruebe ambos ejes antes de fijar los ajustes — la sensibilidad «percibida» depende de la carcasa y del soporte de la placa.
  3. EXTI en PE0: flanco de subida, prioridad baja, handler corto — libere la fuente en el chip (lectura del registro de respuesta al clic, diferente según el componente) si no, la interrupción se rearma en bucle.
  4. En producción, reemplace el toggle del LED por un flag + tratamiento en tarea, o un despertar desde el modo Stop.

Esqueleto de código

#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 ecrire : 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);
    }
  }
}

Trampas específicas

Verificación esperada

Un dedo golpea la mesa junto a la placa: el LED rojo (PD14) cambia de estado, una vez y solo una por golpe. Al inclinar suavemente la placa sin golpearla, no ocurre nada — la detección es efectivamente sobre el transitorio, no sobre la aceleración estática. Consuma el modo Stop entre dos golpes para un despertar con batería.

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales