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! ;)
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.
NACHTRAG: Wenn ich unter "Options for Targets" --> Debug --> Settings for ST Link --> Trace --> 100Mhz einstelle bekomme ich angehängtes Bild im Debugger.
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).
Ich habe es noch nicht wirklich benutzt, aber ich würde in CubeMX nicht "Serial Wire" sondern "Trace Asynchronus Sw" einstellen.
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.
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.
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!!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
