Forum: Mikrocontroller und Digitale Elektronik STM32 USB CDC Funktion umplatzieren


von Daniel (Gast)


Lesenswert?

Hallo zusammen!

Ich habe ein kleines Projekt vor mir, wobei ein älters Modul, welches 
über USB->FT232->AT89S51  durch einen  STM32 ersetzt werden soll, 
welcher schon über USB verfügt. Wichtig ist hierbei das die neue Platine 
kompatibel zur alten ist, also die selben Befehle verschickt/empfängt

Ich habe nun bereits mit einem F429ZI-Nucleo Board erste Schritte im 
Bereich USB gemacht, und erfolgreich mit dem PC bzw. der Modulsoftware 
auf dem PC kommuniziert - funktioniert einwandfrei.

Nun stecke ich aber etwas fest, in der data "usbd_cdc_if.c" werden ja 
die Com-Daten empfangen
1
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
2
{
3
  /* USER CODE BEGIN 6 */
4
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
5
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
6
  return (USBD_OK);
7
  /* USER CODE END 6 */
8
}

Das ist mir auch schlüssig, und ich kann auch in diese Funktion z.b. die 
Bufferdaten bearbeiten und auf die empfangenden Kommandos antworten.

Was ich nun aber tun möchte, ist das diese Funktion eine andere Funktion 
von mir aufruft, also z.b. "handle_cmd(buf, len)".
Dazu möchte ich z.b. ein neues File anlegen und in main.c inkludieren. 
Das ist ja kein Problem und habe ich schon oft gemacht,  wo ich aber 
aktuell feststecke ist, wie die Funktion CDC_Receive_FS meine eigene 
Funktion dann aufrufen kann. Das ganze ist nötig, da ja beim Empfangen 
eines Kommandos einige dinge getan werden müssen (Länge/Inhalt prüfen, 
je nach Kommandobyte etwas ausführen, eine entsprechende Antwort 
zusammenstellen etc etc).

Wie kann so etwas gemacht werden?

Vielen Dank für eure Unterstützung und ein schönes Wochenende,
Gruss Daniel

von jo mei (Gast)


Lesenswert?

Ich denke du suchst die Lösung die hier

Beitrag "Wie VCP Daten einlesen? STM32f072 STM32CubeMX Projekt"

beschrieben ist.

von jo mei (Gast)


Lesenswert?

Sinnigerweise haben die Software-Leute von STM den gezeigten, vom
Code-Generator vorgefertigten Code ja in einen Rahmen gesetzt

  /* USER CODE BEGIN 6 */

  /* USER CODE END 6 */

und signalisieren damit dass hier durchaus in das Sourcen-
Gefüge von STM "eingegriffen" werden kann/soll.

von cdc (Gast)


Lesenswert?

Nimm das https://github.com/jrahlf/stm32_usb_cdc_improved_if (ist von 
mir).
Die Variante von ST ist scheiße, ich habe da einige Verbesserungen 
eingebaut.

Damit kannst du CDC_DataReceivedHandler() überschreiben, musst natürlich 
aufpassen, dass das im Interruptkontext aufgerufen wird.

von Niklas Gürtler (Gast)


Lesenswert?


von jo mei (Gast)


Lesenswert?

Niklas Gürtler schrieb:
> Noch eine Alternative:

"Alternative" würde bedeuten dass man den Vorschlag anstelle
des ersten oder zweiten ohne viel Aufhebens einsetzen kann.

Diese Möglichkeit kann ich hier jedoch nicht erkennen. Auch
wird sich der TO nicht mit der Einbindung in ein Sourcen-
Gefüge auseinandersetzen (wollen) das von CubeMX Codegenerator
erzeugt worden ist. Da wären nämlich noch andere Schnittstellen
zu bedienen.

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.