usart-printf.c

STM32F4DISCOVERY (kit Discovery STM32F407VGT6) · Archivo : usart-printf.c · Lenguaje : C · Uso : Envoyer des mesures sur le port série (USART) avec printf

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 STM32F407G-DISC1 (Discovery F4, Cortex-M4 @ 168 MHz) con ST-LINK integrado, 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: un USART (p. ej. USART6 PG14/PG9 o USART2 segun montaje) debe rutarse a un adaptador USB-serie o al ST-LINK-VCP segun la revision..

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

Proyecto STM32CubeIDE « STM32F407G-DISC1 »: pega el codigo en main.c, configura el .ioc, Run. La placa tiene 4 LED (PD12-PD15) y el boton USER en PA0.

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);
    }
  }
}

← Volver a la ficha