Forum: Mikrocontroller und Digitale Elektronik STM32: Komisches Verhalten zwischen USB VCP und GPIO


von Felix F. (wiesel8)


Lesenswert?

Hallo,

ich habe einen STM32F103 (Nucleo Board), an dem ich (testweise) den VCP 
über USB betreibe (nicht der VCP über STlink).

Ich habe also DP und DM (PA11 und PA12) und 3.3V vom Board auf ein 
Steckbrett geführt mit USB Stecker (mit 1,5K zwischen 3.3V und DP und 22 
Ohm zwischen USB und STM)

Diese Schaltung funktioniert soweit einwandfrei. STM wird als VCP 
erkannt und ich kann Daten senden und empfangen.

Damit ich die USB Verbindung steuern kann, wollte ich einen GPIO für den 
PullUp (anstatt der 3.3V direkt) verwende. Mit PA8 (vermutlich auch 
anderen) funktioniert das auch einwandfrei wie es sein soll.

Jetzt kommt das komische...
Wenn ich PC9/PC8 (Mehr konnte ich jetzt noch nicht testen) initialisiere 
(vor der Initialisierung von USB), dann erkennt Windows den VCP nicht 
mehr und meldet nur noch Unbekanntes Gerät.
Setze ich die Initialisierung von PortC nach die Initialisierung von 
USB, funktioniert es wieder??

mfg


Funktioniert NICHT:
1
int main(void)
2
{
3
  d_printf("\fStarting...\n");
4
5
  // Set SysTick to 1ms
6
  SysClock_Init();
7
  
8
  GPIO_InitTypeDef GPIO_InitStructure;
9
10
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
11
12
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
13
14
  // Configure pin
15
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
16
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
17
  GPIO_Init(GPIOC, &GPIO_InitStructure);
18
19
  GPIO_ResetBits(GPIOC, GPIO_Pin_9);
20
21
  USB_InitVCP();

Funktioniert:
1
int main(void)
2
{
3
  d_printf("\fStarting...\n");
4
5
  // Set SysTick to 1ms
6
  SysClock_Init();
7
  
8
  USB_InitVCP();
9
  
10
  GPIO_InitTypeDef GPIO_InitStructure;
11
12
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
13
14
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
15
16
  // Configure pin
17
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
18
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
19
  GPIO_Init(GPIOC, &GPIO_InitStructure);
20
21
  GPIO_ResetBits(GPIOC, GPIO_Pin_9);

von Jim M. (turboj)


Lesenswert?

Felix F. schrieb:
> Damit ich die USB Verbindung steuern kann, wollte ich einen GPIO für den
> PullUp (anstatt der 3.3V direkt) verwende. Mit PA8 (vermutlich auch
> anderen) funktioniert das auch einwandfrei wie es sein soll.

Mach den mal LOW für ca. 1 Sekunde, und dann erst high direkt vor dem 
USB_InitVCP() Aufruf. Das ist dann ein sauberes "Abstecken" und wieder 
"Anstecken" des Geräts.

von Felix F. (wiesel8)


Lesenswert?

Jim M. schrieb:
> Felix F. schrieb:
>> Damit ich die USB Verbindung steuern kann, wollte ich einen GPIO für den
>> PullUp (anstatt der 3.3V direkt) verwende. Mit PA8 (vermutlich auch
>> anderen) funktioniert das auch einwandfrei wie es sein soll.
>
> Mach den mal LOW für ca. 1 Sekunde, und dann erst high direkt vor dem
> USB_InitVCP() Aufruf. Das ist dann ein sauberes "Abstecken" und wieder
> "Anstecken" des Geräts.

Diese Funktion verwende ich aktuell gar nicht (PA8 ist immer HIGH). 
Wollte nur sicher gehen, das ein GPIO (ohne externe Beschaltung, die 
überall zu finden ist) ausreichend ist.

Aktuell starte ich die Software und stecke erst DANACH den Stecker in 
den PC. Danach wird der STM auch einwandfrei erkannt. Wenn ich aber dann 
die Initialisierung für Port C hinzufügen (Es wird wirklich nichts 
geändert, außer die paar Code Zeilen extra), dann funktioniert es nicht 
mehr. Füge ich den Code aber nach der USB_Init hinzu, funktionier es 
wieder.

USB verwendet lediglich PORT A, warum funktioniert es nicht mehr wenn 
ich was am PORT C mache??

mfg

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Felix F. schrieb:
> USB verwendet lediglich PORT A, warum funktioniert es nicht mehr wenn
> ich was am PORT C mache

Vermutlich, weil Du irgendetwas falsch machst!

Zeige minimalen Code und ggf den Schaltplan, dann kann die evt 
weitergeholfen werden...

von Felix F. (wiesel8)


Angehängte Dateien:

Lesenswert?

Vom Board gehen genau die 3 Kabel wie in der Zeichnung zu sehen weg 
Richtung USB.

Code habe ich im ersten Post bereits gepostet, die while(1)-Schleife am 
Schluss muss ich dir wohl nicht mehr extra posten?

Die USB_InitVCP führt lediglich die Initialisierung wie hier im VCP 
Beispiel durch: 
http://www.st.com/en/embedded-software/stsw-stm32121.html

Nochmal extra für dich, es funktioniert alles wie es soll, außer ich 
initialisiere den (NICHT angeschlossenen) Port C vor USB.

mfg

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Bist Du sicher, dass Du keine Bruecke zwischen PC8/PC9/PA8 hast? Die 
Pins liegen nebeneinander!

von Felix F. (wiesel8)


Lesenswert?

Uwe B. schrieb:
> Bist Du sicher, dass Du keine Bruecke zwischen PC8/PC9/PA8 hast? Die
> Pins liegen nebeneinander!

Höchstens, wenn das Nucleo Board einen Defekt hat
https://developer.mbed.org/media/uploads/adustm/nucleo_f103rb_morpho_right_2016_7_21_1.png

mfg

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.