🛠 Acquérir le micro PDM MP45DT02 : I2S2, filtre PDM-vers-PCM et contraintes de sortie
Objectif
Utiliser le MP45DT02, le microphone numérique omnidirectionnel PDM embarqué sur la STM32F4DISCOVERY. Contrairement à un micro analogique, il ne sort pas une tension mais un flux PDM 1 bit à haute fréquence, que le STM32F407 capture en I2S2 (mode « receive ») puis décime en PCM 16 bits par un filtre fourni dans STM32CubeF4. Le vrai sujet de niveau avancé n'est pas le micro : c'est où sortir les données, car cette carte cumule les pièges de brochage série.
La chaîne d'acquisition
- I2S2 en réception horloge PDM : le BSP audio CubeF4 (
BSP_AUDIO_IN_*, démos record deProjects/STM32F4-Discovery/) configure le périphérique et le filtre PDM (décimation + filtre passe-bas) qui produit du PCM 16 bits. - Double bufferisation DMA : pendant que le half-buffer est traité, le suivant se remplit — la callback
HalfTransfer/TransferCompleterecharge la fenêtre d'analyse. - Exfiltration : la carte n'a ni broche micro-SD ni PHY Ethernet (le MAC 10/100 est dans la puce, pas sur le connecteur). Trois options : le port OTG FS en CDC (voir le tutoriel USB), un dongle USB-série externe sur UART2 PA2/PA3, ou un traitement 100 % embarqué (VAD, détection de claquement) sans export.
Les pièges de brochage qui transforment un TP en cauchemar
- UART1 est inutilisable sans modification de carte : ses broches alternatives sont PB6/PB7, or PB6 est le SCL I2C du codec CS43L22 (commentaire explicite du port MicroPython : « Without board modifications, this makes UART1 unusable on this board »).
- PA0 (UART4 TX/CTS) est accaparé par le bouton USER et WKUP ; le port MicroPython documente le retrait de SB20 pour libérer la broche.
- PC7 est MCLK du codec : à éviter en série si le codec vit.
- Le VCP du ST-LINK n'est pas câblé sur les cartes stock : un câble série externe sur PA2/PA3 reste la voie sûre.
- Budget : à 115200 bauds, un PCM 16 bits stéréo 16 kHz pèse 512 kbit/s — impossible en série simple. Réduisez (mono, 8 kHz, 8 bits, ou compression) ou partez sur le CDC USB.
Squelette de code
#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 */
Démarche complète
- Compilez la démo record de CubeF4 pour STM32F4-Discovery comme référence (brochage I2S2 + filtre PDM déjà bons).
- Remplacez l'écriture vers le codec par votre exfiltreur : CDC OTG ou UART2 à la vitesse maximale propre à votre câble.
- Côté PC, relevez le flux (8 bits signés ou 16 bits selon votre maquette), tracez un spectrogramme : la voix doit apparaître sous 4 kHz.
- Pour un produit réel, traitez à bord (énergie par trame, wake-word léger) et ne sortez que les événements.
Vérification attendue
En tapant dans les mains, le spectrogramme montre une rafale large bande ; en parlant, des formants sous 4 kHz. Un plancher de bruit régulier sans structure = filtre PDM mal dimensionné ou horloge I2S2 incorrecte.
Erreurs fréquentes
- Câbler une sortie analogique de micro sur une broche ADC : le MP45DT02 est un périphérique numérique PDM sur I2S2, pas un micro analogique.
- Choisir UART1 « parce que c'est le premier » : PB6/PB7 sont conflictuels avec le codec, la carte est documentée comme incompatible UART1 sans modification.
- Viser 44,1 kHz stéréo 16 bits sur une série 115200 : le débit est physiquement dépassé de dix fois.
- Négliger l'interaction codec/micro : les deux périphériques audio partagent l'I2C de contrôle et les interruptions — le BSP avertit que l'I2C du CS43L22 peut être corrompu par des ISR utilisateur.
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