Hallo zusammen,
mit HID funktionieren USB-Geräte auch unter Windows "einfach so" ohne expliziten Treiber. Serielle Schnittstelle und CDC sind 2023 meines Erachtens längst reif für die Rente.
Auf der Basis der Library von W.S. habe ich deswegen die angehängte kleine Library für STM32 geschrieben. Sie kann Reports mit 63 Byte zwischen Host (PC) und Device (µC) hin und her schicken. Bisher ist der Code nur auf einem STM32F042 getestet. Ich wäre dankbar, wenn jemand versuchen würe, das auf einem STM32F103 o.ä. zu testen und ggf. den Code anzupassen (bitte passende #define setzen)
Code anbei. Anwendungshinweise:
- Rechner samt USB in STM32CubeMX konfigurieren. USB-Middleware NICHT einbinden/konfigurieren. Wer mag, kann natürlich CubeMX ganz weglassen und die Register (Clock und GPIO) per HAL oder zu Fuß setzen.
- usb.c und usb.h ins Projekt einbinden
- Den USB_IRQHandler() in stm32xxx_it.c auskommentieren oder mit "__attribute((weak))" versehen bzw. (für die HAL-Fraktion) dafür sorgen, dass der USB-Interrupt USB_IRQHandler() in usb.c aufruft.
- Der Rest sollte über die main.c und die Kommentare in usb.h halbwegs klar sein.
- Test unter Windows mit SimpleHIDWrite (das Programm muss man an und ab neu starten). Reports von Host an Device haben die ReportID 2. Wenn man "Falscher Parameter (57)" in SimpleHIDWrite bekommt, hat man die falsche ReportID angegeben. Reports vom Device an den Host kommen mit ReportID 1.
- Für Python gibt es PyWinUSB und HidAPI. Erfahrungsberichte willkommen.
Wenn es nicht tut:
- Passen alle Clocks, und sind sie aktiviert? USB braucht 48 MHz.
- Ist der NVIC richtig eingestellt? Die Interrupt-Nummer für USB steht im Reference Manual unter "Interrupt and exception vectors"
- Wird der Pullup für die USB-Erkennung aktiviert? Die neueren Devices machen das über DPPU, aber ältere wie der SM32F103 brauchen da etwas Handarbeit und einen externen Widerstand. Anpassung am Ende von UsbSetup().
Anmerkungen:
- Über das "Warum" mag ich nicht diskutieren.
- Ich erhebe nicht den Anspruch auf Perfektion. Sachliche Kritik an der Library ist willkommen, bevorzugt mit Korrekturvorschlag.
- Wer nicht weiß, welche Polling Rate er nehmen soll, kann 125 reinschreiben (das ist der USB-Standardwert)
- Mein Coding Style unterscheidet sich von dem von W.S. Das führt im Ergebnis zu einem etwas unschönen Mix. Ist so.
- Ein paar Kommentare sind aus CDC-Zeiten übrig geblieben und sind noch aufzuräumen.
Frohes neues Jahr allen!