www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik STM32 USB Virtual COM Port


Autor: MCBastler123 (Gast)
Datum:

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
void Set_System(void)
{
#ifndef USE_STM3210C_EVAL
  GPIO_InitTypeDef GPIO_InitStructure;
#endif /* USE_STM3210C_EVAL */

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
 
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

#ifdef STM32F10X_CL
  // PLL configuration: PLLCLK
  /* Configure PLLs *********************************************************/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    RCC_PREDIV2Config(RCC_PREDIV2_Div5);
    RCC_PLL2Config(RCC_PLL2Mul_8);

    // Enable PLL2 
    RCC_PLL2Cmd(ENABLE);

    // Wait till PLL2 is ready 
    while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET) //!!!! Hier bleibt er hängen
    {}

    // PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz *
    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);    
#else
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
#endif

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock configuration.
       User can add here some code to deal with this error */    

    /* Go to infinite loop */
    while (1)
    {
    }
  }

#ifndef USE_STM3210C_EVAL
  /* Enable USB_DISCONNECT GPIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);

  /* Configure USB pull-up pin */
  GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
#endif /* USE_STM3210C_EVAL */
}

Weiß jemand woran das liegt?
Autor: Markus Müller (mmvisual)
Datum:

Pull-Up Widerstand von USB DP mit 1,5K auf 3,3V drin?
Autor: MCBastler123 (Gast)
Datum:

Nein der fehlt, muss der zwingend nach 3,3V geschaltet sein?
Autor: MCBastler123 (Gast)
Datum:

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.
Autor: stm32-newbie (Gast)
Datum:

Ich vermute die Applikation erwartet eine STM32-Dev-Kit-
Hardware-Umgebung.
Die USB-Disconnect-Schaltung ist da?
Autor: MCBastler123 (Gast)
Datum:

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.
Autor: MCBastler123 (Gast)
Datum:

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
Autor: MCBastler123 (Gast)
Datum:

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.
Autor: Markus Müller (mmvisual)
Datum:

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.
Autor: MCBastler123 (Gast)
Datum:

Nein Windows findet garnichts, das habe Ich auch im Gerätemanager
geprüft.
Ich werde jetzt erstmal die Schaltung genau prüfen.
Autor: Thomas Burkhart (escamoteur)
Datum:

Kuck Dir auch mal meine Schaltung und Beispiel bei [[STM32 USB-FS-Device
Lib] an.
Gruß
Tom
Autor: MCBastler123 (Gast)
Datum:

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.
// Enable PLL2 
RCC_PLL2Cmd(ENABLE);

// Wait till PLL2 is ready 
while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET) //!!!! Hier bleibt er hängen
    {}

Woran könnte es liegen, dass PLL2 nicht aktiviert werden kann?
Autor: Thomas Burkhart (escamoteur)
Datum:

Hast Du nen externen Quarz und auch auf 72Mhz gestellt? Sonst tuts nicht
Autor: MCBastler123 (Gast)
Datum:

Es ist ein externer 12Mhz angeschlossen.
Autor: Thomas Burkhart (escamoteur)
Datum:

Und hast Du die interne PLL auf 72Mhz eingestellt? Das Problem hatte ich
zuerst
Autor: MCBastler123 (Gast)
Datum:

Wo genau stellt man den den ein?
Autor: Thomas Burkhart (escamoteur)
Datum:

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
Autor: MCBastler123 (Gast)
Datum:

Ja steht bei mir auch auf 72Mhz.
Autor: MCBastler123 (Gast)
Datum:

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?
Autor: MCBastler123 (Gast)
Datum:

Ich habe noch etwas festgestellt mein MC arbeitet mit 2,5V könnte sich
dieses die Ursache sein?
Autor: Hannes S. (Gast)
Datum:

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.
Autor: Hannes S. (Gast)
Datum:

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
Autor: MCBastler123 (Gast)
Datum:

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.
Autor: MCBastler123 (Gast)
Datum:

Zur Connectitvity-Line gehören STM32F107 und STM32F105.
Der STM32F103C6T6 gehört wohl nicht dazu, er hat aber USB und CAN.
Autor: Hannes S. (Gast)
Datum:

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...
Autor: Thomas Burkhart (escamoteur)
Datum:

Nimm mal mein Code Beispiel aus dem Artikel, da ist alles was
connectivity is rausgeschmissen
Gruß
Tom
Autor: MCBastler123 (Gast)
Datum:

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?
Autor: Thomas Burkhart (escamoteur)
Datum:

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

Gruß
Tom
Autor: Hannes S. (Gast)
Datum:

... 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...
Autor: MCBastler123 (Gast)
Datum:

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

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?
Autor: Thomas Burkhart (escamoteur)
Datum:

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
Autor: Peter L. (mikro1111)
Datum:

welche maximale geschwindigkeit ist über diesen treiber als virtual com
port erzielbar????
Autor: MCBastler123 (Gast)
Datum:

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.
Autor: MCBastler123 (Gast)
Datum:

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
Autor: Ano Nym (erde)
Datum:

richtig  MCBastler123..

ein standard CDC nutzt aber bulk endpoints..
@ usb2.0 full speed -> jede ms 64 Byte!
also 64kb/s..
Autor: Thomas Burkhart (escamoteur)
Datum:

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:
void EP3_OUT_Callback(void)
{
  /* Get the received data buffer and update the counter */
  count_out = USB_SIL_Read(EP3_OUT, buffer_out);
    
  
  /* Enable the receive of data on EP3 */
  SetEPRxValid(ENDP3);
}

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
Autor: MCBastler123 (Gast)
Datum:

Ja habe mich wohl geiirt.
Dann müßte es der Ausgabe Buffer auf der
PC Seite sein der überlaufen könnte.
Autor: Bandre (Gast)
Datum:

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ß
Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

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:
  #define USB_CONNECT                      GPIOD  
  #define USB_CONNECT_PIN                  GPIO_Pin_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?
Autor: Daniel (Gast)
Datum:

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.
Autor: Matthias Blaicher (mabl)
Datum:

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:
mabl@miraculix:~$ tail -f /var/log/messages
Sep 24 10:34:34 miraculix kernel: [20521.344670] usb 1-4.2: new full speed USB device using ehci_hcd and address 14
Sep 24 10:34:34 miraculix kernel: [20521.452703] cdc_acm 1-4.2:1.0: ttyACM0: USB ACM device
mabl@miraculix:~$ lsusb 
...
Bus 001 Device 014: ID 0483:5740 SGS Thomson Microelectronics 
...


Evt. ist bei dir auch der Logikpegel für USB_CONNECT umgedreht?
Autor: Daniel (Gast)
Datum:

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:
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: new full speed USB device using ehci_hcd and address 18
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: New USB device found, idVendor=0483, idProduct=5710
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: Product: STM32 Joystick
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: Manufacturer: STMicroelectronics
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: SerialNumber: STM3210
Sep 24 15:16:40 dpc1 kernel: usb 1-4.2.3: configuration #1 chosen from 1 choice
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
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...
Autor: Daniel (Gast)
Datum:

Ich bin inzwischen ein wenig weiter...

Sep 25 05:29:24 dpc1 kernel: usb 7-1: new full speed USB device using uhci_hcd and address 29
Sep 25 05:29:25 dpc1 kernel: usb 7-1: device descriptor read/64, error -71
Sep 25 05:29:25 dpc1 kernel: usb 7-1: device descriptor read/64, error -71
Sep 25 05:29:25 dpc1 kernel: usb 7-1: new full speed USB device using uhci_hcd and address 30
Sep 25 05:29:25 dpc1 kernel: usb 7-1: device descriptor read/64, error -71
Sep 25 05:29:25 dpc1 kernel: usb 7-1: device descriptor read/64, error -71
Sep 25 05:29:25 dpc1 kernel: usb 7-1: new full speed USB device using uhci_hcd and address 31
Sep 25 05:29:26 dpc1 kernel: usb 7-1: device not accepting address 31, error -71
Sep 25 05:29:26 dpc1 kernel: usb 7-1: new full speed USB device using uhci_hcd and address 32
Sep 25 05:29:26 dpc1 kernel: usb 7-1: device not accepting address 32, error -71
Sep 25 05:29:26 dpc1 kernel: hub 7-0:1.0: unable to enumerate USB device on port 1
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
#define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */

system_stm32f10x.c (war schon so)
#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...
Autor: jor (Gast)
Datum:

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:
#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
    
   
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
                            RCC_CFGR_PLLMULL9); 
#else    
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#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.
Autor: Lukas Simma (Gast)
Datum:

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
Autor: Lukas M. (stuntman)
Datum:
Angehängte Dateien:

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:
void USB_Init(void)
{
  pInformation = &Device_Info;
  pInformation->ControlState = 2;
  pProperty = &Device_Property;
  pUser_Standard_Requests = &User_Standard_Requests;
  /* Initialize devices one by one */
und bei dem folgenden Funktionsaufruf fliegt der µC in den
hardfault_handler.
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.
Autor: Matthias (Gast)
Datum:

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
Autor: Lukas M. (stuntman)
Datum:

> 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
Autor: Matthias (Gast)
Datum:

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

Siehe Schaltplan!
Autor: Lukas M. (stuntman)
Datum:

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

in der hw_config.h

habe ich folgendes angepasst:
#include "usb_type.h"

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

meinest du das?

LG
Autor: Matthias (Gast)
Datum:

ja
Autor: Lukas M. (stuntman)
Datum:

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
Autor: Lukas M. (stuntman)
Datum:

Hat sonst vielleicht noch jemand einen Lösungsvorschlag wo das Problem
bei meiner Kommunikation liegen kann?
Autor: Matthias (Gast)
Datum:

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;-)
Autor: Johannes W. (waddi)
Datum:

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.
Autor: Thomas Burkhart (escamoteur)
Datum:

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
Autor: Johannes (Gast)
Datum:

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?
Autor: Johannes (Gast)
Datum:

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?
Autor: Johannes (Gast)
Datum:

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?
Autor: Thomas Burkhart (escamoteur)
Datum:

Hi Johannes,

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

Gruß
Tom
Autor: Johannes (Gast)
Datum:

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
Autor: Matthias Blaicher (mabl)
Datum:

Ein guter Einstieg ist imho "usb in a nutshell".
Autor: Thomas Burkhart (escamoteur)
Datum:

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
     for(int i = 0; i < count_out;i++)
 

gesetzt oder wie?

Gruß
Tom
Autor: Johannes W. (waddi)
Datum:

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
Autor: Thomas Burkhart (escamoteur)
Datum:

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
Autor: Matthias Blaicher (mabl)
Datum:

@Johannes W:
Schau dir vielleicht mal die libmaple an. Die sollte fuer deine
Ansprueche voellig ausreichend sein. Sozusagen Arduino fuer den STM32.
Autor: Thomas Klähn (blackfinn)
Datum:

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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net