Forum: Mikrocontroller und Digitale Elektronik Stm32 Probleme unter Windows 10 mit USB/VCP


von Gerald L. (gerald_loh)


Lesenswert?

Hallo Forum,

ich habe Fragen zu denen ich im Internet und im STM Forum leider nicht 
fündig geworden bin.

Ich habe in der Vergangenheit mit Beispielen und viel Rat aus dem Web 
erfolgreich einen eigenen virtuellen Com Port für STM32LXX MD und HD 
Geräte erstellt. Dieser funktionierte in eigenen Applikationen unter XP, 
Win7, Win 8, Win 8.1 x32 und x86 ohne Probleme. Senden und empfangen, 
HotPlug, ordentliche Datenraten, es gab praktisch keine Probleme.

Windowsseitig konnte ich bislang die STM Treiber 1.3.1 bzw. 1.4.0 ebenso 
problemfrei verwenden.

Nun erfolgte kürzlich das Upgrade auf Windows 10...

Das resultierende Problem:

Unter Windows 10 funktioniert mein VCP für die STM32LXX-Geräte nicht 
mehr korrekt.

Etwas verwirrend ist, dass ich andere virtuelle Com Ports (z.B. aus der 
Basis von CP210 Geräten und AVR Controllern) auch weiterhin unter 
Windows 10 mit meiner Software problemfrei ansprechen kann.(Meine 
Windows Programme verwenden intern GetDefaultCommConfig, CreateFile, 
SetCommState, GetCommState, WaitForSingleObject... zur Verwaltung von 
COMs.)

Die STM Treiber lassen sich auch unter Windows 10 gut und fehlerfrei 
installieren, der Status-Kode lautet OK = 0x0. Angeschlossene Geräte 
werden sofort erkannt und ordnungsgemäß als COM-Gerät COMXX eingebunden. 
Alles sieht normal und gut aus.


Das resultierende Problem nun etwas genauer:

Ich kann vom PC auch unter Windows 10 Zeichen senden und empfange diese 
auf dem STM-Mikrokontroller.

A B E R, zurück gesendete Zeichen kommen aber nicht mehr am PC an. Kein 
Zeichen kommt zurück. Nur unter Windows 10 (x86).


Hat jemand von Ihnen ähnliche Erfahrungen gemacht?

Hat jemand von Ihnen je ein STM-CDC Beispiel unter Windows 10 zum Laufen 
gebracht?

Natürlich könnte z.B. eine geänderte Windows 10 Funktionalität schuld 
sein. (Ein Hinweis wäre, dass z.B. auch FTDI am 28.07.2015 neue Treiber 
heraus gebracht hat.) Klar, auch die eigene VCP-Software könnte ebenso 
irgendwo nicht Standard-Konform sein.

Kennt jemand STM-VCP Beispiele die unter Windows 10 laufen? Kennt jemand 
Hinweise was sich geändert haben könnte?

Vielen Dank für jede Information, die ich zu diesem Problem erhalten 
kann.


Gruß Gerald

von Peter (Gast)


Lesenswert?

Gerald L. schrieb:
> Kennt jemand STM-VCP Beispiele die unter Windows 10 laufen? Kennt jemand
> Hinweise was sich geändert haben könnte?

Das liegt nicht am VCP auf dem STM sondern an dem Treiber der 
wahrscheinlich einfach nicht für Windows 10 geeignet ist. Oder gibt ST 
den Treiber für Windows 10 frei?

Wenn man so die Infos zum Treiber liest, dann steht da nichts von 
Windows 10.

Last version
***************
       - V1.4.0 - 10/20/2014
Supported OS
***************

       + Windows 98SE, 2000, XP, Vista, Seven, 8.x (x86 & x64 Windows 
platforms)

Da würde ich mich nicht wundern, wenn das nicht geht.

von gerald_loh (Gast)


Lesenswert?

Ja das stimmt schon.

Aber sollten nicht alle Geräte welche unter Win8.1 laufen auch unter 
Win10 laufen? Ich denke ich hätte dies schon mehrfach so gelesen.

Zumindest sollte es funktionieren, wenn man die 
Kompatibilitätseinstellungen entsprechend setzt.

Ich wundere mich, dass so gar nichts im Web darüber zu finden ist.

Wenn der VCP auf der Basis von STM-CDC Beispielen generell unter Windows 
10 nicht laufen würde, müssten doch auch andere Probleme melden.

Kann jemand bestätigen ob sein "Virtueller Com Port" unter Win10 
funktioniert?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"Virtueller Com-Port" ist nicht gleich "Virtueller Com-Port".

Es gibt Geräte, die die USB-Standardgeräteklasse CDC verwenden, für die 
ist der Treiber Bestandteil von Windows, zur Installation wird lediglich 
eine *.inf-Datei benötigt. Es gibt aber auch Geräte, die ein komplett 
eigenes Protokoll verwenden und deswegen eigene Devicetreiber benötigen 
-- das ist bei den USB-Seriell-Bridges von FTDI, Prolific und auch 
SiLabs der Fall.

Der Name "STM-CDC" lässt vermuten, daß hier die Standardgeräteklasse 
verwendet wird, das sollte unter Windows 10 genauso funktionieren wie 
unter den Vorgängerversionen, es sei denn, dort wird explizit ein 
Treiber installiert (also ein Paket aus *.sys, *.inf und *.cat).

von harald (Gast)


Lesenswert?

bei mir ist es so das ich lustigerweise undter windows 10
2 cdc vcom geräte angezeigt bekommen.

ich frag mich was da nich stimmt und wann st einen win10 treiber 
rausbringt

von Gerald L. (gerald_loh)


Lesenswert?

Inzwischen habe ich folgendes herausbekommen. Windows 10 unterstützt nun 
z.B. erstmals automatisch CDC Devices, ohne dass man eine eigene Inf 
bräuchte.

Teilzitate von MSDN:

In Windows 10, a new INF, Usbser.inf, has been added to %Systemroot%\Inf 
that loads Usbser.sys as the function device object (FDO) in the device 
stack. If your device belongs to the Communications and CDC Control 
device class, Usbser.sys is loaded automatically. The driver is loaded 
based on a compatible ID match similar to other USB device class drivers 
included in Windows.

USB\Class_02, USB\Class_02&SubClass_02


•If you want to load Usbser.sys automatically, set the class code to 02 
and subclass code to 02 in the Device

Descriptor....

(Genau die sind bei mir implementiert. Lösche ich alle 
"STM-Treiberleichen-Infs" durch das Upgrade, bekomme ich auch sauber 
einen virtuellen Comport via neuem Standard-Windows-Treiber. Leider 
funktioniert dieser mit genau dem gleichen Fehlerbild...)

(Anmerkung/Erfahrung: Will man die alten Coms vollständig löschen, 
sollte man Administrativ ein "set devmgr_show_nonpresent_devices=1" 
absetzen und erst dann die ausgeblendeten Coms anzeigen/löschen.)


•If your device specifies class code 02 but a subclass code value other 
than 02, Usbser.sys does not load automatically. Pnp Manager tries to 
find a driver...

(Genau dies kann ich unter Windows 10 auch tun, ich bekomme dann eben 
wieder die STM-Treiber. Mit dem gleichen Fehlerbild...)


Bezüglich "Virtueller Com-Port" ist nicht gleich "Virtueller Com-Port": 
Ja, STM schiebt bislang Windows nur eine Inf unter, verwendet also die 
schon länger existierenden Standardgeräteklassen. Also eigentlich sollte 
es also immer noch funktionieren.

Ich vermute aber, dass sich etwas in Windows 10 an den 
"Standardgeräteklassen" geändert hat, die nun auch in beiden Fällen 
(Windows-Inf oder STM-Inf) gleichermaßen verwendet werden.

Das Microsoft da Fehler gemacht hat, halte ich erst einmal für eher 
unwahrscheinlich.

Die auf dem Controller implementierte Funktionalität wird irgendetwas 
nicht richtig tun, was sie standardmäßig aber besser tun sollte. Z.B. 
etwas nicht beantworten, was zumindest bislang auch noch nicht nötig 
war.

Es ist aber auch gut möglich, dass ich in der Vergangenheit etwas im 
ursprünglichen Beispiel geändert habe, was ich besser nicht ändern hätte 
sollen...


Bezüglich "Nun tauchen 2 auf", das kenne ich so noch nicht. Mir ist aber 
bekannt, das eine Geräteinstance gleich mehrere Endpoints zur 
schnelleren Kommunikation aufbauen könnte. Gut möglich das diese 2 
Comports wieder verschwinden und in einem Comport enden, wenn erst der 
richtige Treiber gefunden und installiert ist.


Gibt es weitere positive oder negative "STM"-"CDC"-"Windows 10" 
Erfahrungen ?

von Gerald L. (gerald_loh)


Lesenswert?

Ich habe das Problem vorerst gelöst.

Unter Windows 10 (und nur unter Windows 10) schlägt bei mir PC-seitig 
die Microsoft-Funktion ReadFile fehl, sie liefert permanent den 
"GetLastWin32Error" "ErrorIOPending".

Tatsächlich funktioniert diese Funktion, bis auf diese Fehlermeldung.

Die Zeichen, welche man laut ClearCommError/ComStat.InQue (d.h. der 
ReadCount) lesen darf, werden trotz Fehlermeldung dennoch erfolgreich in 
den Buffer übertragen.

Wenn ich die Fehlermeldung ignoriere, kann ich wieder via VCP 
kommunizieren.

Verwendet man die Klasse SerialPort (.NET System.IO.Ports), scheint die 
Kommunikation auch zu klappen. (Dies habe ich nur mit ein paar Bytes 
getestet).

Von dieser Klasse hatte ich in der Vergangenheit abgesehen, da diese bei 
gleicher Funktionalität deutlich mehr Rechnerlast als die 
"Filesystemlösung" generierte.

Ob der Fehler nun den "Standardgeräteklassen" oder "meiner 
Controllerfunktionalität" zuzuschreiben ist, wird wohl die Zukunft 
zeigen...

von Gerd E. (robberknight)


Lesenswert?

gerald_loh schrieb:
> Ich wundere mich, dass so gar nichts im Web darüber zu finden ist.
>
> Wenn der VCP auf der Basis von STM-CDC Beispielen generell unter Windows
> 10 nicht laufen würde, müssten doch auch andere Probleme melden.

die anderen sind halt klug genug das Windows 10 erst in etwa nem Jahr zu 
installieren, dann sind die gröbsten Bugs gefixt (von Microsoft und 
Fremdherstellern) und es lassen sich genug Anleitungen finden wie man 
die restlichen umschiffen kann.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hallo Gerald,
vielen Dank für Deine Informationen.
Bis jetzt habe ich von meinen Kunden noch keine negativen Rückmeldungen 
bezüglich des STM32 VCP unter Win10, aber es ist gut zu wissen, dass da 
ggf. was im Busch ist.

Frage: hast Du Tests mit bekannten Terminalprogrammen gemacht? ich denke 
da so an Hyperterm, TeraTerm, HTerm?

Grüße,
 marcus

von gerald_loh (Gast)


Lesenswert?

Hallo Marcus,

RealTerm und HTerm antworten korrekt. Andere habe ich nicht getestet...

von Reinhard W. (rwsoft)


Lesenswert?

Hallo Gerald,

ich denke ich habe das gleiche Problem. Ich möchte unter Windows 10 
(64bit) für die STM32F407 einen COM-Port einrichten. Ziel ist es einige 
Beispiele von Matlab/Simulink zu testen. Gibt es inzwischen hierfür eine 
Lösung bzw. einen workaround.

Vielen Dank schon an dieser Stelle.
Reinhard

von Gerald Loh (Gast)


Lesenswert?

Hallo Reinhard,

mit Matlab/Simulink kenne ich mich leider nicht aus. Wenn diese
PC-seitig scheitern hilft vermutlich nur einen CP210 oder einen
anderen funktionierenden USB/Serial Konverter vor den STM zu hängen
und dann rein seriell zu kommunizieren.

Mit dem STM32F407 habe ich mich auch noch nicht beschäftigt, eher mit 
der
STM32LXX Familie.

Der ComPort seitens STM war aber auch nicht mein Problem, vielmehr
die geänderte Funktionalität in Win10 gegenüber den vorhergehenden
Windows-Versionen.

Wenn Dein ComPort z.B. unter Win8 mit Matlab/Simulink läuft, hilft es
nur auf eine entsprechende Win10 Unterstützung zu warten, oder auf
die Lösung "funktionierender USB/Serial Konverter"+"seriell 
kommunizieren"
umzusteigen...

von W.S. (Gast)


Lesenswert?

Gerald L. schrieb:
> A B E R, zurück gesendete Zeichen kommen aber nicht mehr am PC an. Kein
> Zeichen kommt zurück. Nur unter Windows 10 (x86).

Kann es sein, daß dein µC-seitiger Treiber die Probleme macht und die 
Daten zwar an selbigen abgegeben werden, aber nicht gesendet werden? Da 
hättest du (vermutlich) nen logischen Bug, der bloß bisher nicht zum 
Tragen gekommen ist.

Also: WIE sendest du denn nun ganz genau deine Daten zum PC? Immerhin 
kommen die ja völlig asynchron von allen Teilen deiner sonstigen 
Firmware, müssen dann im CDC-Treiber zwischengespeichert werden, dann 
gepackt, dann zum Senden bereitgestellt werden.

Nochwas: warum benutzt du überhaupt einen Treiber von ST auf der PC 
Seite? Ich hab ja schon diverse µC von Nuvoton, NXP, ST per CDC an den 
PC angeschlossen und benutze immer nur ein und dieselbe .inf (natürlich 
dazu passend die Deskriptoren im µC).

W.S.

von Gerald Loh (Gast)


Lesenswert?

Hallo W.S.

1. nein, Controller-seitig habe ich sehr wohl korrekt gesendet, nur
die Win32-API Microsoft-Funktion ReadFile schlug unter Win10 in so
fern fehl, dass diese zusätzlich zum korrekten Ergebnis
den "GetLastWin32Error" "ErrorIOPending" lieferte.

Vorhergehende Windows-Versionen taten dies bei gleicher Controller
Firmware nicht.

Gründlich wie ich war (und wie man es wohl auch tun sollte), hatte ich
den Fehler ausgewertet und damit die gleichzeitig korrekt
empfangenen Daten PC-seitig wieder verworfen. Für mich sah das dann
in erster Instanz so aus, als würden die Zeichen gar nicht gesendet.

Tatsächlich wurden diese aber gesendet und "inclusive Fehlermeldung"
auch empfangen.

2. Ja, viele schieben Windows nur eine Inf unter, verwenden damit
also die schon länger existierenden Standardgeräteklassen mit
passenden Deskriptoren. Auch wenn man den Treiber von ST installiert,
passiert offenbar nichts anderes.

Warum kann ich bei gleicher Controller und Windows-Software unter
WinXP, Vista, 7, 8, 8.1 x32 und x86 ohne einen "ErrorIOPending"
empfangen und unter Win10 bekomme ich einen "ErrorIOPending"?

=> Variante 1: Die Controller Firmware ist fehlerhaft.

=> Variante 2: Es hat sich seit Win10 an der "CDC Standardgeräteklasse"
   etwas geändert.

Variante 1 ist gut möglich, bislang hat Windows z.B. bestimmte
Timing-Fehler einfach ohne Fehlermeldung toleriert.

Variante 2 ist in jedem Fall richtig, sonst würde es ja unter Win10
auch keine Fehlermeldungen geben.

Vielleicht ist Variante 2 fehlerhaft, vielleicht wurde Variante 2
auch korrekt eingeführt, um Fehler die bislang toleriert werden konnten,
zukünftig etwas einzugrenzen...

von Stimmy (Gast)


Lesenswert?

Gibt's inzwischen eine Lösung für das Problem? Bei Google ist ja nicht 
wirklich viel dazu zu finden.

Bin gerade dabei, mich mit dem STM32F103 vertraut zu machen, und bin auf 
genau das beschriebene Problem mit mehreren VCP-Beispielen gestoßen.

Unter Windows XP/Server 2003 läuft der VCP einwandfrei. Unter Windows 10 
hakt es auch bei mir:
Bei einem meiner Testprogramme schlägt gleich der CreateFile-Aufruf fehl 
und gibt INVALID_HANDLE_VALUE zurück.
Bei einem alten Visual Basic 6 Programm mit dem Comm-Steuerelement lässt 
sich der Port öffnen, aber sobald Daten ankommen und gelesen werden 
sollen gibt's einen Fehler.
Mit PuTTY lässt sich der Port fehlerfrei zugreifen.

Anscheinend hängt's also auch von den verwendeten APIs ab.

Das Problem habe ich sowohl mit dem USB-CDC-Beispiel aus STM32Cube, als 
auch mit älteren USB-VCP-Beispielen.

von Stimmy (Gast)


Lesenswert?

So, ich bin der Sache nochmal ein bisschen nachgegangen:
Es liegt definitiv an dem usbser.sys-Treiber von Windows 10.

Ich habe kurzerhand die usbser.sys von Windows 7 x64 genommen, mit einem 
selbst erstellten Zertifikat signiert (ohne das akzeptiert Win10 sie 
nicht), und die originale usbser.sys von Win10 in System32\drivers und 
System32\DriverStore\FileRepository\usbser.inf_... durch diese Datei 
ersetzt.
Dann den COM-Port im Geräte-Manager deinstalliert, das Gerät neu 
angeschlossen, und es läuft :)

Ich persönlich kann mit dieser Lösung leben, für den kommerziellen 
Einsatz taugt sie aber definitiv nicht.

von Arc N. (arc)


Lesenswert?

Stimmy schrieb:
> So, ich bin der Sache nochmal ein bisschen nachgegangen:
> Es liegt definitiv an dem usbser.sys-Treiber von Windows 10.
>
> Ich habe kurzerhand die usbser.sys von Windows 7 x64 genommen, mit einem
> selbst erstellten Zertifikat signiert (ohne das akzeptiert Win10 sie
> nicht), und die originale usbser.sys von Win10 in System32\drivers und
> System32\DriverStore\FileRepository\usbser.inf_... durch diese Datei
> ersetzt.
> Dann den COM-Port im Geräte-Manager deinstalliert, das Gerät neu
> angeschlossen, und es läuft :)
>
> Ich persönlich kann mit dieser Lösung leben, für den kommerziellen
> Einsatz taugt sie aber definitiv nicht.

Wurde mal getestet, ob es am Selective Suspend liegt?
Einstellungen (entweder über Registry am PC oder erweiterte Deskriptoren 
auf dem Gerät), siehe:
https://msdn.microsoft.com/en-us/library/windows/hardware/dn707976(v=vs.85).aspx
Auch wenn es laut MS im Default nicht aktiviert ist...

von STM32 Experte (Gast)


Lesenswert?

Wenn Ihr das neuest Update 1607 für Windows 10 einspielt, hat sich 
dieses Problem automatisch behoben. Anscheinend hat man bei Microsoft 
endlich reagiert und die usbser.sys auf den "alten" Stand vor Windows 10 
zurückgebracht.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?


von Joe (Gast)


Lesenswert?

Ich habe die SUBCLASS im Programm für den STM32F4 auf 0x02 geändert 
damit Windows 10 das Board/den VCP automtisch erkennen kann.
Ältere ST VCP Treiber habe ich versucht zu deinstllieren, zumindest 
alles was ich finden konnte.

Wenn ich das Board jetzt mit dem Computer verbinde tauchen 2 Geräte im 
Geräte-Manager auf.

Einmal unter "Anschlüsse (COM & LPT)" ein "Serielles USB-Gerät (COM3)" 
und unter "Andere Geräte" ein "STM32 Virtual ComPort in FS Mode"

Beide funtionieren aber nicht / haben das gelbe 
Ausrufezeichen/Warnschild am Symbol im Geräte-Manager.


Unter Windows 7  mit dem ST Treiber taucht der VCP unter "Anschlüsse 
(COM & LPT)" als "STMicroelectronics Virtual COM Port (COM18)" auf, und 
funktioniert auch Problemlos.

Ich würde das nur gerne unter Windos 10 ohne extra Treiber zum laufen 
bringen, und es scheint ja bei einigen hier auch zu funktionieren.

Hat jemand evtl. eine Idee was bei mir da schief läuft?

von branadic (Gast)


Lesenswert?

Ich renne gerade ebenfalls in dieses Problematik. Ein STM32-Gerät das 
unter Windows 7 via VCOM läuft bekommt keine Verbindung unter Windows 
10. Drauf gestoßen bin ich, nachdem ich via hterm:
"Error in OpenPort: Internal error when initializing 'COMx'" als Meldung 
nach Klick auf "Connect" erhielt.
Ich hatte mir die VCP_V1.4.0_Setup.exe von der ST Website gezogen 
(schlimm das man sich da jetzt auch schon registrieren muss), aber ich 
bekomme, egal aus welchem Programm heraus, keine Verbindung.
Hat hier jemand eine Lösung, die verständlich und nachvollziehbar ist?

von branadic (Gast)


Lesenswert?

Hat niemand anderes das Problem und keiner eine Lösung finden können?

von branadic (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

inzwischen habe ich eine funktionierende Lösung.
Ich habe eine ältere Treiberversion bekommen, da die aktuelle von der 
STM Website (1.4.0.0 vom 20.10.2014) unter Windows 10 64bit nicht 
funktioniert.

Diese ältere Version enthält einen Windows 7 Treiber 64bit (1.3.1.0 vom 
25.04.2010) und einen Windows 8 Treiber 64bit (1.4.0.0 vom 02.08.2013). 
Beide Treiber laufen unter Windows 10 bisher problemlos. Die Boards 
werden erkannt und ich empfange wie erwartet meine Daten.
Damit auch anderen geholfen ist hänge ich diese Treiberversionen mal an, 
in der Hoffnung das auch andere, die hier auf Probleme stoßen einen 
Lösungsansatz haben.

branadic

von Mark R. (stevestrong)


Lesenswert?

branadic,
vielen Dank, Du hast mir sehr geholfen, es funktioniert tadellos!

: Bearbeitet durch User
von branadic (Gast)


Lesenswert?

Nach dem großen Creators Update laufe ich erneut in das Problem, nur das 
diesmal kein Treiber mehr funktioniert. Hat jemand das gleiche Problem 
und kann evenuell mit einer Lösung aufwarten?
Ich bekomme von HTerm die Rückmeldung:

Error in OpenPort: Internal error when initializing 'COM3

Meine Versuche mich via Matlab oder Octave mit dem Gerät zu verbinden 
scheitern ebenfalls.

Matlab: Error using serial/fopen (line 72)
Open failed: Cannot connect to the COM3 port. Possible reasons are 
another
application is connected to the port or the port does not exist.

Octave: Error opening the interface: Zugriff verweigert

Der Geräte Manager zeigt das Gerät jedoch korrekt an.

-branadic-

von Mark R. (stevestrong)


Lesenswert?

Treiber im Geräte Manager deinstallieren und neu installieren schon 
versucht?
Ansonnsten hilft vielleicht das hier: 
http://www.dronetrest.com/t/zadig-drivers-for-cleanflight-betaflight-stm32-flight-controllers-dfu-mode/2719

von branadic (Gast)


Lesenswert?

Mark R. schrieb:
> Treiber im Geräte Manager deinstallieren und neu installieren schon
> versucht?

Ja klar, das Problem existiert ausschließlich auf win 10 Rechnern, unter 
win7 habe ich dagegen keine Probleme dieser Art.

von branadic (Gast)


Lesenswert?

Ich habe mich auch an ST gewandt und denen mein Problem geschildert. 
Bisherige Antwort sinngemäß:

Wir benutzen Windows 7 im Büro, wir sind uns daher nicht sicher ob wir 
ihnen helfen können. Auf meinem privaten Windows 10 PC ohne Creators 
Update läuft der VCP. Sie müssen nicht einmal den ST VCP Treiber 
installieren, der generische Windows Treiber reicht aus.

Hab den ST Treiber also deinstalliert und den generischen Treiber 
versucht, aber auch das funktioniert als Lösung nicht. :(

von Mark R. (stevestrong)


Lesenswert?

Ich kann mich noch daran erinnern, ich hatte mal ein ähnliches Problem. 
Das hatte als Ursache ein zu spätes Aufruf der Serial.begin() Funktion 
in setup().
Ich hab dadurch gelöst hab, dass der Serial.bgin() als erster Befehl im 
Arduino sketch setup() Funktion ausgeführt wurde.

von Markus (Gast)


Lesenswert?

STM32GENERIC
Bei mir laufen alle Boards ( versch. NUCLEOS, DISCOVERYS ) problemlos 
unter Win 10.
Was oefters ein Problem bei den Boards mit Stlink war: man muss mit dem 
STMutility  updaten !

von W.S. (Gast)


Lesenswert?

branadic schrieb:
> Ich renne gerade ebenfalls in dieses Problematik. Ein STM32-Gerät das
> unter Windows 7 via VCOM läuft bekommt keine Verbindung unter Windows
> 10.

Hmm.. ich vermute mal, daß das ein Problem mit den Treibern von ST ist, 
was genau dadurch aufkommt, daß du und andere schön brav die 
USB-Funktionen von ST benutzt und auch die Deskriptoren so sind, daß 
eben bloß ein Treiber von ST in Frage kommt.

Ich hab das anders gemacht, ich benutze das magere .inf File von 
Nuvoton, was nix anderes tut, als die zum jeweiligen Windows gehörigen 
Treiber mit der vorhandenen vid+pid verbindet - und habe die 
Deskriptoren entsprechend angepaßt. So laufen bei mir µC von Nuvoton, 
NXP und ST alle unter der gleichen Flagge und es wird eben KEIN Treiber 
von irgendeinem Hersteller gebraucht.

Ich hatte den ganzen Kram hier schon mal gepostet. Ich vermute sehr 
stark, daß in den Quellen von ST einfach das Nachschauen nach Daten, die 
an den Host gehen sollen, im Usb-Timertick fehlt. So schläft dann die 
ganze Kommunikation nach dem allerersten Paket ein.

W.S.

von Felix U. (ubfx)


Lesenswert?

So, nachdem ich heute für ein Uniprojekt mal wieder ein USB CDC Device 
brauchte und die Standard USB Konfiguration die CubeMX generiert das 
Gerät zwar im Device Manager auftauchen lässt, allerdings mit "Code 10" 
als fehlerhaft anzeigt, durfte ich mich mal wieder damit rumschlagen.

Ich arbeite mit einem STM32F4 Discovery und benutze das OTG_HS_USB 
Peripheral mit onboard FS Phy und der CDC Device Middleware.

Ich wusste zwar noch, dass ich genau dieses Problem vor einem Jahr oder 
so schon einmal gedebuggt habe, allerdings kam ich einfach nicht mehr 
darauf, was ich damals geändert hatte. Also mal wieder ein paar Stunden 
Microsoft Message Analyzer + Debugger ausgepackt.

Das Problem mit dem Code, den CubeMX generiert ist, dass er in der 
Device Enumeration ein größeres malloc hat, und zwar in
1
static uint8_t  USBD_CDC_Init (USBD_HandleTypeDef *pdev, 
2
                               uint8_t cfgidx)
3
[...]
4
  pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef));
5
[...]

Wenn man also die Heapsize auf 0x2000 oder so setzt, dann funktioniert 
es.
Ich hoffe mal, dieser Post erspart mir das dritte mal Debuggen in einem 
weiteren Jahr.

: Bearbeitet durch User
von Felix U. (ubfx)


Lesenswert?

Und wo wir gerade dabei sind: Wenn man nicht nur will, dass das Device 
korrekt enumeriert, sondern man es dann auch noch mit Terminalprogrammen 
korrekt öffnen kann, sollte man in der usbd_cdc_if.c das hier einfügen:
1
static int8_t CDC_Control_HS  (uint8_t cmd, uint8_t* pbuf, uint16_t length)
2
{
3
[...]
4
  case CDC_GET_LINE_CODING:  
5
// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
6
  pbuf[0] = pbuf[3] = pbuf[4] = pbuf[5] = 0;
7
  pbuf[1] = 0xc2;
8
  pbuf[2] = 0x01;
9
  pbuf[6] = 0x08;
10
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
11
    break;
12
[...]

Das sind irgendwelche Konstanten für Baudrate und was weiß ich, kann man 
sich genauer anschauen wenn man es braucht. Aber damit funktioniert das 
USB dann wenigstens "out of the box" an Win10

von W.S. (Gast)


Lesenswert?

Felix U. schrieb:
> Das sind irgendwelche Konstanten für Baudrate und was weiß ich,..

Eben, du weißt es NICHT.
Es gibt Setup-Pakete für unterschiedliche Instanzen innerhalb des 
Devicetreibers im µC. Darunter eben auch solche, wo Baudrate, Parität, 
Stopbits usw. übermittelt werden. Anstatt da irgendwelche Konstanten 
hinzuschreiben, wäre das korrekte Ausweren des Setup-Paketes anzuraten.

W.S.

von sinus123 (Gast)


Lesenswert?

Unter Windows 7 Embedded läuft der VCP Treiber auch nicht, das ist schon 
etwas schwach von ST. Genau da könnte man die Anwendung in der Praxis ja 
brauchen, warum das nur auf Desktop-Betriebssystemen läuft ist mir ein 
Rätsel.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Felix U. schrieb:
> Das sind irgendwelche Konstanten für Baudrate und was weiß ich, kann man
> sich genauer anschauen wenn man es braucht. Aber damit funktioniert das
> USB dann wenigstens "out of the box" an Win10

Gut zu wissen, Vielen Dank!

von Stefan F. (Gast)


Lesenswert?

Der CDC Treiber von ST ist nur eine Konfigurationsdatei mit 
Installationsprogramm. Als Treiber wird eine DLL von Windows benutzt, 
die als bereits vorhanden vorausgesetzt wird.

Was mir nicht in den Kopf geht: Warum stellen die nicht einfach nur die 
INF Datei zum Download bereit?

Stattdessen verpacken sie das mehrfach in selbst extrahierende EXE 
Dateien und ZIP Dateien mit einem vollkommen überflüssigen 
Installationsprogramm. Als ob sie verbergen wollten, welch simple 
Technik in Wahrheit dahinter steckt.

Um noch einen drauf zu setzen, schreiben Sie dann noch einen 
Lizenz-Dokument, bei dem ich auch nach 10x lesen nicht herausfinden 
konnte, ob ich diesen Pseudo-Treiber nun in kommerziellen Produkten 
benutzen darf oder nicht.

von Jim M. (turboj)


Lesenswert?

Stefan U. schrieb:
> Was mir nicht in den Kopf geht: Warum stellen die nicht einfach nur die
> INF Datei zum Download bereit?

Weil sie alleine nix nützt. Ab Windows 8.1 muss auch die .inf signiert 
sein.

Schau Dir lieber mal das neueste Zadig (http://zadig.akeo.ie/) an, 
dessen neueste 2.3 Version kann auch den CDC Treiber installieren.

von Martin B. (ratazong)


Lesenswert?

Felix U. schrieb:
> Und wo wir gerade dabei sind: Wenn man nicht nur will, dass das Device
> korrekt enumeriert, sondern man es dann auch noch mit Terminalprogrammen
> korrekt öffnen kann, sollte man in der usbd_cdc_if.c das hier einfügen:
>
>
1
> static int8_t CDC_Control_HS  (uint8_t cmd, uint8_t* pbuf, uint16_t 
2
> length)
3
> {
4
> [...]
5
>   case CDC_GET_LINE_CODING:
6
> // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
7
>   pbuf[0] = pbuf[3] = pbuf[4] = pbuf[5] = 0;
8
>   pbuf[1] = 0xc2;
9
>   pbuf[2] = 0x01;
10
>   pbuf[6] = 0x08;
11
> // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
12
>     break;
13
> [...]
14
>
>
> Das sind irgendwelche Konstanten für Baudrate und was weiß ich, kann man
> sich genauer anschauen wenn man es braucht. Aber damit funktioniert das
> USB dann wenigstens "out of the box" an Win10

Ist ja schon ein alter Thread, aber.

Danke noch einmal für diesen Hinweis. Hat bei mir funktioniert. Vorher 
konnte ich den Port nicht öffnen mit Win10 professionell 64 bit. Auf dem 
alten win10 (home) rechner gab es das Problem nicht.
Wenn man an dieser Stelle keine Werte definiert, bekommt der PC 
irgendwelche undefinierten Werte für das line setting. Das scheint 
neuere Win10 Rechner zu stören.
Ich übernehme Deinen Default Wert (115200,N,8,1) beim Start des 
Programms und ändere die 7 bytes, falls der PC in SET_LINE_CODING andere 
Werte verlangt. Klappt immer.

Danke nochmal

von Leander P. (resistor1)


Lesenswert?

Der Thread ist zwar ziemlich alt, ich hatte aber auf einem STM32F105VC 
das gleiche Problem und konnte es mit den hier genannten Methoden leider 
nicht lösen.

Ich verwende die STM32CubeIDE, habe in dem CubeMX auch das Projekt 
konfiguriert (USB-Stack als USB-Device und Funktion als COM-Port).

In meinem Fall konnte ich das Problem lösen, indem ich in der Funktion 
"int main()" in "main.c" vor dem Aufruf von "MX_USB_DEVICE_Init()" ein 
Delay von 2 Sekunden eingebaut habe. Danach hat Windows das Gerät 
einwandfrei erkannt. Der Controller braucht etwas Zeit für die 
Initialisierung.

Außerdem MUSS das USB Kabel zum Controller VOR dem Start des Controllers 
verbunden werden (also der Controller darf nicht schon Initialisieren 
wenn er nicht über ein USB Kabel verbunden ist). Eine Mögliche Lösung 
für dieses Problem ist eine bedingte USB Initialisierung, also 
"MX_USB_DEVICE_Init()" erst aufrufen wenn tatsächlich ein USB Kabel in 
STM32 und Rechner eingesteckt ist.

Da meine Platine keine Ausführung für den VBUS Pin hat, kann ich nicht 
testen ob unter dieser Option eine Verbindung auch im Betrieb möglich 
ist. Ansonsten könnte aber auch ein Spannungsteiler von VUSB auf einen 
Input gelegt werden und ausgehend von dem anliegenden Signal wird die 
USB Funktion initialisiert.

von Stefan F. (Gast)


Lesenswert?

Leander P. schrieb:
> ein Delay von 2 Sekunden

> Außerdem MUSS das USB Kabel zum Controller VOR
> dem Start des Controllers verbunden werden

Beides sollte eigentlich nicht nötig sein. Ich frage mich, ob die HAL 
(mal wieder) fehlerhaft ist.

von Martin B. (ratazong)


Lesenswert?

Hallo,

ich hatte auch Probleme mit Win10 und hatte festgestellt, dass beim 
Enumerieren am Bus direkt die Baudrate vom PC gelesen wird. (Da steht 
bei den generierten Sourcen von CubeMX undefinierter Mist drin.) Dann 
wird auf ein default gesetzt und dann wird noch einmal gelesen.
Das passiert wie gesagt beim Enumerieren automatisch ohne dass ich die 
serielle Schnittstelle öffne.
Das führt dann bei Win10 zu einem enumerations fail.

Ich habe nur entsprechenden code für set_linecoding und getlinecoding 
eingefügt und schon gab es keine Probleme.
Die HAL hat keinen Fehler, aber der generierte CubeMX ist unvollständig.

meine codestücke
1
/* USER CODE BEGIN PRIVATE_VARIABLES */
2
unsigned char myLineCoding[7] = {0x0,0xc2,0x1,0,0,0,8}; //115200 bps,n,8,1
3
4
/* USER CODE END PRIVATE_VARIABLES */   
5
.... 
6
      case CDC_SET_LINE_CODING:
7
      datarate = (unsigned)pbuf[0] |((unsigned)pbuf[1]<<8)|((unsigned)pbuf[2]<<16)|((unsigned)pbuf[3]<<24);
8
      for(i=0;i<7;i++) myLineCoding[i]=pbuf[i];
9
#if USE_ESP32
10
      LL_USART_SetBaudRate(USART3, HAL_RCC_GetSysClockFreq() , LL_USART_PRESCALER_DIV1,
11
                                                LL_USART_OVERSAMPLING_16,
12
                                                datarate);
13
#endif
14
15
    break;
16
17
    case CDC_GET_LINE_CODING:
18
      for(i=0;i<7;i++) pbuf[i] = myLineCoding[i];
19
      break;

von Leander P. (resistor1)


Lesenswert?

Martin B. schrieb:
> Ich habe nur entsprechenden code für set_linecoding und getlinecoding
> eingefügt und schon gab es keine Probleme.

Hab deinen Code bei mir eingesetzt, allerdings taucht der 
Enumerations-Fehler bei mir immer noch auf.

Ich denke ich werde bei dem Delay bleiben oder einen Workaround für die 
Verbindung im Betrieb schreiben (Bedingte Initialisierung). Trotzdem 
Danke für den Hinweis.

Ich werde nochmal ein Update geben wenn ich auf anderen MCUs der STM32F1 
Reihe getestet habe.

von Martin B. (ratazong)


Lesenswert?

Ich habe hier noch einmal probiert das USB-Kabel erst später nach dem 
Powerup zu connecten. Klappte ohne Probleme auch mehrfach 
hintereinander. Die USB statemachine macht das problemlos mit.
Habe allerdings auch keine F1 Serie, sondern STM32G474 am Start.

Kann es sein, dass Du während der Enumeration eine starke Interruptlast 
hast? Da habe ich mal Probleme mit dem USB Stack von STM gesehen.
Eventuell musst Du die Priority vom USB IRQ mal höher als den Rest der 
IRQs setzen, um das zu testen.

von Stefan F. (Gast)


Lesenswert?

Ich hatte auf dem STM32F103 kein solches Problem.
Details zum Setup: http://stefanfrings.de/stm32/stm32f1.html#vcphal

von Leander P. (resistor1)


Lesenswert?

Martin B. schrieb:
> Eventuell musst Du die Priority vom USB IRQ mal höher als den Rest der
> IRQs setzen, um das zu testen.

Grade eben getestet, hat sich wieder nix getan.

Im reference manual (RM0008) für die STM32F Reihe (bis auf F4xx) wird im 
Unterpunkt "USB Device Configuration (29.17.3)" die Verwendung des VBUS 
Sensing Pins vorgeschrieben. Dadurch erkennt das STM32 dann das ein 
Kabel angeschlossen ist...

Bei anderen Reihen kann das wohl intern zugeschaltet werden.

Ich werde das jetzt mal auf meinem Evalboard testen, auf der Platine auf 
welcher das deployed werden soll ist dieser Pin aber schon belegt (heißt 
ich MUSS bedingt initialisieren wenn ein Kabel angeschlossen ist). Da 
ich noch keine TVS Diode hier hab muss ich mir aus dem was verfügbar ist 
etwas basteln. Ich gebe ein Update wenn sich dann was tut.

von Leander P. (resistor1)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich hatte auf dem STM32F103 kein solches Problem.
> Details zum Setup: http://stefanfrings.de/stm32/stm32f1.html#vcphal

Jop genau dieses Setup habe ich verfolgt aber die USB OTG Peripherie vom 
F105/107 scheint anders zu sein als die "simple" USB Peripherie des 
F103.

von Leander P. (resistor1)


Lesenswert?

Leander P. schrieb:
> Martin B. schrieb:
>> Eventuell musst Du die Priority vom USB IRQ mal höher als den Rest der
>> IRQs setzen, um das zu testen.
>
> Grade eben getestet, hat sich wieder nix getan.
>
> Im reference manual (RM0008) für die STM32F Reihe (bis auf F4xx) wird im
> Unterpunkt "USB Device Configuration (29.17.3)" die Verwendung des VBUS
> Sensing Pins vorgeschrieben. Dadurch erkennt das STM32 dann das ein
> Kabel angeschlossen ist...
>
> Bei anderen Reihen kann das wohl intern zugeschaltet werden.
>
> Ich werde das jetzt mal auf meinem Evalboard testen, auf der Platine auf
> welcher das deployed werden soll ist dieser Pin aber schon belegt (heißt
> ich MUSS bedingt initialisieren wenn ein Kabel angeschlossen ist). Da
> ich noch keine TVS Diode hier hab muss ich mir aus dem was verfügbar ist
> etwas basteln. Ich gebe ein Update wenn sich dann was tut.

Das Update kommt ein wenig spät, allerdings hatte ich auf einem 
STM32F103 "BluePill" Board keinerlei Probleme mit USB Hotplugging. Als 
ich letztlich die finale Platine zum Testen erhalten habe (mit STM32F105 
drauf) hat letztlich auch alles funktioniert. Dort ist USB Hotplugging 
möglich.
Auf dem billigen EvalBoard, auf welchem ich ursprünglich getestet habe, 
scheint wohl etwas nicht zu stimmen.

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.