Forum: Mikrocontroller und Digitale Elektronik STM32 printf Umleitung


von Jürgen (Gast)


Lesenswert?

Hallo,

ich arbeite mit der Keil-IDE und einem STM32.

Ziel ist es, Daten von einer seriellen Schnittstelle (UART) zu 
empfangen, zu analysieren und zu verarbeiten und bedingungsabhängig auf 
einer anderen auszugeben. Es geht um 3 Schnittstellen, die alle, Source 
und Senke der Information sein können.

In den Templates, die zum Keil mitkommen, ist die printf-Ausgabe per 
#define festgeschrieben, was mir ja zur Laufzeit nicht weiterhilft.

Wie löst man dieses Problem nun elegant?
U.B. printf mit 2. Parameter oder
vorher globale Variable umsetzen?

Mit der retarget.c komme ich nicht klar, d.h. ich verstehe nicht, wie 
ich das damit lösen kann.

Also, was ist Euer Vorschlag?

Viel Grüße

Jürgen

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Soweit erinnert (nutze fast nur anderen Compiler/libc, ist aber überall 
ähnlich), wird den low-level-Funktionen (sys_write, sys_read,...) ein 
file-handle mitgegeben. printf nutzt STDOUT und für die anderen 
Schnittstellen führt man selbst File-Handles  ein, nutzt fprintf/fgetc 
etc. und macht in den low-level-Funktionen (sys_write, sys_read...) 
Fallunterscheidungen oder - eleganter - mittels eines Arrays aus 
structs, in denen Funktionspointer für die jeweilige 
schnittstellenspezifischen Funktionen gespeichert sind.

von A. B. (funky)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hatte das gleiche Problem.(benutze einen STM32F215)

Hier mal eien retarget Variante die bei mir funktioniert.
printf braucht um die 500Bytes, sollte ja aber kein Problem sein

Ich weiss nicht, ob das ganze noch vom Debugger abhängt?
Ich benutze einen J-Link Adapter per SW und nicht JTAG.
Zusätzlich habe ich das ganze noch so konfiguriert:
http://www.keil.com/support/man/docs/jlink/jLink_STM32F10xxx_SWT.htm

Ich kann nun per printf Texte in das Debugfenster schreiben.

Was ich noch nicht so ganz verstanden habe:
Laut 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0067d/Cihdfbhe.html 
ist printf() nur abhängig von fputc() and ferror().

Bei mir wurden aber immer noch die file Funktionen wie _sys_open() 
aufgerufen. evtl. muss man da noch irgendwie den StdOut umkonfigurieren?
Mit der retarget Version klappt es jetzt aber, da die _sys-Funktionen 
dort ersetzt sind.

Da waren vorher auch noch Funktionen drinne, um printf für ein LCD 
benutzen zu können. Ich habe das aber gelöscht, da nicht benötigt. Wer 
weiteres wissen will, kann sich auch das Beispiel in 
"Keil\ARM\Boards\Keil\MCBSTM32E\framebuffer" zu gemüte führen


Evtl. hilft das ja jemanden

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.