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
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
Ja, der Code würde mich auch interessieren.... Klingt spannend!
Hm, deine summon Toolchain basiert auf gcc. Aber ich kann kein Makefile finden. Wie wird das Projekt compiliert?
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
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
>Ü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?
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.
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)
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/
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?
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?
...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;
@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?)
...@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.