Home

Awesome

LNX build WIN build OSX build

Lightweight USB Device Stack

Requirements

All requirements can be downloaded into a directory specified in environment variable CMSIS using make cmsis command.

Supported hardware

<table> <tr><th>MCU Series</th><th>Features</th><th>Driver</th><th>File</th></tr> <tr> <td rowspan="2">STM32L0x2 STM32L0x3 STM32F070 STM32F0x2 STM32F0x8</td> <td nowrap rowspan="2">Doublebuffered<sup>[2]</sup><br />8<sup>[1]</sup> endpoints<br /> BC1.2</td> <td>usbd_devfs</td> <td>usbd_stm32l052_devfs.c</td> </tr> <tr> <td>usbd_devfs_asm</td> <td>usbd_stm32l052_devfs_asm.S</td> </tr> <tr> <td rowspan="2">STM32L4x2 STM32L4x3 STM32G4 series</td> <td nowrap rowspan="2">Doublebuffered<sup>[2]</sup><br />8<sup>[1]</sup> endpoints<br /> BC1.2</td> <td>usbd_devfs</td> <td>usbd_stm32l433_devfs.c</td> </tr> <tr> <td>usbd_devfs_asm</td> <td>usbd_stm32l052_devfs_asm.S</td> </tr> <tr> <td rowspan="2">STM32L1xx</td> <td nowrap rowspan="2">Doublebuffered<sup>[2]</sup><br />8<sup>[1]</sup> endpoints</td> <td>usbd_devfs</td> <td>usbd_stm32l100_devfs.c</td> </tr> <tr> <td>usbd_devfs_asm</td> <td>usbd_stm32l100_devfs_asm.S</td> </tr> <tr> <td rowspan="2">STM32F102 STM32F103 STM32F302 STM32F303 STM32F373</td> <td nowrap rowspan="2">Doublebuffered<sup>[2]</sup><br />External DP pullup<br />8<sup>[1]</sup> endpoints</td> <td>usbd_devfs</td> <td>usbd_stm32f103_devfs.c</td> </tr> <tr> <td>usbd_devfs_asm</td> <td>usbd_stm32f103_devfs_asm.S</td> </tr> <tr> <td>STM32WB55</td> <td>Doublebuffered<sup>[2]</sup><br />External DP pullup<br />8<sup>[1]</sup> endpoints</td> <td>usbd_devfs</td> <td>usbd_stm32wb55_devfs.c</td> </tr> <tr> <td>STM32L4x5 STM32L4x6</td> <td nowrap>Doublebuffered<br />6 endpoints<br /> BC1.2<br />VBUS detection</td> <td>usbd_otgfs</td> <td>usbd_stm32l476_otgfs.c</td> </tr> <tr> <td>STM32F401 STM32F411</td> <td nowrap>Doublebuffered<br/>4 endpoints<br/>VBUS detection<br/>SOF output</td> <td>usbd_otgfs</td> <td>usbd_stm32f429_otgfs.c</td> </tr> <tr> <td rowspan="2">STM32F4x5 STM32F4x7 STM32F4x9</td> <td nowrap>Doublebuffered<br/>4 endpoints<br/>VBUS detection<br/>SOF output</td> <td>usbd_otgfs</td> <td>usbd_stm32f429_otgfs.c</td> </tr> <tr> <td nowrap>Doublebuffered<br/>6 endpoints<br/>VBUS detection<br/>SOF output</td> <td>usbd_otghs</td> <td>usbd_stm32f429_otghs.c</td> </tr> <tr> <td>STM32F105 STM32F107</td> <td nowrap>Doublebuffered<br/>4 endpoints<br/>VBUS detection<br/>SOF output</td> <td>usbd_otgfs</td> <td>usbd_stm32f105_otgfs.c</td> </tr> <tr> <td rowspan="2">STM32F4x6 STM32F7</td> <td nowrap>Doublebuffered<br/>6 endpoints<br/>VBUS detection<br/>SOF output</td> <td>usbd_otgfs</td> <td>usbd_stm32f446_otgfs.c</td> </tr> <tr> <td nowrap>Doublebuffered<br/>9 endpoints<br/>VBUS detection<br/>SOF output</td> <td>usbd_otghs</td> <td>usbd_stm32f446_otghs.c</td> </tr> <tr> <td>STM32H743</td> <td nowrap>Doublebuffered<br/>6 endpoints<br/>VBUS detection<br/>SOF output</td> <td>usbd_otgfs</td> <td>usbd_stm32h743_otgfs.c</td> </tr> </table>
  1. Single physical endpoint can be used to implement
  1. At this moment BULK IN endpoint can use both buffers, but it is not real doublebuffered.

  2. Tested with STM32L052K8, STM32L100RC, STM32L476RG, STM32F072C8, STM32F103C8, STM32F103CB, STM32F303CC, STM32F303RE, STM32F429ZI, STM32F105RBT6, STM32F107VCT6, STM32L433CCT6, STM32F070CBT6, STM32G431RB, STM32F411CEUx, STM32F405RG, STM32F446RE, STM32F373CC, STM32L053R8, GD32F103C8T6, STM32F745VE, STM32F401CE, STM32H743. See hardware.md for details.

Don't copy-paste the startup code from the demo without considering RCC and USB clock requirements.

The HSI oscillator usually does not meet the timing requirements for USB and may cause performance loss and a high error rate.

Implemented definitions for classes

  1. USB HID based on Device Class Definition for Human Interface Devices (HID) Version 1.11
  2. USB DFU based on USB Device Firmware Upgrade Specification, Revision 1.1
  3. USB CDC based on Class definitions for Communication Devices 1.2
  4. USB TMC based on USB Device Test and Measurement Class Specification, Revision 1.0

Using makefile

make module MODULE=path/module.a DEFINES="mcu specified defines" CFLAGS="cpu specified compiler flags"
make bluepill program
make stm32l052x8
make help

Default values:

VariableDefault ValueMeans
CMSIS./CMSISpath to CMSIS root folder
CMSISDEV$(CMSIS)/Devicepath to CMSIS device folder
CMSISCORE$(CMSIS)/CMSIS/Include $(CMSIS)/CMSIS/Core/Includepath to CMSIS core headers
MCUstm32l100xcMCU selection for demo project
CFLAGS-mcpu=cortex-m3 -mfloat-abi=softMCU specified compiler flags
DEFINESSTM32L1 STM32L100xCMCU specified defines
STPROG_CLI~/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin/STM32_Programmer_CLIPath to the ST Cube Programmer CLI
OPTFLAGS-OsCode optimization flags

Useful Resources

  1. USB Implementers Forum official site
  2. USB Made Simple
  3. LUFA - the Lightweight USB Framework for AVRs.
  4. Open Source ARM cortex m microcontroller library