🛠 Bare-metal sur le STM32F401 : clignoter LD2 en écrivant les registres GPIO

Famille STM32 Nucleo-64 F4 — modelo insignia: Nucleo-F401RE · avance · Schéma : IMG-stm32f4-nucleo-avance-7-stm32f4nuc-baremetal-registres-gpio.svg — carte mémoire du STM32F401 avec GPIOA en 0x40020000, registres MODER et ODR zoomés, RCC_AHB1ENR en 0x40023830, flèches vers la broche PA5 et sa LED LD2

Objetivos

Eliminar HAL, los encabezados de dispositivo CMSIS y el archivo de arranque, y hacer parpadear LD2 escribiendo directamente en los registros GPIO. Esta es la forma más rápida de entender qué está haciendo cada abstracción por encima — y muestra lo que el Cortex-M4F a 84 MHz te ofrece por el precio de una placa Nucleo-64.

Hardware

El mapa de memoria (RM0368)

Código

/* blink_bare.c — arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -O2 -nostdlib */
#define GPIOA_MODER (*(volatile unsigned int *)0x40020000u)
#define GPIOA_ODR   (*(volatile unsigned int *)0x40020140u)
#define RCC_AHB1ENR (*(volatile unsigned int *)0x40023830u)

static void busy_wait(void) { for (volatile int i = 0; i < 2000000; ++i) {} }

void Reset_Handler(void)
{
    RCC_AHB1ENR  |= (1u << 0);   /* enable GPIOA clock (default HSI 16 MHz) */
    GPIOA_MODER  &= ~(3u << 10);
    GPIOA_MODER  |=  (1u << 10); /* PA5 -> general-purpose output           */
    while (1) {
        GPIOA_ODR ^= (1u << 5);  /* toggle LD2                              */
        busy_wait;
    }
}

Pasos

  1. Escribe un script de enlace mínimo que coloque la tabla de vectores en 0x0800_0000: puntero de pila inicial, seguido de la dirección de Reset_Handler.
  2. Compila: arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -O2 -nostdlib -nostartfiles -T flash.ld blink_bare.c -o blink_bare.elf
  3. Programa a través del ST-LINK integrado con STM32CubeProgrammer (o coloca el binario en la función de almacenamiento masivo del ST-LINK).
  4. Pulsa RESET: LD2 cambia de estado.

Resultado esperado

Un latido constante en PA5 con un binario de unas pocas docenas de bytes. Cada HAL_GPIO_WritePin que hayas escrito alguna vez es esto, más árboles de reloj, más la tabla de vectores, más un archivo de arranque — la llamada HAL oculta la contabilidad, no la magia.

Errores comunes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales