Forum: Mikrocontroller und Digitale Elektronik STM32F411 Prinftf Anweisung Debug KEIL5.26


von Martina (Gast)


Lesenswert?

Hallo!

Ich benötige etwas Hilfe bei meinem Problem.

Ich programmiere am Discovery Board STM32F4 und benutze den Cube sowie 
Keil Version 5.26.

Ich versuche eine printf Anweisung im Debug Modus auszuführen und im 
Debug printf Viewer anzeigen zu lassen.

Ich habe mir schon einige Videos und Tutorials angeschaut aber alle 
verwenden UART oder stellen Sachen ein, die ich weder benötige noch 
habe.

Was habe ich schon getan:
- stdio.h inkludiert
- Unter "Manage Run Time Enviroment" --> I/O --> stdout und stdin auf 
TMI gesetzt.
- Im Cube "SYS" auf "Serial Wire" gesetzt
- eine einfache printf Anweisung (Hello World) in die while Schleife 
geschrieben
- Im Debug Modus den "Debug printf Viewer" geöffnet.

Und NIX passiert also die Anweisung wird beim Ausführen des Programms 
dort nicht angezeigt.

Ich habe auch schon mit ein paar Anweisungen laut Tutorials im Keil bei 
"Options for Targets" --> Debug herumgespielt aber auch da funktioniert 
dann nix.


Gibt es hier eine halbwegs einfache Lösung, wie man eine printf 
Anweisung im Debug Modus angezeigt bekommen kann?


Vielen Dank für die Hilfe! ;)

von Stefan F. (Gast)


Lesenswert?

Ich habe von Keil keine Ahnung.

Deine Frage verstehe ich so, dass du mit printf() eine Ausgabe auf die 
SWO Leitung machen willst. Dazu musst du folgende Funktion 
implementieren:
1
// Redirect standard output to the trace SWO output
2
int _write(int file, char *ptr, int len)
3
{
4
    for (int i=0; i<len; i++)
5
    {
6
        ITM_SendChar(*ptr++);
7
    }
8
    return len;
9
}
Außerdem musst du in deinem Projekt die folgenden Linker-Flags benutzen:
1
-specs=nano.specs -specs=nosys.specs
Eventuell werden diese in deinen Projekteinstellungen durch Checkboxen 
dargestellt. Es geht hier darum, die nano Version der Newlib Library zu 
verwenden, ohne vollständige Implementierung aller System Funktionen.

Dein Versuch, SWD zu aktivieren war auf jeden Fall auch richtig und 
nötig. Eigentlich ist das die Default Vorgabe bei allen STM32 
Mikrocontrollern - nur dieses dumme CubeMX deaktiviert es per Default.

von Martina (Gast)


Angehängte Dateien:

Lesenswert?

NACHTRAG:

Wenn ich unter "Options for Targets" --> Debug --> Settings for ST Link 
--> Trace --> 100Mhz einstelle bekomme ich angehängtes Bild im Debugger.

von Stefan F. (Gast)


Lesenswert?

Martina schrieb:
> NACHTRAG:
>
> Wenn ich unter "Options for Targets" --> Debug --> Settings for ST Link
> --> Trace --> 100Mhz einstelle bekomme ich angehängtes Bild im Debugger.

Das ist ja schonmal was, wenn auch doof formatiert. Die SWO Leitung wird 
mit 1/4 des CPU Taktes betrieben.

Ich habe irgendwo gelesen, dass die SWO Schnittstelle wahlweise 8, 16 
oder 32bit ausgeben kann. Aber in der Praxis komme ich auch immer nur 
auf 32 Bits. Zwischen den sichtbaren Zeichen habe ich immer unsichtbare 
Steuer-Zeichen.

Deswegen benutze ich das so, dass ich openocd anweise, die Meldungen in 
eine Datei zu schrieben. Diese betrachte ich dann mit dem Befehl
1
tail -f debug.txt
bzw. mit
1
tail -f debug.txt | tr -dc '[:print:]\n'
falls der tail Befehl die Steuerzeichen nicht bereits heraus filtert 
(ist je nach Version unterschiedlich).

von pegel (Gast)


Lesenswert?

Ich habe es noch nicht wirklich benutzt, aber ich würde in CubeMX nicht 
"Serial Wire" sondern "Trace Asynchronus Sw" einstellen.

von Jim M. (turboj)


Lesenswert?

Stefanus F. schrieb:
> Ich habe von Keil keine Ahnung.

Dann sollte man das Posten lieber lassen. Keil liefert AFAIK kein Newlib 
als LibC aus (und auch keinen GCC als Compiler) - damit sind Deine 
Beispiele leider sinnfrei.


Der OP sollte mal in der Keil Doku nach dem Begriff "Semihosting" 
suchen.

von Stefan F. (Gast)


Lesenswert?

Jim M. schrieb:
> Dann sollte man das Posten lieber lassen. Keil liefert AFAIK kein Newlib
> als LibC aus (und auch keinen GCC als Compiler) - damit sind Deine
> Beispiele leider sinnfrei.

Hmm, schade. Dumm gelaufen. Immerhin weiß ich das jetzt für's nächste 
mal. Deswegen besten Dank für diesen Hinweis. Und Sorry für die 
Ablenkung.

von Martina (Gast)


Lesenswert?

pegel schrieb:
> Ich habe es noch nicht wirklich benutzt, aber ich würde in CubeMX nicht
> "Serial Wire" sondern "Trace Asynchronus Sw" einstellen.

Danke für den Hinweis

Ich habe das im Cube umgestellt und dann noch mit den Zahlen unter Debug 
herumgespielt und

ES FUNKTIONIERT JETZT!!!!!


VIELEN DANK!!!

von pegel (Gast)


Lesenswert?

Freut mich.

Ich habe auch schon mal daran gedacht das zu benutzen, bin aber dann 
doch bei der seriellen Schnittstelle geblieben.

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.