Forum: Mikrocontroller und Digitale Elektronik UART USB STM32F407VGT


von Ulf K. (spurzylinder)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe folgendes Problem und zwar möchte ich simple über den UART2 des 
STM-Boards einen char bzw. string senden und diesen über den 
Mini-USB-Anschluss am PC empfangen und darstellen.
Zunächst hatte ich das Problem, dass Windows den COM-Port des Boards 
erkennt und HTerm auch jedoch Terminal nicht.
Nachdem ich die Treiber neu installiert habe, wurde dieser allerdings 
behoben.
Nur wird mir in keinem der Programme irgendetwas angezeigt.
Im angefügten Bild habe ich mit meinem "Oszilloskop" mir den TX-Pin 
ausgelesen. Meiner Meinung wird dort eine Bitfolge übertragen. Nur 
verstehe ich nicht warum ich über den USB-Anschluss im Terminalprogramm 
nichts empfange.
Die Baudrate als auch Konfiguration habe ich mehrmals überprüft und 
kontrolliert.

Kann sich einer von euch einen Reim drauf machen? Wird wirklich eine 
Bitfolge gesendet oder irre ich mich da?

Vielen Dank im Voraus für eure Hilfe

von Harlekin (Gast)


Lesenswert?

Interessant wäre das Schema des benutzten Boards.

von Halb Blinder (Gast)


Lesenswert?

Ulf K. schrieb:
> ich habe folgendes Problem und zwar möchte ich simple über den UART2 des
> STM-Boards einen char bzw. string senden und diesen über den
> Mini-USB-Anschluss am PC empfangen und darstellen.

Ich sehe bei diesem Board keinen Com-Port. Wo soll der sein?

von Dr. Sommer (Gast)


Lesenswert?

Was für ein STM-Board? Was für ein COM-Port? Welcher Treiber? Mal ne 
Pause vor jedem Senden gemacht, damit die Gegenstelle Gelegenheit hat 
den Frame-Beginn zu erkennen?

von Halb Blinder (Gast)


Lesenswert?

Ulf K. schrieb:
> Nur wird mir in keinem der Programme irgendetwas angezeigt.

Wenn du meinst du kannst einen Datenstrom den du über einen
UART des STM ausgibst an der USB Buchse abgreifen zu können
dann hast du was falsch verstanden.

von Martin B. (Gast)


Lesenswert?

Wenn Du den USB Port zur Übertragung benutzen willst musst Du eine 
virtuelle COM Schnittstelle benutzen. Das sehe ich bei Dir im code 
nicht. Da kann also gar nichts über USB laufen.

Mit virtueller CDC Schnittstelle kannst Du mit
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
was senden.

Dann must Du die CDC vorher aber auch initialisieren. Klappt mit der 
Cube Software, ist aber ein wenig zu beachten (VBUS signal richtig 
setzen u.s.w.)

von Stefan F. (Gast)


Lesenswert?

Die folgende Anleitung habe ich für einen STM32F103 erstellt, ich 
schätze allerdings, dass die Vorgehensweise bei deinem µC gleich sein 
dürfte. Das ist ja gerade der Sinn von Cube HAL.

Schau mal: http://stefanfrings.de/stm32/index.html#vcphal

von Stefan F. (Gast)


Lesenswert?

Mir ist da noch ein fehler aufgefallen:
1
char* buff="H\n\r";
2
HAL_UART_Transmit_IT(&huart2, (uint8_t *)buff,8);

Dein Puffer ist 4 Bytes groß (wenn man das Abschließende \0 des Strings 
mit zählt) aber du sendest 8 Bytes.

Anstelle der 8 wolltest du sicher strlen(buff) benutzen, schätze ich 
mal.

von Ulf K. (spurzylinder)


Lesenswert?

Erstmal danke euch allen für eure Hilfe :)

Ich kann nun über den FTDI Adapter FT232RL nun Daten im Terminal 
empfangen.
Allerdings würde ich auch gerne verstehen wie ich den Com-Port des 
Boards nutzen kann.

Ich hab mir dazu die Anleitung von Stefan angeschaut, jedoch hat dies 
bei mir leider nicht geklappt. Den Treiber und der Com Port des Boards 
wurde mir schon vorher im Geräte-Manger angezeigt, aus dem Grund bin ich 
davon ausgegangen, dass über diesen schon Daten übertragen werden können 
ohne eine zusätzliche Initialisierung.

Deshalb hätte ich ein paar Anschlussfragen an euch:

@stefanus:
In deiner Anleitung (Virtueller COM-Port mit Cube HAL) schreibst du die 
"...mittels PLL auf 48MHz...", meinst du hier die Frequenz welche aus 
der Main PLL ensteht oder eine andere wie Sysclk oder HCLK?

Weiterhin würde ich gerne wissen, was die Funktion: "CDC_Transmit_FS( 
(uint8_t*) msg, strlen(msg));" genau macht bzw. wo ich eine 
Beschreibung. Leider wird in der Definition/Referenz nichts beschrieben.


Muss ich also für die noch zusätzlich Dinge beachten wie es Martin B. 
beschrieben hat:

Martin B. schrieb:
> ist aber ein wenig zu beachten (VBUS signal richtig
> setzen u.s.w.)

Weiterhin würde ich gerne wissen, ob ihr Einsteigerliteratur empfehlen 
könnt, da ich mich gerne weiter und intensiver mit dem Board 
beschäftigen möchte.

Zudem ist mir aufgefallen, dass viele die hier und in anderen Foren eher 
die standard peripheral library. Ich habe mit der hal library angefangen 
und suche manchmal ziemlich lange nach der äquivalenten Funktion. Gibt 
es hier vorgefertigte Übersichten und sollte ich lieber die lib 
wechseln?

Lg Ulf

von Dr. Sommer (Gast)


Lesenswert?

Ulf K. schrieb:
> Allerdings würde ich auch gerne verstehen wie ich den Com-Port des
> Boards nutzen kann.

Was denn jetzt, verrate doch mal endlich ob dein Controller direkt mit 
USB verbunden ist, oder ob du über einen USB <-> Seriell Adapter 
kommunizierst. Im ersteren Fall musst du das USB Protokoll 
implementieren; das ist recht komplex aber es gibt Bibliotheken die das 
erledigen, wie von Stefan beschrieben.

Ulf K. schrieb:
> Weiterhin würde ich gerne wissen, was die Funktion: "CDC_Transmit_FS(
> (uint8_t*) msg, strlen(msg));" genau macht bzw. wo ich eine
> Beschreibung. Leider wird in der Definition/Referenz nichts beschrieben

Es wird wohl die Daten über einen USB Endpoint verschicken. Lies dazu 
die USB 2.0 Spezifikation sowie die USB CDC Spezifikation.

Ulf K. schrieb:
> Den Treiber und der Com Port des Boards wurde mir schon vorher im
> Geräte-Manger angezeigt, aus dem Grund bin ich davon ausgegangen, dass
> über diesen schon Daten übertragen werden können ohne eine zusätzliche
> Initialisierung.
Es braucht eine Menge Initialisierung und weiteren  Code - das ist in 
genannten Bibliotheken enthalten. Da der Port aber schon vorher da war 
benutzt du wahrscheinlich einen USB-Seriell Adapter (FT232? STLink?) und 
das ganze ist unnötig.

von Stefan F. (Gast)


Lesenswert?

Schau Dir die Taktkonfiguration in Cube-HAL an. Das Programm wird Dir n 
der Grafik anzeigen, wo die Taktfrequenz für USB eingestellt sein muss 
und ob sie geeignet ist.

Die Funktion CDC_Transmit_FS() sendet ein oder mehrere Bytes. Das erste 
Argument ist ein Zeiger auf das erste zu sendende Byte. Das zweite 
Argument gibt an, wie viele Byte gesendet werden sollen.

Im Grunde genommen tut die funktion genau das Selbe, wie die 
HAL_UART_Transmit_IT(), die du bereits verwendest. Es geht nur halt über 
eine andere Schnittstelle raus.

> ist aber ein wenig zu beachten (VBUS signal richtig
> setzen u.s.w.

Cube HAL generiert den nötigen Initialisierungs-Code. Wenn du da 
unsicher bist, solltest du endlich mal mitteilen, um welches konkrete 
Board es geht bzw. den Schaltplan deiner Eigen-Kreation zeigen.

Als Einsteiger-Literatur empfehle ich Dir meine Webseite, die du schon 
gesehen hast. Sie enthält auch ein einführendes Buch und Links zu den 
Dokumenten, die man lesen sollte.

> Ich habe mit der hal library angefangen und suche manchmal
> ziemlich lange nach der äquivalenten Funktion.

Anstatt Doku zur StdPeriph Library zu benutzen und dann ohne das nötige 
Know-How auf Cube HAL übersetzen zu wollen, solltest du lieber Doku zur 
Cube HAL lesen. Diese findest du auf der Webseite von ST. Oder du 
verwendest erst einmal nur die CMSIS-Core (also gar keine 
Abstraktions-Library) und lernst erst einmal deinen Mikrocontroller 
kennen, bevor du die nächste Hürde mit der Software nimmst.

Wie das geht kannst du auf meiner Webseite lesen. Der Einfachheit halber 
würde ich raten, noch ein STM32F103C8T6 Board oder ein Nucleo-F103RB 
dazu zu kaufen. Denn dann kannst du meine Code-Beispiele erst einmal 1:1 
nachvollziehen. Als nächstes kannst dann mal schauen, inwiefern meine 
Ausführungen auf deinen schnelleren Controller zutreffen. Sicher wird 
das Meiste passen, aber am Anfangen ist es zunächst besser, wenn Doku 
und Hardware zu 100% zusammen passen.

Es wäre sicher besser, wenn ich Dir so eine ähnliche Seite wie meine 
aber für deinen Controller empfehlen würde. Kann ich aber nicht, ich 
kenne keine. Sonst hätte ich selbst mit diesem Controller angefangen. 
Ich habe mich für den STM32F103 entschieden, weil ich dazu am meisten 
für mich verständliche Infos gefunden habe. Irgendwann schaue ich sicher 
auch die STM32F4 Serie an, aber so weit bin ich noch nicht.

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.