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?
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.
Datum:
Ich vermute die Applikation erwartet eine STM32-Dev-Kit- Hardware-Umgebung. Die USB-Disconnect-Schaltung ist da?
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.
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
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.
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.
Datum:
Nein Windows findet garnichts, das habe Ich auch im Gerätemanager geprüft. Ich werde jetzt erstmal die Schaltung genau prüfen.
Datum:
Kuck Dir auch mal meine Schaltung und Beispiel bei [[STM32 USB-FS-Device Lib] an. Gruß Tom
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?
Datum:
Hast Du nen externen Quarz und auch auf 72Mhz gestellt? Sonst tuts nicht
Datum:
Und hast Du die interne PLL auf 72Mhz eingestellt? Das Problem hatte ich zuerst
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
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?
Datum:
Ich habe noch etwas festgestellt mein MC arbeitet mit 2,5V könnte sich dieses die Ursache sein?
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.
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
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.
Datum:
Zur Connectitvity-Line gehören STM32F107 und STM32F105. Der STM32F103C6T6 gehört wohl nicht dazu, er hat aber USB und CAN.
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...
Datum:
Nimm mal mein Code Beispiel aus dem Artikel, da ist alles was connectivity is rausgeschmissen Gruß Tom
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?
Datum:
Wenn Du mit dem Einstecken wartest bis Deine Software läuft, sollte es auch gehen. Nur andersherum gibt es schwierigkeiten. Gruß Tom
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...
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?
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
Datum:
welche maximale geschwindigkeit ist über diesen treiber als virtual com port erzielbar????
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.
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
Datum:
richtig MCBastler123.. ein standard CDC nutzt aber bulk endpoints.. @ usb2.0 full speed -> jede ms 64 Byte! also 64kb/s..
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
Datum:
Ja habe mich wohl geiirt. Dann müßte es der Ausgabe Buffer auf der PC Seite sein der überlaufen könnte.
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ß
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?
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.
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?
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...
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...
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.
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
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.
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
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
Datum:
Lukas M. schrieb: > Wo aktiviere ich das DISC-Signal bzw. was ist das für eine Einstellung? Siehe Schaltplan!
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
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
Datum:
Hat sonst vielleicht noch jemand einen Lösungsvorschlag wo das Problem bei meiner Kommunikation liegen kann?
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;-)
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.
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
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?
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?
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?
Datum:
Hi Johannes, natürlich wird immer mit USB Geschwindigkeit übertragen. Womit sendest Du denn die Daten vom PC aus? Gruß Tom
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
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
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
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
Datum:
@Johannes W: Schau dir vielleicht mal die libmaple an. Die sollte fuer deine Ansprueche voellig ausreichend sein. Sozusagen Arduino fuer den STM32.
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.

