usart-printf.c
Redirigir printf() al USART en tres líneas: la placa envía sus medidas por el puerto serie virtual USB, visibles en un terminal a 115200 baudios. El patrón de retargeting es el mismo en toda la gama STM32 con HAL.
Hardware
Una Nucleo F4 (STM32F401RE/F411RE, Cortex-M4) programada via ST-LINK (USB), pines de 3,3 V. Un cable USB al conector de la placa (puerto serie virtual ST-LINK o convertidor integrado).
Cableado
Sin cableado necesario: el USART2 (PA2/PA3) va rutado al convertidor serie del ST-LINK, visible en el puerto serie virtual USB..
Funcionamiento
__io_putchar() lo llama printf por cada carácter; lo reenvía con HAL_UART_Transmit. El terminal serie (minicom, PuTTY, monitor CubeIDE) muestra las líneas a 115200 8N1.
Ejecución
Crea un proyecto STM32CubeIDE (elige Nucleo-F401RE o F411RE), pega el codigo en main.c, configura los perifericos en el .ioc y pulsa Run. El terminal serie del ST-LINK muestra los printf a 115200.
Variantes
Usa HAL_UART_Transmit_DMA para no bloquear la CPU, o añade recepción por interrupción + sscanf para un mini protocolo.
usart-printf.c
// printf vers USART (le port serie virtuel de la carte).
#include "main.h"
#include <stdio.h>
extern UART_HandleTypeDef huart2; // genere par CubeMX (USART2)
// Redirection de printf vers le HAL (retarget).
int __io_putchar(int ch) {
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
// Variante recentree sur newlib (selon la toolchain) :
// int _write(int f, char *p, int n){ HAL_UART_Transmit(&huart2,(uint8_t*)p,n,100); return n; }
uint32_t t0 = 0;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init(); // 115200 8N1 dans le .ioc
for (;;) {
if (HAL_GetTick() - t0 >= 1000) {
t0 = HAL_GetTick();
float mesure = 3.3f * (float)HAL_GetTick() / 100000.0f; // exemple
printf("t=%lu ms mesure=%.2f V\r\n",
(unsigned long)HAL_GetTick(), mesure);
}
}
}