🛠 STM32Cube HAL et BSP officiel : LED, bouton et accéléromètre avec détection automatique
Objectif
Programmer la STM32F4DISCOVERY « à la source » : le firmware officiel STM32CubeF4 contient un BSP (Board Support Package) dédié à cette carte, dans Drivers/BSP/STM32F4-Discovery, avec exemples complets dans Projects/STM32F4-Discovery/. Vous allez utiliser les API BSP_LED_*, BSP_PB_* et BSP_ACCELERO_* — et surtout comprendre la détection automatique de l'accéléromètre, particularité matérielle de cette carte.
Matériel et projet
- 1 carte STM32F4DISCOVERY, câble micro-USB sur le port ST-LINK/V2-A
- STM32CubeIDE (ou Makefile + arm-none-eabi-gcc) et le paquet STM32CubeF4 (dépôt GitHub
STMicroelectronics/STM32CubeF4, cloné avec--recursive— le BSP de la carte vit dans le sous-modulestm32f4discovery-bsp) - Définissez la macro
USE_STM32F4_DISCOet ajoutez au chemin d'inclusionDrivers/BSP/STM32F4-Discoveryainsi queDrivers/BSP/Components/lis302dletlis3dsh
Le piège matériel : deux accéléromètrès selon la révision
La carte a été produite avec deux MEMS différents sur le même bus SPI1 : le LIS302DL sur les premières cartes, le LIS3DSH sur les suivantes (SCK PA5, MISO PA6, MOSI PA7, CS PE3, interruptions PE0/PE1). Un code qui suppose un seul composant échoue silencieusement sur l'autre révision. Le BSP résout le problème en lisant l'identifiant de puce : utilisez BSP_ACCELERO_Init et ne codez pas en dur.
Code complet
#include "stm32f4_discovery.h"
#include "stm32f4_discovery_accelerometer.h"
int main(void)
{
int16_t xyz[3] = {0, 0, 0};
HAL_Init; /* SysTick/NVIC par defaut */
SystemClock_Config; /* 168 MHz depuis le quartz HSE 8 MHz */
BSP_LED_Init(LED3); /* LED3 = PD13 (orange) ; LED4/5/6 = PD12/14/15 */
BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); /* USER = PA0 */
BSP_ACCELERO_Init; /* auto-detecte LIS302DL vs LIS3DSH via chip ID */
while (1)
{
BSP_LED_Toggle(LED3);
BSP_ACCELERO_GetXYZ(xyz); /* axes normalises entre revisions */
if (BSP_PB_GetState(BUTTON_KEY) == GPIO_PIN_SET)
BSP_LED_On(LED4);
else
BSP_LED_Off(LED4);
HAL_Delay(100);
}
}
Ce que le BSP vous cache (utile à savoir)
- Les broches LED réelles viennent de
stm32f4_discovery.h: LED4=PD12 (verte), LED3=PD13 (orange), LED5=PD14 (rouge), LED6=PD15 (bleue). - Le bouton s'appelle
BUTTON_KEYdans le BSP alors que tout le monde l'appelle USER (PA0, actif haut). BSP_ACCELERO_GetXYZrenvoie des axes orientés de façon cohérente entre les deux puces — c'est exactement la normalisation que votre propre driver devrait réimplémenter sinon.
Vérification attendue
La LED orange clignote à 5 Hz ; la LED verte reste allumée pendant l'appui sur USER. En inclinant la carte, les valeurs xyz changent (à observer en débogueur, la console ST-LINK n'étant pas câblée sur les cartes stock).
Erreurs fréquentes
- Cloner STM32CubeF4 sans
--recursive: les composants BSP (lis302dl/lis3dsh/cs43l22) manquent à la compilation. - Oublier
USE_STM32F4_DISCO: les en-têtes BSP ne sélectionnent pas la bonne carte. - Écrire un driver LIS302DL maison et découvrir sur un second exemplaire de la carte que l'accéléromètre est un LIS3DSH : lisez le chip ID, comme le BSP.
- Chercher un joystick : contrairement à d'autres kits Discovery, celui-ci n'a qu'un bouton USER et un bouton RESET.
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
- 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
- Acquérir le micro PDM MP45DT02 : I2S2, filtre PDM-vers-PCM et contraintes de sortie