Table des matières

"Printf" sur STM32

Selon les environnements de développement les “printf” ne sont pas actif pour les STM32.

Tuto

1. Mapper les pins de USART à l'aide de “CubeMX”

  • Repérer dans la documentation de votre carte les pins qui font le lien entre le microcontrôleur et le ST-Link. Pour vous aidez utiliser la fonction de recherche “Ctrl+F” et taper “UART communication” ou “USART communication”.
  • Ouvrir “CubeMX” et activer la communication “asynchrone”.
  • Dans l'onglet configuration → cliquer sur l'icône des pins précédemment sélectionnées (exemple : USART2)
  • Dans “Parameter settings” vérifier les éléments suivant :
    • BaudRate : 115200
    • WordLength : 8bits (including Parity)
    • Parity : None
    • StopBits : 1
  • Finir par générer le projet.

2. Ajouter le fichier source “syscalls.c” et des options de linkage.

  • Le fichier “syscalls.c” ce trouve dans les exemples fournie via “CubeMX”
  • Vous pouvez le trouvé grâce au fonctions de recherche de votre OS.
  • Le copier et le placer dans le dossier src de votre projet.
  • Editer le et commenté la ligne #define FreeRTOS.
  • Déplacer vous dans le dossier ou ce trouve vos linker script
  • Créer un fichier “lib.ld” et y placer ceci :
 /* Placeholder to list other libraries required by the application. GROUP() */
 GROUP(
   libgcc.a
   libg.a
   libc.a
   libm.a
   libnosys.a
 )

3. Modifier le fichier de configuration de UART (USART.c):

  • Ouvrir le fichier et placer ceci entre /* USER CODE BEGIN 0 */ et /* USER CODE END 0 */ :
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

et coller ceci entre /* USER CODE BEGIN 1 */ et /* USER CODE END 1 */ :

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART2 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}

Vérifier qu'il n'y est pas d'erreur au niveau de HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
Si erreur il y a il faut récupérer la variable en haut du fichier nomé UART_HandleTypeDef huart2;

Finir en ajoutant #include <stdio.h> dans le “main.c”.

4. Activer les options de compilation et linker:

  • Faire “Alt+Entrer” sur le nom du projet ou clic droit→ properties.
  • Dans C/C++ Build → Settings → Tool settings → Cross ARM C Linker → Miscellaneous. Cocher les options suivantes :
    • Use newlib-nano (–specs=nano.specs)
    • Use float with nano printf (-u_printf_float)
  • Dans C/C++ Build → Settings → Tool settings → Cross ARM C Linker → General.
  • Ajouter le chemin vers le fichier “lib.ld”

5. Test.

  • Placer un text dans le main.c

exemple :

printf("salut \n");
      HAL_Delay(1000);
 
    Le retour chariot et important!!!