🛠 Acquérir le micro PDM MP45DT02 : I2S2, filtre PDM-vers-PCM et contraintes de sortie
Objetivo
Utilizar el MP45DT02, el micrófono digital omnidireccional PDM integrado en la STM32F4DISCOVERY. A diferencia de un micrófono analógico, no entrega una tensión, sino un flujo PDM de 1 bit de alta frecuencia, que el STM32F407 captura mediante I2S2 (modo «receive») y luego diezma a PCM de 16 bits mediante un filtro proporcionado en STM32CubeF4. El verdadero tema de nivel avanzado no es el micrófono: es dónde extraer los datos, ya que esta tarjeta acumula trampas de asignación de pines seriales.
La cadena de adquisición
- I2S2 en recepción con reloj PDM: el BSP de audio de CubeF4 (
BSP_AUDIO_IN_*, demos de grabación deProjects/STM32F4-Discovery/) configura el periférico y el filtro PDM (diezmo + filtro paso bajo) que produce PCM de 16 bits. - Doble bufferización DMA: mientras se procesa el medio búfer, el siguiente se llena — la callback
HalfTransfer/TransferCompleterecarga la ventana de análisis. - Exfiltración: la tarjeta no tiene ni pin micro-SD ni PHY Ethernet (el MAC 10/100 está en el chip, no en el conector). Tres opciones: el puerto OTG FS en modo CDC (ver el tutorial USB), un dongle USB-serial externo en UART2 PA2/PA3, o un tratamiento 100 % embebido (VAD, detección de palmadas) sin exportación.
Las trampas de asignación de pines que convierten una práctica en una pesadilla
- UART1 es inutilizable sin modificar la tarjeta: sus pines alternativos son PB6/PB7, pero PB6 es el SCL I2C del códec CS43L22 (comentario explícito del puerto MicroPython: «Without board modifications, this makes UART1 unusable on this board»).
- PA0 (UART4 TX/CTS) está ocupado por el botón USER y WKUP; el puerto MicroPython documenta la retirada de SB20 para liberar el pin.
- PC7 es MCLK del códec: evitar su uso en serie si el códec está activo.
- El VCP del ST-LINK no está cableado en las tarjetas de stock: un cable serial externo en PA2/PA3 sigue siendo la vía segura.
- Presupuesto: a 115200 baudios, un PCM de 16 bits estéreo a 16 kHz pesa 512 kbit/s — imposible en serie simple. Reduzca (mono, 8 kHz, 8 bits, o compresión) o pase al CDC USB.
Esqueleto de código
#include "stm32f4_discovery.h"
#include "stm32f4_discovery_audio.h"
static int16_t pcmBuf[2 * AUDIO_IN_BUF_SIZE]; /* double buffer DMA */
int main(void)
{
HAL_Init;
SystemClock_Config; /* 168 MHz */
MX_I2S2_Init; /* I2S2 RX horloge PDM */
BSP_AUDIO_IN_Init(AUDIO_IN_FREQUENCY_DEFAULT, 16, 0);
BSP_AUDIO_IN_Record(pcmBuf, 2 * AUDIO_IN_BUF_SIZE);
while (1) {
if (halfReady) { halfReady = 0; Uart2Send(pcmBuf, AUDIO_IN_BUF_SIZE); }
if (fullReady) { fullReady = 0; Uart2Send(pcmBuf + AUDIO_IN_BUF_SIZE,
AUDIO_IN_BUF_SIZE); }
}
}
/* Callbacks BSP_AUDIO_IN_HalfTransfer_CallBack / TransferComplete */
Procedimiento completo
- Compile la demo de grabación de CubeF4 para STM32F4-Discovery como referencia (asignación de pines I2S2 + filtro PDM ya correctos).
- Reemplace la escritura hacia el códec por su exfiltrador: CDC OTG o UART2 a la velocidad máxima adecuada a su cable.
- En el PC, capture el flujo (8 bits con signo o 16 bits según su maqueta), trace un espectrograma: la voz debe aparecer por debajo de 4 kHz.
- Para un producto real, procese a bordo (energía por trama, wake-word ligero) y extraiga solo los eventos.
Verificación esperada
Al aplaudir, el espectrograma muestra una ráfaga de banda ancha; al hablar, formantes por debajo de 4 kHz. Un piso de ruido regular sin estructura = filtro PDM mal dimensionado o reloj I2S2 incorrecto.
Errores frecuentes
- Cablear una salida analógica de micrófono a un pin ADC: el MP45DT02 es un periférico digital PDM sobre I2S2, no un micrófono analógico.
- Elegir UART1 «porque es el primero»: PB6/PB7 entran en conflicto con el códec, la tarjeta está documentada como incompatible con UART1 sin modificaciones.
- Apuntar a 44,1 kHz estéreo 16 bits sobre una serie de 115200: el caudal se supera físicamente diez veces.
- Descuidar la interacción códec/micrófono: ambos periféricos de audio comparten el I2C de control y las interrupciones — el BSP advierte que el I2C del CS43L22 puede verse corrompido por ISR de usuario.
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