🛠 Console série sur le ST-LINK VCP : printf, ADC 12 bits et piège du USB
Objetivos
Domina la consola serie en la Nucleo-F401RE: el ST-LINK/V2-1 expone un puerto COM virtual, y el núcleo de Arduino conecta el objeto Serial predeterminado a USART2 (RX = PA3, TX = PA2) a través de él. Construirás un pequeño registrador de mediciones que imprime líneas formateadas y aprenderás a escalar correctamente el ADC de 12 bits del F401.
Hardware
- 1× Nucleo-F401RE + cable micro-USB de datos
- Opcional: 1 potenciómetro de 10 kΩ entre 3,3 V, GND y A0 (PA0) para tener algo que registrar
La verdad sobre el cableado
El conector micro-USB de la placa va al ST-LINK, no al periférico USB OTG del MCU. Esto es una ventaja para los principiantes: el puerto COM siempre está disponible, incluso si tu sketch nunca toca USB. Los pines OTG FS del propio MCU están disponibles en los conectores morpho para trabajos avanzados de dispositivo USB (consulta el tutorial avanzado de USB OTG).
Código
const int kProbePin = A0; // PA0 on the Arduino connector
void setup {
Serial.begin(115200); // ST-LINK VCP, no native USB needed
while (!Serial && millis < 2000) {} // brief wait for the VCP to settle
Serial.println("Nucleo-F401RE serial log up");
}
void loop {
int raw = analogRead(kProbePin); // 12-bit ADC, 16 channels (F401RE)
Serial.printf("ADC raw=%d mV=%lu\n", raw,
(unsigned long)(raw * 3300 / 4095));
delay(250);
}
Pasos
- Carga el sketch con la placa Nucleo F401RE seleccionada.
- Abre el monitor serie a 115200 baudios en el puerto COM del ST-LINK.
- Gira el potenciómetro: la columna de milivoltios debe barrer de 0 → 3300 mV.
- Desconecta y vuelve a conectar el cable: el registro se reinicia — el VCP se reenumera con la placa.
Resultado esperado
Líneas limpias ADC raw=... mV=... a 4 Hz. Dado que el ADC es de 12 bits (0–4095 sobre 0–3,3 V), la conversión divide por 4095, no por 1023 — un error clásico heredado de los tutoriales de AVR de 10 bits. Serial.printf funciona directamente en el núcleo STM32, sin necesidad de acrobacias con TinyPrintf.
Errores comunes
- Abrir la unidad de almacenamiento masivo o la interfaz del depurador en lugar del puerto COM — el ST-LINK se enumera como depurador + VCP + MSD simultáneamente.
- Esperar USB-CDC:
Serialaquí es USART2 en PA2/PA3; el periférico OTG es un tema avanzado y separado. - Olvidar la escala de 12 bits y codificar 1023 a mano — tus milivoltios alcanzarán solo un cuarto del rango.
- Inyectar una señal de 5 V en A0: el dominio del MCU es de 3,3 V (rango VDD 1,7–3,6 V) — usa un divisor de resistores.
Otros tutoriales para esta placa
- Prise en main de la Nucleo-F401RE : ST-LINK, LED LD2 et alimentation
- Premier Blink Arduino sur la Nucleo-F401RE avec le core STM32duino
- STM32CubeF4 et HAL : blink + UART printf générés pour la Nucleo-F401RE
- ADC 12 bits et PWM sur la Nucleo-F401RE : oversampling, millivolts et LED en fondu
- Zephyr RTOS sur la Nucleo-F401RE : west build, devicetree et west flash
- Bare-metal sur le STM32F401 : clignoter LD2 en écrivant les registres GPIO