Hallo Zusammen, ich habe seither für diverse STM32 Projekte folgende Library genutzt, um mit der normalen printf()-Funktion Debug-Ausgaben über die UART zu realisieren. https://github.com/cnoviello/mastering-stm32/blob/master/nucleo-f030R8/system/src/retarget/retarget.c Dazu musste die syscalls.c Datei gelöscht werden und am Anfang die retarget-Funktion aus der Library aufgerufen werden. Funktionierte einwandfrei. Nun habe ich CubeIDE auf Version 1.12.0 geupdatet, wo anscheinend auch eine neuere GCC-Version zum Einsatz kommt. Ohne das Compiler-Flag -fcommon bauen seither die systemgenerierten Projekte auch nicht mehr fehlerfrei, deshalb muss ich das immer anpassen. Nun habe ich das Problem, dass die Ausgaben über printf() nicht mehr wie vorher in der alten IDE funktionieren. Ich habe auch schon andere Lösungsansätze, wie in diesem Dokument beschrieben, ausprobiert: https://www.st.com/content/ccc/resource/technical/document/application_note/group0/3d/a5/0e/30/76/51/45/58/DM00354244/files/DM00354244.pdf/jcr:content/translations/en.DM00354244.pdf Leider dasselbe fehlverhalten. Ausgaben direkt über HAL_UART_Transmit() funktionieren einwandfrei. Hat jemand eine Idee woran es liegen könnte und kann mir da helfen? Vielen Dank!
Probiere mal
1 | int _write(int file, char *ptr, int len) |
2 | {
|
3 | for (int i=0; i<len; i++) |
4 | {
|
5 | char c=*ptr++; |
6 | // hier das Zeichen c irgendwo ausgeben
|
7 | }
|
8 | return len; |
9 | }
|
Da kannst du bestimmt deinen HAL_UART_Transmit Call unterbringen. Ich rate mal: HAL_UART_Transmit(&UartHandle, (uint8_t *)&c, 1, 0xFFFF);
Hier steht sehr detailliert wie das geht: https://community.st.com/s/article/how-to-redirect-the-printf-function-to-a-uart-for-debug-messages
das -fcommon Problem kommt auch sicher von eigenem Code, bei ST habe das noch nicht gesehen. Die Meldung kommt von mehrfach Deklarationen von globalen Variablen, der gcc hat das bis zur Version 10 akzeptiert und jetzt wurde der default auf den C Standard umgestellt.
:
Bearbeitet durch User
Danke für eure Antworten! Ich habe eben nochmal ein paar Tests gemacht und nun ist mir aufgefallen, dass die printf() Funktion so lange die Daten "sammelt", bis 1024 Byte erreicht sind. Dann werden die letzten Ausgaben auf einmal Blockweise ausgegeben. Ich hätte es natürlich lieber so, dass die Ausgabe sofort startet. Was muss ich dazu ändern?
:
Bearbeitet durch User
Alexander K. schrieb: > nun ist mir aufgefallen, dass die printf() Funktion so > lange die Daten "sammelt", bis 1024 Byte erreicht sind Oder bis zum Zeilenumbruch. Mit fflush(stdout) kann man erzwingen, dass die Ausgabe sofort erfolgt. Ich bin ja immer noch der Meinung, dass man erst einmal die Grundlagen (Register, CMSIS, Newlib, Newlib Nano) lernen sollte, bevor man ein Framework verwendet, das darauf aufbaut.
Stefan F. schrieb: > Oder bis zum Zeilenumbruch. > Mit fflush(stdout) kann man erzwingen, dass die Ausgabe sofort erfolgt. Vielen Dank, das war es. Ich hatte einfach nur \r im String gehabt und kein \n und dann wurde es nicht sofort ausgegeben. Jetzt funktioniert es auch mit der ursprünglichen Library.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.