Forum: Mikrocontroller und Digitale Elektronik STM32F10xE High Density - VirtualCOM mit USB


von Harald (Gast)


Lesenswert?

Hallo,

ich versuche mit einem STM32F10xE 5120KByte Eval Board die VCOM 
Schinttstelle via USB zu realisieren. Ich benutze IAR EWArm.
Ich komme überhaupt nicht weiter. Das Beispielprojekt habe ich geöffnet 
und via "DOwnload and Debug" gestartet aber nichts tut sich. ich stecke 
das Board vom ST-Link ab und via usb an einen PC aber nichts passiert.

Hat jemand vielleicht ein konkretes Beispiel? oder ein Projekt oder eine 
Hilfe? Ich möchte gerne die Schnittstelle als Flashloader/Debugger und 
als Datenschnittstelle benutzen aber bekomme es nich hin.

Grüße
Harry

von Arne (Gast)


Lesenswert?

Ich weiss zur VCOM Demo nur soviel: als ich im Jan.2009 die ST Demo für 
unser Projekt umgeschrieben habe, traten Fehler bei der Übertragung auf. 
Das lag IIRC daran, dass ST keinerlei Flusskontrolle eingebaut hatte, 
d.h. der PC konnte den STM32 überfahren, wenn er schnell genug schickt. 
Weiterhin habe ich dann noch einen SW-Ringpuffer eingebaut und dann ging 
es. Infos habe ich im ST-Forum gefunden. Kann allerdings sein, dass ST 
mal ausnahmsweise die Tipps im Forum berücksichtigt hat und die eigene 
Software entbuggt hat. Auch ein Grund, warum ich mein eigenes BSP 
geschrieben habe und nicht die ST-Lib nehme... man lernt die HW einfach 
besser kennen und kann sich selbst helfen wenns klemmt.
Inzwischen bin ich aber soweit zu sagen, dass die VCOM Lösung Humbug 
ist. Des öfteren meint Windoof, dass die Schnittstelle nach Schließen 
immer noch geöffnet sei. Da hilft dann nur Windoze neu zu booten. Weiss 
nicht, ob es am ST-VCOM Treiber oder unserer eingekauften RS232 Lib 
liegt.

BTW: erkennt Windoof beim Verbinden mit dem Board ein neues USB Gerät?

ciao, Arne

von Matthias K. (matthiask)


Lesenswert?

hw_config.c anpassen, je nach Board oder falls EVA-Board unterstützt 
wird auch in der platform_config.h möglich::
1
#define USB_DISC_H  GPIO_SetBits(GPIOC,GPIO_Pin_11)
2
#define USB_DISC_L  GPIO_ResetBits(GPIOC,GPIO_Pin_11)
3
4
#define USB_SELECT   USB_DISC_L    /* USB Aktiv */
5
#define USB_DESELECT USB_DISC_H    /* USB Inaktiv (USBDP liegt auf 3.3V */
6
7
/*******************************************************************************
8
* Function Name  : USB_Cable_Config
9
* Description    : Software Connection/Disconnection of USB Cable
10
* Input          : None.
11
* Return         : Status
12
*******************************************************************************/
13
void USB_Cable_Config (FunctionalState NewState) {
14
15
  if (NewState == ENABLE) {
16
    USB_SELECT;
17
    // GPIO_SetBits(USB_CONNECT, USB_CONNECT_PIN);
18
  } else {
19
    USB_DESELECT;
20
    //GPIO_ResetBits(USB_CONNECT, USB_CONNECT_PIN);
21
  }
22
}

Testprogramm
1
#include "usb_lib.h"
2
#include "usb/usb_desc.h"
3
#include "usb/hw_config.h"
4
#include "usb/usb_pwr.h"
5
6
extern __IO uint32_t count_out;
7
extern uint8_t buffer_out[VIRTUAL_COM_PORT_DATA_SIZE];
8
9
#include <string.h>             // Stringfunktion
10
#include <stdio.h>              // Standardfunktion
11
#include <stdlib.h>             // Standardbibliothek
12
13
//***********************************************************************************************
14
// USB Initialisierung
15
//***********************************************************************************************
16
void usb_comport_init (void) {
17
18
  USB_Cable_Config(DISABLE);    // USB Kabel abschalten (USBP wird auf +3.3V gelegt)
19
  Set_USBClock();               // USB Taktung auf 48MHz (bei 72MHz Systemtakt, Teiler = 1.5)
20
  USB_Interrupts_Config();      // USB Interrupt konfigurieren
21
  USB_Init();                   // USB Grundinitialisierung
22
}
23
24
...
25
26
//***********************************************************************************************
27
// USB Test auf Datenempfang
28
//***********************************************************************************************
29
void usb_receive_check (void) {
30
uint16_t i;
31
32
  if (bDeviceState == CONFIGURED) {
33
    // USB korrekt initialisiert und betriebsbereit
34
    printf_tft(1,40,"USB konfiguriert (OK) ");
35
    if (count_out) {
36
      // Mind. 1 Byte empfangen
37
      sprintf(lcd.buffer,"B: %u   ",(unsigned int) count_out);
38
      printf_tft(180,20,lcd.buffer);
39
      for (i = 0; i < count_out; i++) {
40
        // Ausgabe der empfangenen Bytes
41
        print_char_8x14_tft (x, y, buffer_out[i]);
42
      }
43
      SetEPRxValid(ENDP3);  // USB Empfangsfreigabe erneuern
44
      count_out = 0;        // USB Empfangs-Index rücksetzen
45
    }
46
  } else {
47
      printf_tft(1,40,"USB nicht konfiguriert");
48
  }
49
}
50
51
//***********************************************************************************************
52
// USB Test Daten senden
53
//***********************************************************************************************
54
void usb_send_test (void) {
55
  uint8_t usb_buffer[] = { "Test-String STM32 USB Virtual Com Port\n\r" };
56
57
  if (bDeviceState == CONFIGURED) {
58
    // USB korrekt initialisiert und betriebsbereit
59
    USB_SIL_Write(EP1_IN, usb_buffer, strlen((const char *)usb_buffer));    // USB Zeichenkette senden
60
    SetEPTxValid(ENDP1);    // USB Sendefreigabe erneueren
61
    clear_tft(WHITE);
62
    font_set_tft(FONT_8X14, BLUE, WHITE, AT_STANDARD);
63
    printf_tft(1,60,"USB Test-Sting gesendet!   ");
64
    delay(200);
65
  } 
66
}

Das USB Comport Demo funktioniert bei mir, Selbstbau Board mit 
STM32F103RE. Ab und zu blokiert auch hier der Comport am PC, meist aber 
beim testen und wenn man die Com nicht ordnungsgemäß schließt. Ganz 
sauber ist der Treiber nicht. Auch Datenverluste hatte ich schon wie 
oben beschrieben, wenn man die Empfangsdaten nicht schnell genug abholt. 
Das sollte aber im Interrupt passieren, was ich bisher wegen der rel. 
kleinen Datenmenge nicht mache.

von Harald (Gast)


Lesenswert?

@anonym Nein der wird nicht mal als neues gerät erkannt. Es tut sich 
garnichts.

@Matthias: Ich werds mal versuchen. Soll ich einfach in IAR deinen 
source code reinschreiben oder soll das eine win32 Anwendgung sein?

von Harald (Gast)


Lesenswert?

BTW: gibts eine andere USB/VCOM Lösung ? Es geht mir darum einfach daten 
in meine Win Applikation einzulesen und zu debuggen/flashen (flashen ist 
wichtiger).

von Matthias K. (matthiask)


Lesenswert?

Harald schrieb:
> @Matthias: Ich werds mal versuchen. Soll ich einfach in IAR deinen
> source code reinschreiben oder soll das eine win32 Anwendgung sein?

Bist Du STM32 Einsteiger? Der Frage nach ja. Dann solltest Du nicht 
gleich mit USB anfangen, ist schon etwas schwerere Kost.

Meine Bsp. sind nur als Denkanstöße, nicht als komplette Lösung zu 
sehen.

von Thomas B. (escamoteur)


Lesenswert?

Guck doch einfach mal hier:

http://www.mikrocontroller.net/articles/STM32_USB-FS-Device_Lib

ich hatte eigentlich keine Probleme das zum laufen zu bringen.

Gruß
Thomas

von Klaus (Gast)


Lesenswert?

ich habe auch dieses Beispiel mal getestet aber leider kommt bei window 
unbekantes Gerät.
Habe dann mal in Hterm geschaut da wird mir nur eine Serielle 
Schnittstelle Angezeigt.

Den Virtuellen Comtreiber habe ich installiert aber nix geht.

Mit den Beispiel welches ich zu dem Board bekommen hab läuft diese
"Mass_Storage" einwandfrei ich kann Daten von der SD-Card lesen und 
schreiben auf dem Board.

Nur diese Beispiel VCP geht nicht bei mir

kann mir einer Weiterhelfen

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.