Forum: Mikrocontroller und Digitale Elektronik STM32 CubeIDE HAL: printf() Ausgabe über UART


von Alexander K. (alexander_43)


Lesenswert?

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!

von Stefan F. (Gast)


Lesenswert?

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

von Harry L. (mysth)


Lesenswert?


von J. S. (jojos)


Lesenswert?

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
von Alexander K. (alexander_43)


Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

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.

von Alexander K. (alexander_43)


Lesenswert?

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
Noch kein Account? Hier anmelden.