Forum: Mikrocontroller und Digitale Elektronik STM32F1 mit cubemx: printf über virtual serial port ausgeben


von Tim  . (cpldcpu)


Lesenswert?

Ich habe heute angefangen, mir den/die/das STM32cubeMx anzuschauen. Als 
Entwicklungumgebung nutze ich Keil Uvision 5.

Als erstes wollte ich etwas vermeintlich einfaches machen: Datenausgabe 
per printf über den virtuellen seriellen port per USB.

Leider scheint das ganze doch nicht straightforward zu sein - gibt es 
schon eine fertige Lösung?

Hier stecke ich fest:

- CubeMX hat mir  brav den Initialisierungscode generiert, so dass mein 
Controller als entsprechendes USB-Device gefunden wird.

- Danach habe ich versucht, mit "CDC_Transmit_FS" Strings zu 
verschicken. Die Funktion scheint fehlerhaft zu sein, denn 
"hUsbDevice_0" kann nicht initialisiert werden. Das konnte ich durch 
manuelle initialsierung der Variable beheben.

- Um printf umzulenken, muss man in der Keil-Lib "fputc" überladen. 
Funktioniert so weit.

- Leider habe ich feststellen müssen, dass das CubeMX USB_CDC_IF keinen 
vernünftigen Ringbuffer zur Verfügung stellt.

-> keine Lust mehr...

von Tim  . (cpldcpu)


Lesenswert?

Nachtrag, falls jemand ähnliche Probleme hat:

1) Habe den pragmatischen Weg genommen und mit sprintfs in einen string 
geprintent - dann Blocktransfer

2) CubeMX fängt einige Nullpointer nicht ab, was zu einer Exception 
führt wenn das USB-Interface noch nicht initialisiert ist.

Fix:

in usbd_cdc_if.c:

1
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
2
{
3
  uint8_t result = USBD_OK;
4
  /* USER CODE BEGIN 7 */ 
5
   hUsbDevice_0 = &hUsbDeviceFS;
6
  
7
  if (hUsbDevice_0->pClassData) {
8
    USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len);   
9
    result = USBD_CDC_TransmitPacket(hUsbDevice_0);
10
  }
11
12
  /* USER CODE END 7 */ 
13
  return result;
14
}

So wird nur dann gesendet, wenn das USB-Device initialisiert ist.

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.