Forum: Mikrocontroller und Digitale Elektronik STM32F4 Discovery: USB CDC (serielle Schnittstelle) arbeitet!


von K.Schaefer (Gast)


Lesenswert?

Hallo liebe Cortex-M4-Fans,

Mir ist es nach einiger "Forschung" gelungen,
die USB Schnittstelle als CDC Device (USB-Seriell-Profil)
zum Laufen zu bringen.

Somit kann man auf dem STM32F4 Discovery Board die USB
Schnittstelle für Debug-Ausgaben einsetzen.
Allerdings benötigt mein Treiber FreeRTOS.

Meine Doku ist hier:
http://schaefer.eit.h-da.de/ARM/CORTEX_M4/STM32F4_Discovery/

Und so gehts:

CMSIS übersetzen mit folgenden Präprozessor-Definitionen:
#define USE_USB_OTG_FS
#define USE_DEVICE_MODE
#define USE_STDPERIPH_DRIVER
#define HSE_VALUE=8000000
#define ARM_MATH_CM4
#define USE_FULL_ASSERT

Unnötige Module (USB_HOST und andere USB-Profile)
nicht mit übersetzen, sonst hagelt's Fehler.

Das Interface der CDC-Quelltexte in CMSIS ist leider
auch etwas fehlerhaft. Ich musste daher ein paar Patches
vornehmen, siehe usbd_cdc_core.c und usbd_cdc_if_template.c

Das API findet sich in USB_virtual_com.c/.h
Als I/O-Schnittstelle dienen die Routinen
USB_DataRx(...) und Get_USB_TX_Data(...)

Mit einem kleinen Ringpuffer für 'rein und 'raus kann
man sicher auch printf/scanf über diesen Port spielen.
Am einfachsten geht's sicher mit FreeRTOS.

Gut hack !
Klaus Schaefer

von Fabian G. (kjion) Benutzerseite


Lesenswert?

Hallo Klaus,

ich würde mir das Projekt gerne mal anschauen, da USB CDC bei mir auch 
demnächst auf der TODO-Liste steht.

Gibt es den Code dazu irgendwo zum herunterladen? Ich habe jetzt nur den 
inline Quelltext aus der Doxygen-Doku gefunden.

Grüße Fabian

von Tom (Gast)


Lesenswert?

Ja, der Code würde mich auch interessieren.... Klingt spannend!

von Klaus Schaefer (Gast)


Lesenswert?


von hp-freund (Gast)


Lesenswert?

Hm, deine summon Toolchain basiert auf gcc. Aber ich kann kein Makefile 
finden. Wie wird das Projekt compiliert?

von Klaus Schaefer (Gast)


Lesenswert?

Hallo,

Ich arbeite mit Eclipse und GCC.
Da werden die makefiles automatisch erzeugt.
Das Projekt ist nicht ganz trivial, weil man
für die CMSIS Library ein paar spezielle
Einstellungen benötigt:
#define USE_USB_OTG_FS
#define USE_DEVICE_MODE
#define USE_STDPERIPH_DRIVER
#define HSE_VALUE
#define ARM_MATH_CM4
#define FPU_PRESENT
#define USE_FULL_ASSERT

Es gibt leider im CMSIS fehlerhafte Dateien.
Die sollte man nicht mit übersetzen, sonst
hagelt's Fehler.

Gruß
K.Schaefer

von Martin P. (Gast)


Lesenswert?

Für alle, die es interessiert:

Über Google bin ich auf folgende lauffähige Version einer usb-cdc 
Schnittstelle gestoßen:

https://www.das-labor.org/svn/microcontroller/src-stm32f4xx/serialUSB

ein Makefile und ein README sind dabei (klappte bei mir auf Anhieb)
Grüße

Martin

von chris (Gast)


Lesenswert?

>Über Google bin ich auf folgende lauffähige Version einer usb-cdc
>Schnittstelle gestoßen:
Sieht gut aus. Kann mir jemand sagen, wie ich das Verzeichnis mit Linux 
ziehe, ohne dass ich jedes File einzeln kopieren muss?

von Michael G. (let)


Angehängte Dateien:

Lesenswert?

1
svn co https://www.das-labor.org/svn/microcontroller/src-stm32f4xx/serialUSB

Der Code braucht aber noch die Discovery Firmware:

http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f4discovery_fw.zip

Davon wird u. a. die libSTM32F4xx_StdPeriph_Driver.a benötigt die erst 
noch gebaut werden muß. Ich habe die Bibliothek auf Verdacht mal 
angehängt.

Getestet habe ich den Code bzw. die Library aber noch nicht.

von chris (Gast)


Lesenswert?


von uli (Gast)


Lesenswert?

der Neugier halber:

braucht es da eigentlich PC-seitig (XP / Win7/64bit) noch irgendwelche 
Treiber um diese CDC als COM nutzbar zu haben ?

merci

(und frohe Ostern auch)

von Martin M. (capiman)


Lesenswert?

Windows bringt schon einen Treiber mit (usbser.sys),
man benötigt aber noch ein INF-File, in dem auch die VID + PID
deines Gerätes eingetragen ist. Ein Beispiel siehe hier
(wobei ich aber das Beispiel-INF-File, dass auf der Seite genannt ist,
nicht selbst probiert habe):

http://www.keil.com/forum/16493/

von Martin M. (capiman)


Lesenswert?

Weiß jemand, ob das Programm von

https://www.das-labor.org/svn/microcontroller/src-stm32f4xx/serialUSB/

im HS (High Speed) Mode arbeiten kann?

Ich habe es gerade unter Windows übersetzt, beim Anstecken meldet
es aber "STM32 Virtual ComPort in FS Mode", obwohl ich beide
USB-Anschlüsse des Discoveries in HS USB-Ports angesteckt habe.

Ohne jetzt die Sourcen durchwühlt zu haben:
Gibt es da vielleicht ein Define, wo man dies enablen kann?
Oder kennt das Problem jemand und weiß eine Lösung?

von Martin M. (capiman)


Lesenswert?

Ich habe mittlerweile etwas weiter geforscht, falls es jemand mal
brauchen kann (leider noch nicht der Durchbruch...):
(bezieht sich auf die oben erwähnten Sourcen von www.das-labor.org,
bzw. recht ähnlichen Beispiele von www.st.com)

Statt

CFLAGS+=-DUSE_USB_OTG_FS=1

kann man im Makefile scheinbar etwas in der Art

CFLAGS+=-DUSE_USB_OTG_HS=1 -DUSB_OTG_HS_CORE=1 -DUSE_ULPI_PHY=1

angeben.

Dann erhält man aber Übersetzungsfehler ("RX_FIFO_HS_SIZE" ...):

Diese kann man beheben, indem man usb_conf.h mit Code-Stücken ergänzt,
die man auch im Beispiel-Code von www.st.com findet:

/****************** USB OTG HS CONFIGURATION 
**********************************/
#ifdef USB_OTG_HS_CORE
 #define RX_FIFO_HS_SIZE                          512
 #define TX0_FIFO_HS_SIZE                         512
 #define TX1_FIFO_HS_SIZE                         512
 #define TX2_FIFO_HS_SIZE                          0
 #define TX3_FIFO_HS_SIZE                          0
 #define TX4_FIFO_HS_SIZE                          0
 #define TX5_FIFO_HS_SIZE                          0
 #define TXH_NP_HS_FIFOSIZ                         96
 #define TXH_P_HS_FIFOSIZ                          96

 //#define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT
 //#define USB_OTG_HS_SOF_OUTPUT_ENABLED

 //#define USB_OTG_INTERNAL_VBUS_ENABLED
 #define USB_OTG_EXTERNAL_VBUS_ENABLED

 #ifdef USE_ULPI_PHY
  #define USB_OTG_ULPI_PHY_ENABLED
 #endif
 #ifdef USE_EMBEDDED_PHY
   #define USB_OTG_EMBEDDED_PHY_ENABLED
 #endif
 #ifdef USE_I2C_PHY
  #define USB_OTG_I2C_PHY_ENABLED
 #endif
 #define USB_OTG_HS_INTERNAL_DMA_ENABLED
 #define USB_OTG_HS_DEDICATED_EP1_ENABLED
#endif

Dann gibt es noch einen Fehler in usbd_cdc_core.c (Zeile ~557):

pbuf = usbd_cdc_Desc;

Muss wahrscheinlich etwas der Art

pbuf = usbd_cdc_CfgDesc;

sein, weil es usbd_cdc_Desc in den ganzen Sourcen nicht gibt.
Selbes Problem im Beispiel-Code vom www.st.com
(ich verwende übrigens STM32F4-Discovery_FW_V1.1.0)

Dann lässt es sich zwar übersetzen, aber Enumeration klappt
auf dem STM32F4-Discovery trotzdem nicht.

Hat jemand etwas Ahnung von den obigen Parametern?
Ist
CFLAGS+=-DUSE_USB_OTG_HS=1 -DUSB_OTG_HS_CORE=1 -DUSE_ULPI_PHY=1
richtig und passt dies zum STM32F4-Discovery?
Bin ich der erste Kunde von ST, der den STM32F4 mit deren Sourcen
im HS-Mode betreibt...?
Oder gibt es hier gar irgendeine Dokumentation, AppNote o.ä.
die mir hier weiterhilft oder die nötigen Defines beschreibt?

Ich habe noch folgendes Dokument gefunden (siehe Seite 102):
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/CD00289278.pdf

Kann es sein, dass das mit dem STM32F4-Discovery gar nicht gehen kann?
Laut
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00039084.pdf
Seite 17:
"The STM32F4 is used to drive only USB OTG full speed on this board."

Müsste da vielleicht extern ein USB HS PHY verwendet werden, der auf
dem STM32F4-Discovery gar nicht vorhanden ist?

von erhardd (Gast)


Lesenswert?

...wenn Du USB-HS willst, reicht es nicht, das Board in einen high-Speed 
Anschluss des PC zu stecken. Du brauchst ein Phy auf dem Board.
z.B. USB3320 oder TUSB1210, um über ULPI arbeiten zu können;

von Martin M. (capiman)


Lesenswert?

@erhardd: Danke für die Antwort!

Kennt jemand ein Eval-Board mit dem STM32F4, welches so einen
USB HS PHY schon on-board hat?

Oder gibt es den USB HS PHY auf einem Break-Out-Board,
welches ich ans Discovery anschliessen kann?
(Geht das überhaupt oder sind die Leitungslängen
zwischen CPU und PHY schon so kritisch,
dass dies über ein Break-Out-Board gar nicht gehen kann?)

von erhardd (Gast)


Lesenswert?

...@Martin
-es gibt STM3210C_EVAL und STM324xG-EVAL zu Preisen wie für ein gutes, 
gebrauchtes Laptop;
-da das Discovery F4 nur einen 100-pinner hat und schon mit FSMC und 
SDIO an der Grenze des "Machbaren" ist, habe ich mir einen 144-er mit 
ext.SRAM und Flash schicken lassen und diesem einen ULPI verpasst.
Dazu den USB3320;
Als Soft die Lib von ST : stm32_f105-07_f2_f4_usb-host-device_lib
-die Examples für STM32F417 (STM324xG-EVAL) auf 144-pin angepasst(ist 
für 168 BGA) und alle Examples ausprobiert.
 -Klappt prima-
Beitrag "STM32 GUI Library von ST"
Beitrag "Re: HY_STM32F417_BB"
Es gibt auch ein BreakOut in einem russ. Forum für diesen IC
http://forum.easyelectronics.ru/viewtopic.php?f=17&t=9886

von Marc X. (tuxscreen)


Lesenswert?

Hallo zusammen,

ich hoffe das hier noch jemand von den UrPostern mitliest...

Auch ich habe das Problem mit dem HighSpeed Enablen.

Wobei ich gar nicht so sehr auf die Geschwindigkeit HS aus bin, sondern 
den USBport auf dem STM im DMA Modus betreiben möchte. Dazu sollte man 
einfach nur den HighSpeedPort im FullSpeedmodus betreiben...

Ich habe aus diesem Grund auch den Code mit dem #define 
USB_OTG_EMBEDDED_PHY kompiliert, aber leider ohne Erfolg.

Weiss jemand mittlerweile mehr?

Gruß
Marc

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.