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