Forum: Mikrocontroller und Digitale Elektronik STM32 USB Virtual COM Port


von MCBastler123 (Gast)


Lesenswert?

Hallo,
ich habe ein Problem das Virtual COM-Port Beispiel von ST zum laufen zu 
brinden.
Ich habe kein Eval-Board. Benutze aber Ride7 mit JTAG programmer.

Prozessor: STM32F103C6T6
USB DM ist an Pin A11
USB DP ist an Pin A12

Da auf der Windows seite gar nichts passiert ist, habe Ich mit dem 
Debuger nachgeschaut und festgestellt das der mC sich bei der folgenden 
Stelle hängen bleibt.

hwconfig.c
1
void Set_System(void)
2
{
3
#ifndef USE_STM3210C_EVAL
4
  GPIO_InitTypeDef GPIO_InitStructure;
5
#endif /* USE_STM3210C_EVAL */
6
7
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
8
  /* RCC system reset(for debug purpose) */
9
  RCC_DeInit();
10
11
  /* Enable HSE */
12
  RCC_HSEConfig(RCC_HSE_ON);
13
14
  /* Wait till HSE is ready */
15
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
16
17
  if (HSEStartUpStatus == SUCCESS)
18
  {
19
    /* Enable Prefetch Buffer */
20
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
21
22
    /* Flash 2 wait state */
23
    FLASH_SetLatency(FLASH_Latency_2);
24
 
25
    /* HCLK = SYSCLK */
26
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
27
  
28
    /* PCLK2 = HCLK */
29
    RCC_PCLK2Config(RCC_HCLK_Div1); 
30
31
    /* PCLK1 = HCLK/2 */
32
    RCC_PCLK1Config(RCC_HCLK_Div2);
33
34
#ifdef STM32F10X_CL
35
  // PLL configuration: PLLCLK
36
  /* Configure PLLs *********************************************************/
37
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
38
    RCC_PREDIV2Config(RCC_PREDIV2_Div5);
39
    RCC_PLL2Config(RCC_PLL2Mul_8);
40
41
    // Enable PLL2 
42
    RCC_PLL2Cmd(ENABLE);
43
44
    // Wait till PLL2 is ready 
45
    while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET) //!!!! Hier bleibt er hängen
46
    {}
47
48
    // PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz *
49
    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
50
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);    
51
#else
52
    /* PLLCLK = 8MHz * 9 = 72 MHz */
53
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
54
#endif
55
56
    /* Enable PLL */ 
57
    RCC_PLLCmd(ENABLE);
58
59
    /* Wait till PLL is ready */
60
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
61
    {
62
    }
63
64
    /* Select PLL as system clock source */
65
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
66
67
    /* Wait till PLL is used as system clock source */
68
    while(RCC_GetSYSCLKSource() != 0x08)
69
    {
70
    }
71
  }
72
  else
73
  { /* If HSE fails to start-up, the application will have wrong clock configuration.
74
       User can add here some code to deal with this error */    
75
76
    /* Go to infinite loop */
77
    while (1)
78
    {
79
    }
80
  }
81
82
#ifndef USE_STM3210C_EVAL
83
  /* Enable USB_DISCONNECT GPIO clock */
84
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);
85
86
  /* Configure USB pull-up pin */
87
  GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
88
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
89
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
90
  GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
91
#endif /* USE_STM3210C_EVAL */
92
}

Weiß jemand woran das liegt?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Pull-Up Widerstand von USB DP mit 1,5K auf 3,3V drin?

von MCBastler123 (Gast)


Lesenswert?

Nein der fehlt, muss der zwingend nach 3,3V geschaltet sein?

von MCBastler123 (Gast)


Lesenswert?

Sorry, Ich hab die Schaltung nicht selbst gemacht und dachte die läuft 
mit 5V.
Ich mach mal den Pull-Up rein und probier es aus.
Danke für den Hinweis.

von stm32-newbie (Gast)


Lesenswert?

Ich vermute die Applikation erwartet eine STM32-Dev-Kit-
Hardware-Umgebung.
Die USB-Disconnect-Schaltung ist da?

von MCBastler123 (Gast)


Lesenswert?

Ich bin noch recht neu mit dem Microcontroller und USB.
Die Schaltung sieht so aus

  USB
-------  1: D+ an PA12 3: VBus an PA3
| | | |  2: D- an PA11 4: GND
1 2 3 4
    |
    10K
    |
    -----10K---| GND
    |
    PA3

Wie gesagt, Ich habe die Schaltung nicht selbst gebaut, deshalb weiss 
Ich es leider nicht genau.
Ist VBus <-> PA3 die Disconnect Schaltun?

An USB D+ mach Ich noch den 1,5K Pull-Up dran.

von MCBastler123 (Gast)


Lesenswert?

Sorry die Schaltung war nicht ganz vollständig


  USB
-------  1: D+ an PA12    3: VBus an PA3
| | | |  2: D- an PA11    4: GND
1 2 3 4
    |
    |                 Diode      Diode
    -----1K------------->|-------|<-----
    |                        |
    10K                      |
    |                        |INH
    -----10K---GND         ------  Spannungsregler
    |                      TC1185
    PA3

von MCBastler123 (Gast)


Lesenswert?

VBus ist wohl nicht die Disconnect Schaltung.
Damit soll wohl festgestellt werden können,
ob ein USB - Stecker angeschlossen ist.

Wie läßt sich den das Beispiel am besten umgestalten, so das es 
funktioniert.

Wenn Ich z.B. das STM32F10X_CL Flag weg nehme (GCC-Compiler Defines)
dann läst es sich nicht mehr Compilieren.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Wenn Du einfach nur ein Widerstand 1K5 von DP auf 3,3V machst, ohne 
STM32Fxxx, dann möchte Windows einen USB Treiber finden, aber meckert 
dass er das Gerät nicht erkannt hat. (Enumeration failed oder ähnlich)

Wenn das nicht geht, dann hast Du die Pins vom USB Stecker nicht richtig 
angeschlossen.

von MCBastler123 (Gast)


Lesenswert?

Nein Windows findet garnichts, das habe Ich auch im Gerätemanager 
geprüft.
Ich werde jetzt erstmal die Schaltung genau prüfen.

von Thomas B. (escamoteur)


Lesenswert?

Kuck Dir auch mal meine Schaltung und Beispiel bei [[STM32 USB-FS-Device 
Lib] an.
Gruß
Tom

von MCBastler123 (Gast)


Lesenswert?

Dern Pull up Wiederstand ist jetzt eingebaut, und Windows erkennt jetzt 
ein unbekanntes USB-Gerät.
Jedoch bleibt er immer noch bei der gleichen stelle hängen.
1
// Enable PLL2 
2
RCC_PLL2Cmd(ENABLE);
3
4
// Wait till PLL2 is ready 
5
while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET) //!!!! Hier bleibt er hängen
6
    {}

Woran könnte es liegen, dass PLL2 nicht aktiviert werden kann?

von Thomas B. (escamoteur)


Lesenswert?

Hast Du nen externen Quarz und auch auf 72Mhz gestellt? Sonst tuts nicht

von MCBastler123 (Gast)


Lesenswert?

Es ist ein externer 12Mhz angeschlossen.

von Thomas B. (escamoteur)


Lesenswert?

Und hast Du die interne PLL auf 72Mhz eingestellt? Das Problem hatte ich 
zuerst

von MCBastler123 (Gast)


Lesenswert?

Wo genau stellt man den den ein?

von Thomas B. (escamoteur)


Lesenswert?

Hier

CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_Value */
 #define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_Value */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
//   #define SYSCLK_FREQ_48MHz  48000000
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif


gruß
Tom

von MCBastler123 (Gast)


Lesenswert?

Ja steht bei mir auch auf 72Mhz.

von MCBastler123 (Gast)


Lesenswert?

Ich habe mir die Schaltung unter STM32 USB-FS-Device
Lib angesehen und dort wird ja ein IC USBLC6-2 benutzt.
Ich kenn mich mit USB nicht wirklich aus, D+ und D- gehen in meiner 
Schaltung eigendlich direkt zum Port des MC.

Was genau bewirkt dieses IC?

von MCBastler123 (Gast)


Lesenswert?

Ich habe noch etwas festgestellt mein MC arbeitet mit 2,5V könnte sich 
dieses die Ursache sein?

von Hannes S. (Gast)


Lesenswert?

Der USBLC6 ist nur ESD schutz, gehen tut es auch ohne, man muss halt 
dann aber etwas vorsichtiger sein...
Ansonsten: Die Clockeinstellungen in den Libs gehen von einem 8Mhz HSE 
aus, bin mir aber nicht sicher, ob es da auch ein #define gibt um das zu 
ändern.
USB benötigt bei 72Mhz den 1.5 Teiler, da USB immer mit 48Mhz geclockt 
wird. Man kann alternativ auch mit 48MHz takten und einen 1er Teiler 
nutzen. Die Punkte solltest Du auf jeden Fall nochmal checken.

von Hannes S. (Gast)


Lesenswert?

Moment - gerade aufgefallen: Wieso hängt der Code eigentlich in der 
abgegebenen Stelle? Der 103C6 gehört doch nicht zur Connectitvity-Line 
(oder doch?) Insofern dürfte das nicht gelten: #ifdef STM32F10X_CL

von MCBastler123 (Gast)


Lesenswert?

Wenn Ich das STM32F10X_CL Flag entferne, dann läßt sich das Beispiel 
nicht mehr kompilieren.

Die Fehler lassen sich auch nicht so einfach beheben, die ersten sind 
dann in der USB Lib.
Den Quellcode dort sollte man doch eigendlich nicht ändern müssen.

von MCBastler123 (Gast)


Lesenswert?

Zur Connectitvity-Line gehören STM32F107 und STM32F105.
Der STM32F103C6T6 gehört wohl nicht dazu, er hat aber USB und CAN.

von Hannes S. (Gast)


Lesenswert?

Der 103C6 gehört definitiv nicht zur Connectivity-Line. Deshalb hat er 
auch die PLL2 nicht, deren Funktion mit dem Test auf RCC_FLAG_PLL2RDY 
geprüft wird. Meiner Meinung nach hast Du da ein Demoproject für einen 
105er verwendet. Und daher wäre mein Tipp, erstmal was zu suchen, was 
näher an Deiner Hardware dran ist. Also was Richtung 103er Medium 
Density. Für IAR war sowas vorhanden und hab das für mein Board mit 
103CB verwendet.

Ansonsten: Ein wenig Code-Anpassung wird spätestens dann notwendig, wenn 
man des Disconnect Feature einbindet oder Sleep modes unterstützen 
willst. Also ganz Trivial ist die ganze Sache nicht. Letztendlich hilft 
nur (wie immer) sich in kleinen Schritten rantasten: Takte rausgeben, 
nachmessen, IO Pegel mitmessen, etc...

von Thomas B. (escamoteur)


Lesenswert?

Nimm mal mein Code Beispiel aus dem Artikel, da ist alles was 
connectivity is rausgeschmissen
Gruß
Tom

von MCBastler123 (Gast)


Lesenswert?

Das Beispiel läst sich gut kompiliereren.
Jetzt will leider Windows noch nicht.
Ich habe noch keinen Disconnect Pin (wird aber noch eingebaut),
kann das ohne den Disconnect Pin funktionieren?

von Thomas B. (escamoteur)


Lesenswert?

Wenn Du mit dem Einstecken wartest bis Deine Software läuft, sollte es 
auch gehen. Nur andersherum gibt es schwierigkeiten.

Gruß
Tom

von Hannes S. (Gast)


Lesenswert?

... und nicht vergessen: Clocks anpassen, da Du ja einen Quarz mit 12Mhz 
statt 8Mhz verwendest. Ausserdem würde ich zunächst auch mal mindestens 
3.0V VCC empfehlen. Da kann ich Dir aus eigener Erfahrung sagen, dass es 
geht. 2.5V sind wahrscheinlich ausserhalb der Spec...

von MCBastler123 (Gast)


Lesenswert?

Mit geänderter Clock funktioniert es endlich.
http://www.mikrocontroller.net/articles/STM32_USB-FS-Device_Lib

Unter Windows XP 32Bit läßt sich der Treiber manuell installieren und es 
klappt.

Nur unter Windows 7 64Bit will er nicht, im Gerätemanager zeigt er dann 
ein gelbes Dreieck an.
Gibt es auch einen 64Bit Treiber Datei, oder liegt das an einer 
fehlenden Signierung?

von Thomas B. (escamoteur)


Lesenswert?

Auch unter Win 7 32Bit hatte ich etwas schwierigkeiten. Hast Du schon 
versucht im Gerätemanager den Treiber zu aktualisieren? Da kannst Du 
dann auch manuell die .inf Datei auswählen
Gruß
Tom

von Peter K. (mikro1111)


Lesenswert?

welche maximale geschwindigkeit ist über diesen treiber als virtual com 
port erzielbar????

von MCBastler123 (Gast)


Lesenswert?

Es wird immer mit der USB 2.0 Geschwindigkeit übertragen.
Die eingestellten Bauraten ist nur diee verarbeitungsgeschwindigkeit auf 
PC und MC seite.
Im MC muss man natürlich auch eine Baudrate (standard 19200)festlegen. 
Die hat aber nichts mit der Bautrate vom PC zu tun, hier kann man eine 
kleinere oder auch größere benutzen.
Problematisch könnte eine größere Baudrate auf der PC-Seite sein, wenn 
dort auch viele Daten gesendet werden, dieses könnte auf der MC Seite 
den Eingangs- Buffer zum überlaufen bringen.

von MCBastler123 (Gast)


Lesenswert?

Die USB Gewindigkeit ist:

   Low-Speed, 1,5 Mbit/s (187,5 KB/s)   –   ± 0,75 kbit/s   ± 22,5 
kbit/s
   Full-Speed, 12 Mbit/s (1,5 MB/s)   –   ± 6 kbit/s   ± 30 kbit/s
-> High-Speed, 480 Mbit/s (60 MB/s)   –   ± 240 kbit/s

Quelle http://de.wikipedia.org/wiki/Universal_Serial_Bus

von Ano N. (erde)


Lesenswert?

richtig  MCBastler123..

ein standard CDC nutzt aber bulk endpoints..
@ usb2.0 full speed -> jede ms 64 Byte!
also 64kb/s..

von Thomas B. (escamoteur)


Lesenswert?

MCBastler123 schrieb:
> roblematisch könnte eine größere Baudrate auf der PC-Seite sein, wenn
> dort auch viele Daten gesendet werden, dieses könnte auf der MC Seite
> den Eingangs- Buffer zum überlaufen bringen.

Ist das so?

in:
1
void EP3_OUT_Callback(void)
2
{
3
  /* Get the received data buffer and update the counter */
4
  count_out = USB_SIL_Read(EP3_OUT, buffer_out);
5
    
6
  
7
  /* Enable the receive of data on EP3 */
8
  SetEPRxValid(ENDP3);
9
}

Steht dieses SetEPRxValid(ENDP3) ich hatte das bisher so interprestiert, 
dass erst nach dessen Aufruf neue Daten vom PC angenommen werden und der 
PC blockt, oder ist das nicht so?

Gruß
Tom

von MCBastler123 (Gast)


Lesenswert?

Ja habe mich wohl geiirt.
Dann müßte es der Ausgabe Buffer auf der
PC Seite sein der überlaufen könnte.

von Bandre (Gast)


Lesenswert?

Hallo,
da ich hier schon etliche gute Infos gefunden habe gebe ich auch mal ein 
paar Infos zurück.

Also senden vom Primer1 zum Pc: 65536 Bytes dauert zwischen 80 und 90ms.

Pc zu Primer1, wenn im Programm auf die Daten gewartet wird, sprich 
Abfrage Count_out , 512Bytes 1ms weiter habe ich nicht probiert da ich 
die 512Bytes nach dem Empfang auf SD-Karte schreibe.

Gruß

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Nabend,

ich versuche inzwischen seit Tagen die Virtual Com Port Demo auf dem 
Primer2 zum Laufen zu kriegen. Ich benutze Ride7.

Ich habe das ARM_USB_TEST Beispiel aus dem Wiki von escamoteur genommen. 
Nach ein wenig rumprobieren kriege ich das auch mit Ride7 ohne Fehler 
compiliert. Wenn ich den Primer2 jedoch an den Rechner stecke passiert 
absolut gar nichts. Wenn ich die bisherigen Beiträge richtig verstanden 
habe, sollte ja zumindest eine Fehlermeldung erscheinen, dass das Gerät 
nicht erkannt wurde. Auch das passiert nicht.

Ich mache daher wohl noch irgendwas grundlegendes falsch. Bisher habe 
ich nur in der hw_config.h den Port für USB-Disconnect an die Hardware 
angepasst:
1
  #define USB_CONNECT                      GPIOD  
2
  #define USB_CONNECT_PIN                  GPIO_Pin_3
3
  #define RCC_APB2Periph_GPIO_CONNECT      RCC_APB2Periph_GPIOD
USB ist an PA11/12, aber das ist ja wohl immer so. Ich habe den 
Schaltplan vom Primer2 zur Sicherheit mal angehangen.

Ich habe auch schon testweise USB-Disconnect auf high und low 
geschaltet, aber in beiden Fällen wurde auch nichts erkannt...

Habe ich irgendeinen Denkfehler oder mache ich noch irgendwas falsch?

Ich bin STM32-Anfänger und daher momentan mit meinem Latein am Ende. 
Wobei das ja noch nicht mal was mit dem STM32 zu tun hat...

Hat einer ne Idee woran das liegen könnte?

von Daniel (Gast)


Lesenswert?

Hat keiner ne Idee woran es liegen könnte oder was ich falsch mache? Ich 
habe bereits versucht den USB-Teil im Circle OS zu verstehen, was aber 
auch nicht von Erfolg gekrönt war, weil . Von daher weiß ich jetzt echt 
nicht mehr weiter...
Was dürfte der wahrscheinlichste Grund sein warum es bei mir nicht 
funktioniert?

Für Tipps jeglicher Art wäre ich sehr dankbar.

von Matthias B. (mabl)


Lesenswert?

Du könntest ja mal unter Linux starten mit
tail -f /var/log/messages
kannst du erkennen ob etwas passiert wenn du dein USB Port verbindest. 
Mit lsusb kannst du nachschauen was am USB Port erkannt wird.

Bei dem ST Com Port Beispiel sieht dass dann so aus:
1
mabl@miraculix:~$ tail -f /var/log/messages
2
Sep 24 10:34:34 miraculix kernel: [20521.344670] usb 1-4.2: new full speed USB device using ehci_hcd and address 14
3
Sep 24 10:34:34 miraculix kernel: [20521.452703] cdc_acm 1-4.2:1.0: ttyACM0: USB ACM device
1
mabl@miraculix:~$ lsusb 
2
...
3
Bus 001 Device 014: ID 0483:5740 SGS Thomson Microelectronics 
4
...


Evt. ist bei dir auch der Logikpegel für USB_CONNECT umgedreht?

von Daniel (Gast)


Lesenswert?

Danke für die Antwort. Ich habe es bereits unter Windows 7 sowie unter 
Fedora versucht. Unter Windows 7 kommt keine Meldung und auch unter 
Fedora tut sich nichts.

Wenn ich das nackte CircleOS starte und dann das USB-Kabel anstecke, tut 
sich allerdings auch nichts. Von daher habe ich bisher wohl nach was 
gesucht was gar nicht da ist. Erst wenn ich z.B. die Mouse Application 
(HID Interface) starte, meldet sich ein Gerät an:
1
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: new full speed USB device using ehci_hcd and address 18
2
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: New USB device found, idVendor=0483, idProduct=5710
3
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
4
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: Product: STM32 Joystick
5
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: Manufacturer: STMicroelectronics
6
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: SerialNumber: STM3210
7
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: configuration #1 chosen from 1 choice
8
Sep 24 15:16:40 dpc1 kernel: input: STMicroelectronics STM32 Joystick as /devices/pci0000:00/0000:00:1a.7/usb1/1-4/1-4.2/1-4.2.3/1-4.2.3:1.0/input/input6
9
Sep 24 15:16:40 dpc1 kernel: generic-usb 0003:0483:5710.0003: input,hidraw2: USB HID v1.00 Mouse [STMicroelectronics STM32 Joystick] on usb-0000:00:1a.7-4.2.3/input0

Von daher werde ich wohl versuchen den Code von der Mouse Application zu 
verstehen... Wobei ich da genauso wenig weiß wo ich anfangen soll und 
was wichtig ist...

Matthias Blaicher schrieb:
> Evt. ist bei dir auch der Logikpegel für USB_CONNECT umgedreht?
Ich habe bereits USB_CONNECT auf high und low geschaltet. In beiden 
Fällen tat sich nichts. Von daher gehe ich davon aus, dass irgendwas 
anderes nicht stimmt...

von Daniel (Gast)


Lesenswert?

Ich bin inzwischen ein wenig weiter...

1
Sep 25 05:29:24 dpc1 kernel: usb 7-1: new full speed USB device using uhci_hcd and address 29
2
Sep 25 05:29:25 dpc1 kernel: usb 7-1: device descriptor read/64, error -71
3
Sep 25 05:29:25 dpc1 kernel: usb 7-1: device descriptor read/64, error -71
4
Sep 25 05:29:25 dpc1 kernel: usb 7-1: new full speed USB device using uhci_hcd and address 30
5
Sep 25 05:29:25 dpc1 kernel: usb 7-1: device descriptor read/64, error -71
6
Sep 25 05:29:25 dpc1 kernel: usb 7-1: device descriptor read/64, error -71
7
Sep 25 05:29:25 dpc1 kernel: usb 7-1: new full speed USB device using uhci_hcd and address 31
8
Sep 25 05:29:26 dpc1 kernel: usb 7-1: device not accepting address 31, error -71
9
Sep 25 05:29:26 dpc1 kernel: usb 7-1: new full speed USB device using uhci_hcd and address 32
10
Sep 25 05:29:26 dpc1 kernel: usb 7-1: device not accepting address 32, error -71
11
Sep 25 05:29:26 dpc1 kernel: hub 7-0:1.0: unable to enumerate USB device on port 1
12
Sep 25 05:30:31 dpc1 kernel: usb 1-4.2.3: USB disconnect, address 31

Linux spuckt das aus und auf Windows kommt die Meldung, dass das Gerät 
nicht erkannt wurde. Ich hatte doch noch nen Fehler vorm USB_DISCONNECT, 
der jedoch jetzt behoben ist.

Offensichtlich passt jedoch irgendwas anderes nicht... Da der Primer2 
nen 12MHz-Quarz hat, habe ich folgendes gemacht. Die drei Dateien aus 
ST_StdPeriph_Lib\CMSIS\CM3\DeviceSupport\ST\STM32F10x habe ich in den 
Projektordner kopiert und dann folgende Änderung gemacht:
stm32f10x.h
1
#define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */

system_stm32f10x.c (war schon so)
1
#define SYSCLK_FREQ_72MHz  72000000

Muss ich noch an anderen Stellen was ändern? Denn bisher funktioniert 
noch nichts...

Gehe ich recht in der Annahme, dass die aktuelle Version der StdLib mit 
den obigen Einstellungen automatisch auf den externen Quarz umstellt? 
Denn der Inhalt von Set_System() ist ja komplett auskommentiert bezogen 
auf die Clockeinstellungen...

von jor (Gast)


Lesenswert?

Daniel schrieb:
> Muss ich noch an anderen Stellen was ändern? Denn bisher funktioniert
> noch nichts...

Ich bin auch gerade erst dabei mich in das Thema einzuarbeiten aber ich 
habe die Einstellungen der PLL verfolgt und bin am Schluss in der Datei 
system_stm32f10x.c hier gelandet:
1
#ifdef STM32F10X_CL
2
    /* Configure PLLs ------------------------------------------------------*/
3
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
4
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
5
        
6
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
7
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
8
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
9
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
10
  
11
    /* Enable PLL2 */
12
    RCC->CR |= RCC_CR_PLL2ON;
13
    /* Wait till PLL2 is ready */
14
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
15
    {
16
    }
17
    
18
   
19
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 
20
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
21
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
22
                            RCC_CFGR_PLLMULL9); 
23
#else    
24
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
25
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
26
                                        RCC_CFGR_PLLMULL));
27
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
28
#endif /* STM32F10X_CL */

Hier musst du (von Hand) den Faktor mit dem der Systemtakt multipliziert 
wird ändern. Es gibt verschiedene Funktionen für verschiedene 
Betriebsfrequenzen.
Also RCC_CFGR_PLLMULL9 (bei 12MHz) zu RCC_CFGR_PLLMULL6 damit man 72 MHz 
hat. Welche Werte einstellbar sind steht im Reference Manual oder in der 
stm32f10x.h. Ich habe das ganze aber bisher nur theoretisch betrachtet 
und würde deswegen lieber noch einmal nachmessen an deiner Stelle.

von Lukas Simma (Gast)


Lesenswert?

Hallo,

ja die ST Lib. ist beim STM32F103 leider exakt für 8MHz hardcoded.
Du musst den Code modifizieren...

Das wurde auch hier schon angesprochen:
http://www.stm32circle.com/forum/viewtopic.php?pid=5204

Frage doch im dem stm32circle forum nach, ich denke das dürft schon wer 
für den Primer2 gelöst haben....

Grüße,
Lukas

von Lukas M. (stuntman)


Angehängte Dateien:

Lesenswert?

Hallo,

ich probiere gerade über die USB-Schnittstelle am Mikrocontrollerboard 
mit einem PC zu kommunizieren. Bevor ich das Problem konkret beschreibe 
würde ich gerne einen kleinen Hardware sowie Software Überblick geben.

----------------------------------------------------------
Entwicklungsboard:

- STM32-H103 von Olimex

Entwicklungsumgebung:
- Eclipse mit Zylin Plug-In für Embedded Debugging
- YAGARTO
- OpenOCD 0_4_0

JTAG-Programmieradapter:
- Olimex ARM-USB-OCD

Software:
- STM32F10x Standard Peripherals Library V.2.0.1 vom 06/13/2008
- STM32 USB-FS-Device Lib von Thomas Burkhard (escamoteur)
----------------------------------------------------------

Ich benutze diese relativ alte Standard Peripherals Library von ST, da 
ich die Treiber eines Funkmoduls bereits an diese Library angepasst habe 
und diese funktionsfähig sind.
Ich habe die USB-FS-Device Lib an meine Ordernstruktur angepasst und das 
Projekt lässt sich auch kompelieren.
Im Handbuch des STMH-103 Entwicklungsboard steht etwas über einen Jumper 
"USBP-E" welcher geöffent werden muss damit die USB-Schnittstelle 
verwenden werden kann (Anhang Ausschnitt Board-Handbuch:Seite 4). Diese 
Brücke habe ich bereits getrennt aber am PC (Windows XP Pro) habe ich 
keine Reaktion das ein neues Gerät erkannt wurde. Erkennt der PC den USB 
Virtual COM Port nur wenn auch die Software auf dem Board läuft oder 
müsste er ihn auch so erkennen?

Desweiteren dient die USB-Schnittstelle zur Zeit als Stromversorgung, 
weiß jemand ob dies auch weiterhin funktioniert, wenn ich die 
USB-Schnittstelle zur Kommunikation verwende?

An welcher Stelle der Software muss ich mein Board an die Software 
anpassen?

Dem Handbuch habe ich entnommen das folgende Pins etwas mit der 
USB-Schnittstelle zutun haben:

PA11 = USBDM
PA12 = USBDP
PC4  = USB-P

Nach dem ich den Mikrocontroller geflasht habe fliegt er wärend der 
Initialisierung der USB Schnittstelle immer in den hardfault_handler.

folgende Befehle werden noch ausgeführt:
1
void USB_Init(void)
2
{
3
  pInformation = &Device_Info;
4
  pInformation->ControlState = 2;
5
  pProperty = &Device_Property;
6
  pUser_Standard_Requests = &User_Standard_Requests;
7
  /* Initialize devices one by one */
und bei dem folgenden Funktionsaufruf fliegt der µC in den 
hardfault_handler.
1
pProperty->Init();

Jetzt habe ich jede Menge Infos und offene Fragen über mein Projekt 
geschrieben, vielleicht hat ja jemand einen Ansatz um das Probelm zu 
lösen.

von Matthias (Gast)


Lesenswert?

Lukas M. schrieb:
> Erkennt der PC den USB
> Virtual COM Port nur wenn auch die Software auf dem Board läuft oder
> müsste er ihn auch so erkennen?

Auf dem Board muss die USB-Software laufen, auf dem PC der STM Virtual 
Port Driver. Auch ohne die Software erkennt der PC beim einstecken das 
neue Gerät, kann aber keinen Treiber installieren. Aktiviere dazu mal 
das DISC-Signal.

Ansonsten ist es keine gute Idee auf die alte LIB zu setzen. Hatte viele 
Bugs.

Das Virtuell Comport Demo der der USB-Lib lief bei mir mit nur wenigen 
Anpassungen auf Olimex P103 sofort, allerdings mit FW-Lib 3.4.0

von Lukas M. (stuntman)


Lesenswert?

> Auf dem Board muss die USB-Software laufen, auf dem PC der STM Virtual
> Port Driver. Auch ohne die Software erkennt der PC beim einstecken das
> neue Gerät, kann aber keinen Treiber installieren. Aktiviere dazu mal
> das DISC-Signal.

Wo aktiviere ich das DISC-Signal bzw. was ist das für eine Einstellung?

LG Lukas

von Matthias (Gast)


Lesenswert?

Lukas M. schrieb:
> Wo aktiviere ich das DISC-Signal bzw. was ist das für eine Einstellung?

Siehe Schaltplan!

von Lukas M. (stuntman)


Lesenswert?

Im Schaltplan sehe ich das PC11 am DISC-Signal hängt.

in der hw_config.h

habe ich folgendes angepasst:
1
#include "usb_type.h"
2
3
  #define USB_CONNECT                      GPIOC
4
  #define USB_CONNECT_PIN                  GPIO_Pin_11
5
  #define RCC_APB2Periph_GPIO_CONNECT      RCC_APB2Periph_GPIOC

meinest du das?

LG

von Matthias (Gast)


Lesenswert?

ja

von Lukas M. (stuntman)


Lesenswert?

Vielleicht sollte ich wirklich auf die neuste FW-LIB setzen, nur dann 
muss ich auch wieder die den ganzen Makefile neu schreiben oder gibt es 
eine gute Alternative zum Eclipse?

LG

von Lukas M. (stuntman)


Lesenswert?

Hat sonst vielleicht noch jemand einen Lösungsvorschlag wo das Problem 
bei meiner Kommunikation liegen kann?

von Matthias (Gast)


Lesenswert?

Zwischen FW 2 und 3.x gibt es einige Unterschiede. STM hat zur Mikration 
von 2 auf 3 eine AppNote im Netz. Vermutlich kommst Du um das Update 
Deiner Software nicht herum, dann sehen wir weiter;-)

von Johannes W. (waddi)


Lesenswert?

Hallo

ich möchte auch das Virtual Com Port Bsp. von escamotuer zum laufen 
bringen. Bin aber kompletter Einsteiger in ARM32bit. Und suche deshalb 
hier Hilfe. Zuerst einmal ein paar Informationen:

verwendetes Board: STM32-H103 von OLIMEX mit einem STM32F103RBT6
Als Entwicklungsumgebung verwende ich RIDE7 und einen RLink Debugger von 
Raisonance.
Hier sehe ich die erste Hürde. Wie bekomme ich das Crossworks Projekt 
von escamotuer in RIDE7.
Kann ich einfach die .c und .h - files in mein neues Projektverzeichnis 
ziehen?

Danke und Sorry für dumme Fragen im Voraus bin absoluter Neuling auf 
diesem Gebiet.

von Thomas B. (escamoteur)


Lesenswert?

Hi Johannes,

geau, mach ein neues Ride Projekt und ziehe die .c und .h Files rüber. 
Schau mal, ob Ride bereits Projekttemplates für projekte die die ST 
Device Library unterstützen anbietet. Sonst musst Du die entsprechenden 
Dateien aus der Library von hand einbinden.

Gruß
Tom

von Johannes (Gast)


Lesenswert?

Mhhhh, danke Tom,

aber sind noch irgendwelche Extra - Einstellungen in Ride vorzunehmen?
Ich habe nun ein Dutzend mal versucht die Dateien in ein 
funktionierendes Projekt zu importieren. Aber es ist mir noch nicht 
gelungen
das Projekt zu kompilieren.

Irgendwelche Vorschläge?

von Johannes (Gast)


Lesenswert?

Ok

ich habe es geschafft. Und nachdem ich nun die Einstellung in der 
hw_config:


  #define USB_CONNECT                      GPIOC
  #define USB_CONNECT_PIN                  GPIO_Pin_11
  #define RCC_APB2Periph_GPIO_CONNECT      RCC_APB2Periph_GPIOC

so geändert habe. Dachte ich es sollte funktionieren. Aber nun erkennt 
er das Gerät nicht mehr. Ich habe diesen Thread nochmal durch gearbeitet 
bin aber hilfstechnisch nicht fündig geworden.

Hat noch jemand einen Tip für mich?

von Johannes (Gast)


Lesenswert?

Danke ;) läuft.

Also ich kann Daten am PC empfangen wenn ich dauerhaft etwas sende. Wenn 
ich jedoch das Prinzip von escamotouer ausprobieren will, bekomme ich 
nichts zurück.
Mit welchen Geschwindigkeiten arbeitet das ganze Prinzip denn überhaupt? 
Ich habe etwas weiter oben gelesen, dass immer mit USB Geschwindigkeit 
gesendet wird. Ist da was dran?
Kann mit jemand einen Tip zu einer informativen, seriösen Website geben?

von Thomas B. (escamoteur)


Lesenswert?

Hi Johannes,

natürlich wird immer mit USB Geschwindigkeit übertragen. Womit sendest 
Du denn die Daten vom PC aus?

Gruß
Tom

von Johannes (Gast)


Lesenswert?

Mit HTerm habe ich gearbeitet. Muss ich spezielle Einstellungen am VCP - 
Treiber vornehmen?
Ich habe die Datenübertragung noch nicht ganz verstanden. Wo finde ich 
Infos zu der USB - Übertragung. Kannst du mir da weiter helfen Tom.

Danke
Johannes

von Matthias B. (mabl)


Lesenswert?

Ein guter Einstieg ist imho "usb in a nutshell".

von Thomas B. (escamoteur)


Lesenswert?

Hallo Johannes,

ist leider schon etwas her, dass ich das ganze gemacht habe und hab grad 
keine Zeit noch mal tiefer reinzuschauen.

Am VCP-Treiber  hab ich nichts verändert und HTERM ist auf jeden Fall 
das richtige Tool.

Hast Du einfach meine Quellen verwendet oder hast Du daran noch was 
geändert?

Hast Du diese Defines gesetzt?

USE_PERIPH_LIBRARY
STM32F10X_HD

Wenn ich dich richtig verstehe, dann versuchst Du meinen Test, der den 
eingegebenen String umgekehrt wieder zurückschickt zum laufen zu 
bringen.

Woran erkennst Du, dass vom PC nichts ankommt? Hast Du nen Breakpoint 
vor
1
     for(int i = 0; i < count_out;i++)

gesetzt oder wie?

Gruß
Tom

von Johannes W. (waddi)


Lesenswert?

Hallo Tom.

Ich habe ales ans laufen bekommen. War ein ganz kleiner dummer Fehler, 
den ich übersehen habe.

Also mein Plan ist es den STM32 für meine BA zu nutzen. Ich möchte 
Leistungsmessungen über den STM32 digitalisieren und über die USB - 
Schnittstelle Daten an Labview übertragen.

Hast du dich auch mit so etwas beschäftigt?

Danke & Gruß

Johannes

von Thomas B. (escamoteur)


Lesenswert?

Hallo Johannes,

 freut mich, das es geklappt hat und mein Beispiel Dir von Nutzen war.

Leider kann ich Dir bei den übrigen Themen gar  nicht helfen, da ich den 
STM32 in einem ganz anderen Kontext einsetze.

Liebe Grüße

Tom

von Matthias B. (mabl)


Lesenswert?

@Johannes W:
Schau dir vielleicht mal die libmaple an. Die sollte fuer deine 
Ansprueche voellig ausreichend sein. Sozusagen Arduino fuer den STM32.

von Thomas K. (blackfinn)


Lesenswert?

Hallo Johannes W. (waddi),

ich habe genau das gleiche Problem wie du (senden geht, rx -> tx nicht).
kannst du bitte 'mal schreiben, was dein "ganz kleiner dummer Fehler" 
war (villeicht ist's ja auch meiner ;)

Gruß Thomas.

von Christian (Gast)


Lesenswert?

Habe mir gerade mal das CrossWorks StandardLib Setup.zip aus dem Artikel
http://www.mikrocontroller.net/articles/STM32_USB-FS-Device_Lib
gezogen und versucht, das Projekt ARM_USB_Test in meinem CrossWorks 2.3 
zu bauen.

Leider baut das ARM_USB_Test.hzp Projekt überhaupt nicht, da stimmt 
Einiges nicht.
Es fehlen Pfade zum CoreSupport, es gibt Konflikte mit der bool 
Definition usw.

Ist das bekannt oder mache ich da was falsch?

Danke für alle Tipps.

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.