|
| 1 | +--- |
| 2 | +id: xrusb-plat-dev-stm32 |
| 3 | +title: STM32 USB 实现 |
| 4 | +sidebar_position: 1 |
| 5 | +--- |
| 6 | + |
| 7 | +# STM32 USB 实现 |
| 8 | + |
| 9 | +STM32一共有四种USB设备,如下所示。可以参考代码生成工具自动生成的CDC代码,了解USB设备的端点配置。 |
| 10 | + |
| 11 | +| 名称 | 角色 | 端点是否为双向 | 双缓冲 | DMA支持 | |
| 12 | +| ------------- | --------- | -------------------- | ------------- | ------- | |
| 13 | +| USB_DEVICE_FS | 从机 | 硬件双缓冲不支持双向 | 软件/硬件实现 | 不支持 | |
| 14 | +| USB_DRV_FS | 主机/从机 | 硬件双缓冲不支持双向 | 软件/硬件实现 | 不支持 | |
| 15 | +| USB_OTG_FS | 主机/从机 | 双向 | 支持 | 不支持 | |
| 16 | +| USB_OTG_HS | 主机/从机 | 双向 | 支持 | 支持 | |
| 17 | + |
| 18 | +## USB_DEVICE_FS/USB_DRV_FS |
| 19 | + |
| 20 | +支持两种端点的声明方式,缓冲区端点号自动递增: |
| 21 | + |
| 22 | +1. `{usb_fs_ep0_in_buf, usb_fs_ep0_out_buf, 8, 8}`:声明一个双向端点,无法使用硬件双缓冲 |
| 23 | + - usb_fs_ep0_in_buf: EP0 IN软件缓冲区数组 |
| 24 | + - usb_fs_ep0_out_buf: EP0 OUT软件缓冲区大小 |
| 25 | + - 8: EP0 IN硬件RAM大小 |
| 26 | + - 8: EP0 OUT硬件RAM大小 |
| 27 | +2. `{usb_fs_ep2_in_buf, 16, true}`:声明一个单向端点,使用硬件双缓冲 |
| 28 | + - usb_fs_ep2_in_buf: EP2 IN软件缓冲区数组 |
| 29 | + - 16: EP2 IN硬件RAM大小 |
| 30 | + |
| 31 | +为了确保传输速度,对于bulk端点,硬件RAM大小应当不小于64,软件缓冲区可以远大于64,大小与传输速度成正比。 |
| 32 | + |
| 33 | +```cpp |
| 34 | +STM32USBDeviceDevFs usb_fs( |
| 35 | + /* USB Handler */ |
| 36 | + &hpcd_USB_FS, |
| 37 | + /* Endpoints */ |
| 38 | + { |
| 39 | + {usb_fs_ep0_in_buf, usb_fs_ep0_out_buf, 8, 8}, |
| 40 | + {usb_fs_ep1_in_buf, usb_fs_ep1_out_buf, 128, 128}, |
| 41 | + {usb_fs_ep2_in_buf, 16, true} |
| 42 | + }, |
| 43 | + USB::DeviceDescriptor::PacketSize0::SIZE_8, |
| 44 | + 0x483, 0x5740, 0xF407, |
| 45 | + {&USB_FS_LANG_PACK}, |
| 46 | + {{&usb_fs_cdc}} |
| 47 | +); |
| 48 | +``` |
| 49 | + |
| 50 | +## USB_OTG_FS/USB_OTG_HS |
| 51 | + |
| 52 | +STM32USBDeviceOtgHS和STM32USBDeviceOtgFS同样支持两种端点声明方式,IN/OUT端点缓冲区端点号各自自动递增: |
| 53 | + |
| 54 | +1. `{{usb_otg_fs_ep0_in_buf, 8},...}`:in端点必须声明缓冲区与Fifo大小 |
| 55 | +2. `{usb_otg_fs_ep0_out_buf, ...}`:out端点只需要声明缓冲区 |
| 56 | + |
| 57 | +所有out端点共用一个rx fifo,应该分配较大的空间。为了保证速度,IN端点Fifo的大小不应小于包大小,软件缓冲区大小与传输速度成正比。 |
| 58 | + |
| 59 | +```cpp |
| 60 | +// STM32USBDeviceOtgHS usb_hs( |
| 61 | +STM32USBDeviceOtgFS usb_fs( |
| 62 | + /* USB Handler */ |
| 63 | + &hpcd_USB_OTG_FS, |
| 64 | + /* RX Fifo Size */ |
| 65 | + 256, |
| 66 | + /* Out Endpoints */ |
| 67 | + {usb_otg_fs_ep0_out_buf, usb_otg_fs_ep1_out_buf}, |
| 68 | + /* In Endpoints */ |
| 69 | + {{usb_otg_fs_ep0_in_buf, 8}, {usb_otg_fs_ep1_in_buf, 128}, {usb_otg_fs_ep2_in_buf, 16}}, |
| 70 | + USB::DeviceDescriptor::PacketSize0::SIZE_8, |
| 71 | + 0x483, 0x5740, 0xF407, |
| 72 | + {&USB_OTG_FS_LANG_PACK}, |
| 73 | + {{&usb_otg_fs_cdc}} |
| 74 | + ); |
| 75 | + usb_fs.Init(); |
| 76 | + usb_fs.Start(); |
| 77 | +``` |
| 78 | +
|
| 79 | +## 运行 |
| 80 | +
|
| 81 | +添加以下语句即可。 |
| 82 | +
|
| 83 | +```cpp |
| 84 | +usb_fs.Init(); |
| 85 | +usb_fs.Start(); |
| 86 | +``` |
| 87 | + |
| 88 | + |
0 commit comments