usart-printf.c

STM32F103 "Blue Pill" (STM32F103C8T6) · Fichier : usart-printf.c · Langage : C · Usage : Envoyer des mesures sur le port série (USART) avec printf

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 Blue Pill STM32F103C8T6 (Cortex-M3 @ 72 MHz, 64 Ko flash) alimentee par micro-USB ou 3,3 V externe ; programmation SWD ou bootloader serie. 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 : USART1 (PA9/PA10) est a relier a un adaptateur USB-serie 3,3 V (la carte n'a pas de convertisseur USB integre)..

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 (STM32F103C8) ou Arduino (core STM32) : programmer par SWD (ST-LINK, adaptateur DAPLink) ou par le bootloader serie (BOOT0 a 1). Attention : LED PC13 active LOW.

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

← Retour à la fiche