usart-printf.c
Rediriger printf() vers l'USART en trois lignes : la carte envoie ses mesures sur le port série virtuel USB, visibles dans un terminal à 115200 bauds. Le patron de retargeting est le même sur toute la gamme STM32 avec la HAL.
Matériel requis
Une Nucleo H7 (STM32H743ZI, Cortex-M7 @ 480 MHz) programmee via ST-LINK (USB), broches 3,3 V. Un câble USB relié au connecteur de la carte (port série virtuel ST-LINK ou convertisseur intégré).
Câblage
Aucun câblage requis : le console UART3 (PD8/PD9) est route vers le port serie virtuel du ST-LINK..
Fonctionnement
__io_putchar() est appelé par printf pour chaque caractère ; il le transmet via HAL_UART_Transmit. Le terminal série (minicom, PuTTY, moniteur CubeIDE) affiche les lignes à 115200 8N1.
Exécution
Projet STM32CubeIDE base sur la Nucleo-H743ZI : le code se glisse dans main.c, les peripheriques se declarent dans le .ioc, puis Run via l'interface ST-LINK. Le moniteur serie du ST-LINK affiche les printf a 115200.
Variantes
Utiliser HAL_UART_Transmit_DMA pour ne pas bloquer le CPU, ou ajouter la réception interrupt + sscanf pour un mini-protocole.
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);
}
}
}