🛠 STM32Cube HAL et BSP officiel : LED, bouton et accéléromètre avec détection automatique
Objetivo
Programar la STM32F4DISCOVERY « desde la fuente »: el firmware oficial STM32CubeF4 contiene un BSP (Board Support Package) dedicado a esta tarjeta, en Drivers/BSP/STM32F4-Discovery, con ejemplos completos en Projects/STM32F4-Discovery/. Utilizará las API BSP_LED_*, BSP_PB_* y BSP_ACCELERO_* — y sobre todo entenderá la detección automática del acelerómetro, una particularidad de hardware de esta tarjeta.
Material y proyecto
- 1 tarjeta STM32F4DISCOVERY, cable micro-USB en el puerto ST-LINK/V2-A
- STM32CubeIDE (o Makefile + arm-none-eabi-gcc) y el paquete STM32CubeF4 (repositorio GitHub
STMicroelectronics/STM32CubeF4, clonado con--recursive— el BSP de la tarjeta reside en el submódulostm32f4discovery-bsp) - Defina la macro
USE_STM32F4_DISCOy añada a la ruta de inclusiónDrivers/BSP/STM32F4-Discoveryasí comoDrivers/BSP/Components/lis302dlylis3dsh
La trampa de hardware: dos acelerómetros según la revisión
La tarjeta se produjo con dos MEMS diferentes en el mismo bus SPI1: el LIS302DL en las primeras tarjetas, el LIS3DSH en las siguientes (SCK PA5, MISO PA6, MOSI PA7, CS PE3, interrupciones PE0/PE1). Un código que asume un solo componente falla silenciosamente en la otra revisión. El BSP resuelve el problema leyendo el identificador del chip: utilice BSP_ACCELERO_Init y no programe valores fijos.
Código completo
#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);
}
}
Lo que el BSP le oculta (útil saberlo)
- Los pines reales de los LED provienen de
stm32f4_discovery.h: LED4=PD12 (verde), LED3=PD13 (naranja), LED5=PD14 (rojo), LED6=PD15 (azul). - El botón se llama
BUTTON_KEYen el BSP aunque todo el mundo lo llama USER (PA0, activo en alto). BSP_ACCELERO_GetXYZdevuelve ejes orientados de forma coherente entre los dos chips — es exactamente la normalización que su propio driver debería reimplementar si no lo hiciera.
Verificación esperada
El LED naranja parpadea a 5 Hz; el LED verde permanece encendido mientras se pulsa USER. Al inclinar la tarjeta, los valores xyz cambian (a observar en el depurador, ya que la consola ST-LINK no está cableada en las tarjetas estándar).
Errores frecuentes
- Clonar STM32CubeF4 sin
--recursive: los componentes BSP (lis302dl/lis3dsh/cs43l22) faltan durante la compilación. - Olvidar
USE_STM32F4_DISCO: las cabeceras BSP no seleccionan la tarjeta correcta. - Escribir un driver LIS302DL propio y descubrir en un segundo ejemplar de la tarjeta que el acelerómetro es un LIS3DSH: lea el chip ID, como hace el BSP.
- Buscar un joystick: a diferencia de otros kits Discovery, este solo tiene un botón USER y un botón RESET.
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
- 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