STM32 printf Umleitung

Gast #2052052
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
Moderator Persönliche Seite #2052381
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.
#2438494
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
Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.