STM32 CubeIDE HAL: printf() Ausgabe über UART

OP #7429346
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!

Gast #7429402
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);

#7429415
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.

OP #7429906
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?

Gast #7429908
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren