🛠 Maîtriser les E/S avancées : GPIO et capteur LSM6DS3TR-C
Objectifs
Ce tutoriel vise à configurer les entrées-sorties numériques à haute fréquence et à communiquer avec le capteur inertielle LSM6DS3TR-C embarqué. Vous apprendrez à manipuler les registres GPIO pour une latence minimale et à lire les données accélérées via le bus I2C, en exploitant les spécificités du STM32C5A3CG.
Matériel nécessaire
- Carte Seeed Studio XIAO STM32C5
- Câble USB-C
- Ordinateur avec STM32CubeIDE ou VS Code + PlatformIO
- Oscilloscope logique (optionnel, pour vérifier les signaux GPIO)
Étapes
Ouvrez STM32CubeIDE et créez un nouveau projet pour le STM32C5A3CG. Dans le configurateur graphique (IPCC), activez l'horloge externe (HSE) à 48 MHz et configurez le système pour tourner à 144 MHz via le PLL. Assurez-vous que l'unité de calcul flottant (FPU) est activée si nécessaire.
- Configuration de l'environnement
Dans l'onglet Pinout & Configuration, sélectionnez une broche GPIO libre (par exemple, une broche exposée sur les headers). Configurez-la en mode Output Push Pull, vitesse Very High. Pour le bus I2C connecté au LSM6DS3TR-C, vérifiez que les broches SCL et SDA sont configurées en Alternate Function avec les paramètres Open Drain et une fréquence adaptée (ex: 400 kHz pour Fast Mode).
- Configuration des GPIO
Générez le code. Dans main.c, initialisez les périphériques. Utilisez MX_GPIO_Init() et MX_I2C_Init(). Pour une performance maximale sur les GPIO, évitez les fonctions HAL lentes comme HAL_GPIO_WritePin dans les boucles critiques. Préférez l'écriture directe dans les registres BSRR (Bit Set Reset Register) du port GPIO.
- Génération du code
Le capteur est connecté via I2C. Son adresse est généralement 0x6A (si SD0 est à la masse) ou 0x6B. Envoyez une commande de réinitialisation logicielle. Configurez le registre CTRL1_XL pour activer l'accéléromètre à une fréquence d'échantillonnage élevée (ex: 104 Hz) et une plage de ±2g. Activez également le gyroscope via CTRL1_G si besoin.
- Initialisation du capteur LSM6DS3TR-C
Implémentez une fonction de lecture I2C pour lire les registres de sortie (OUTX_L_XL, etc.). Utilisez un tampon DMA pour transférer les données de l'I2C vers la mémoire SRAM sans bloquer le CPU, ce qui est crucial pour les applications temps réel sur le Cortex-M33.
- Lecture des données
Vérification
Connectez un oscilloscope logique aux broches GPIO configurées. Vous devriez observer des fronts de montée/descente très rapides (< 10 ns) lors de la bascule des GPIO. Pour le capteur, lisez les valeurs brutes via un outil de debug ou imprimez-les sur le port série (USB-C). Une accélération statique d'environ 1g (9.8 m/s²) sur l'axe Z doit être détectée lorsque la carte est posée à plat.
Pour aller plus loin
Explorez l'utilisation des interruptions matérielles (EXTI) pour détecter les changements d'état des GPIO sans polling. Intégrez le circuit de chauffage programmable du LSM6DS3TR-C via PWM pour stabiliser la température du capteur et réduire la dérive des mesures, une fonctionnalité clé de cette carte.