====== "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 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!!!