Hallo,
ich möchte mittels printf() über die serielle Schnittstelle des
MCBSTM32-Boards schreiben. Nutze die StdPeriph_Lib und Keil-IDE.
Entsprechend printf-Example habe ich einen Prototypen für putchar und
die <stdio.h> included. Ergebnis sind 0 Compiler Errors und 0 Linker
Errors, aber mein Programm bleibt hängen.
1
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
Wenn ich die pritnf("a")-Zeile auskommentiere und die andere in der
while(1) einkommentiere funktioniert alles; LED toggelt und A wird
gesendet. So wie oben passiert garnichts. Im Projekt sind
stm32f10x_usart.c, stm32f10x_gpio.c, stm32f10x_rcc.c und misc.c.
Hat jemand einen Tip?
Grüße, Mirco
schau mal bitte in die examples des MCBSTM32.
Dort findest du Code, der leicht lesbar ist und läuft, ohne driver
library.
Ausserdem findest du in der datei "retarget.c" in einigen der Beispiele
ein minimal retargeting, was du verwenden solltest.
Ebenso kannst du die ITM_Sendchar() Funktion aus der CMSIS verwenden,
die daten kommen beim Debuggen im ITM/printf Viewer (View Menue) an.
Terminalsequenzen sind auch möglich seit UV4, ausserdem gibt es ein paar
neue interessante Terminal Modes.
Eingabe ist auch möglich (memory write), direkt im ITM window, entweder
aktuelle CMSIS GetChar, oder:
1
volatileunsignedintITM_RxBuffer;// 0x5AA55AA5 is handshake value
2
3
// ITM Serial Window Input Watch and Init function
4
voidITMRx_InInit(void){
5
ITM_RxBuffer=0x5AA55AA5;
6
}
7
8
intITMRx_Getc(void){
9
intrecChar=0;// zero is default if no new char recv
10
11
if(ITM_RxBuffer!=0x5AA55AA5)
12
{
13
recChar=ITM_RxBuffer&0xff;
14
ITM_RxBuffer=0x5AA55AA5;
15
}
16
return(recChar);
17
}
DL und Code zu mischen ist meist eine schlechte Idee, am besten die DL
als Beispielcode nutzen.
VG,
/th.
Anmerkung:
die ITMRx_Getc() in meinem Beispiel ist non-blocking, d.h. sie liefert
NULL oder ein valid char zurück.
Für die Verwendung mit scanf() muss im fgetc - retarget eine schleife
eingebaut werden, die auf valid char prüft und erst dann (diesen)
zurückliefert.
VG,
/th.
Also mich wundert es etwas, dass du printf einfach so verwenden können
sollst. Normalerweise sind ja für printf noch einige andere
Basis-Funktion notwendig die der Entwickler implementieren muss, damit
printf funktioniert. Ist das bei Keil schon alles geschehen?
Kannst du in das printf hinein steppen? Kommst du bei deiner
putchar-Funktion an? Gibt es eventuell beim Ausführen von Printf eine
Exception, die dein Debugger aber nicht fängt?
Hi,
So im Groben:
fopen --> lib --> _sys_open
printf --> fputc --> lib --> _sys_write
scanf --> fgetc --> lib --> _sys_read
fclose --> lib --> _sys_close
Für ein einfaches Retargeting reicht es, die fputc zu überladen,
use_no_semihosting zu verwenden und noch ein paar wenige
Zusatzfunktionen, die von der libc benötigt werden, einzubauen
--> siehe retarget.c
Will man ein komplettes Konzept basierend auf den file streaming
funktionen aufbauen, muss man auf die _sys_x - ebene runter (siehe
RTAgent.c), und dort einen IO Layer einziehen.
VG,
/th.
Hallo,
Danke Thorsten für den Tip mit Retarget.c!
Dort kann man sehen dass FILE eine Struktur ist und wie sie
initialisiert wird.
Habe in meinen Code noch die beiden folgenden Zeilen eingefügt. Dann hat
alles funktioniert.
1
struct__FILE{inthandle;/* Add whatever you need here */};
2
FILE__stdout;
Bei meinem Projekt muss ich auf bereits bestehendem Code aufbauen und in
diesem sind die std driver verwendet worden... Deshalb wollte ich es auf
diese Weise lösen.
Danke für die ausführlichen Beschreibungen.
Grüße, Mirco
Hallo,
ich habe das selbe Problem nur komme ich auch mit den angegebenen Hilfen
nicht weiter. fputc habe ich schon überladen, mit dem ganz oben
beschriebenen Code. Ich benutzt eine IAR Umgebung und habe alle
wichtigen Header eingebunden. Zusätzlich auch noch DLIB_Config,
DLIB_Default etc.
Dort wird dann FILE deklariert. Meine Fehler geschieht zur Laufzeit und
zwar direkt nach dem Übergang in den Debug Modus derartig, dass ich
keine Möglichkeit habe Breakpoints zu setzten.
Nun würde ich gerne wissen was ich hiermit anfangen kann:
Random ... schrieb:> printf --> fputc --> lib --> _sys_write
Wo kann ich mir die Funktion fputc anschauen um eventuell weitere
Informationen darüber zu erhalten.
Random ... schrieb:> use_no_semihosting zu verwenden und noch ein paar wenige> Zusatzfunktionen, die von der libc benötigt werden, einzubauen> --> siehe retarget.c
Diese Retarget.c gibt es in meiner Entwicklungsumgebung nicht unter
Beispielen. Wie kann ich use_no_semihosting vermenden?
Im Netz habe ich nur die üblichen Informationen (printf, scanf
formatierung etc.) im Umgang mit stdio.h gefunden, kennt jemand
vielleicht einen Link der darauf tiefer eingeht?
Ich bin ebenfalls gezwungen in diesem Projekt auf die Library
zuzugreifen. Auf dem Demoboard funktionieren Ein- und Ausgabe wunderbar
und deswegen bin ich hier am verzweifeln. Vielen Dank für eure
Aufmerksamkeit schon mal vorab und viele Grüße
Axel