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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.