🛠 Réveil sur claquement : interruption click du MEMS, double révision et EXTI sur PE0/PE1
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
- Bus SPI1: SCK PA5, MISO PA6, MOSI PA7, chip-select PE3.
- Interrupciones MEMS: PE0 y PE1 (INT1/INT2), a configurar como entrada EXTI en el STM32F407.
- Revisiones: primeras placas = LIS302DL, placas posteriores = LIS3DSH. ST gestiona el dual en el BSP CubeF4 (
stm32f4discovery_accelerometer.c) leyendo el chip ID en el momento deBSP_ACCELERO_Init— las demos «Accelerometer» de ST utilizan la detección de clic de estos chips.
Estrategia de software
- 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. - 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.
- 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.
- 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
- Olvidar confirmar la fuente en el chip: la IT permanece armada, su EXTI se dispara inmediatamente — el síntoma clásico es un LED que parpadea continuamente.
- Contaminar la ISR: el BSP advierte que el I2C del códec de audio puede verse corrompido por rutinas de interrupción largas — si su proyecto combina audio y clic, mantenga ambas ISR mínimas.
- Suponer un solo chip: un driver escrito «para el LIS302DL» falla silenciosamente en una placa con LIS3DSH; la prueba de entrada de su código debe ser el chip ID, nunca el número de pin.
- Confundir con otras Discovery: la IMU de 6 ejes LSM330 (kits F401/F411) tiene una estructura de registros totalmente distinta; esta ficha solo cubre el MEMS simple de 3 ejes sobre SPI1 de la F4DISCOVERY original.
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
- 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