在STM32中集成USB驱动代码通常涉及使用STM32 HAL库 或LL库 ,并结合USB Device 或USB Host库来实现。以下是实现USB驱动的关键步骤和代码示例:
1. 硬件准备
-
确认STM32型号支持USB(如STM32F103、STM32F4、STM32H7等)。
-
硬件连接:
-
USB DM(Data Minus) →
PA11
(Full Speed USB) -
USB DP(Data Plus) →
PA12
(Full Speed USB) -
需要外部 1.5kΩ 上拉电阻(DP引脚,用于设备模式)。
-
2. 使用STM32CubeMX生成USB代码
(1) 配置时钟
-
在 Clock Configuration 中设置 USB时钟(通常48MHz):
-
如果使用HSE(外部晶振)→ 配置PLL输出48MHz。
-
如果使用HSI(内部RC振荡器)→ 可能需要调整PLL。
-
(2) 启用USB外设
-
在 Pinout & Configuration → Connectivity → USB:
-
选择 Device (FS) 或 Host (FS) 模式。
-
配置 USB中断(NVIC Settings)。
-
(3) 配置USB中间件
-
在 Middleware → USB_DEVICE:
-
选择 Class (如 Communication Device Class (CDC) 或 Human Interface Device (HID))。
-
如果是CDC(虚拟串口),还需配置 USART 用于调试。
-
(4) 生成代码
-
点击 Generate Code,STM32CubeMX会自动生成:
-
USB初始化代码(
MX_USB_DEVICE_Init()
)。 -
回调函数(如CDC的
CDC_Receive_FS()
)。
-
3. 关键代码解析
(1) USB初始化
在 main.c
中,系统初始化后调用:
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init(); // 初始化USB设备
while (1) {
// 主循环
}
}
(2) CDC(虚拟串口)示例
如果选择 CDC类 ,STM32会模拟一个串口(如 /dev/ttyACM0
在Linux上)。关键回调函数:
// 数据接收回调(PC → STM32)
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) {
// 处理接收到的数据(例如回传)
CDC_Transmit_FS(Buf, *Len); // 回传数据到PC
return (USBD_OK);
}
// 发送数据(STM32 → PC)
void SendToPC(uint8_t *data, uint16_t len) {
CDC_Transmit_FS(data, len); // 发送数据
}
(3) HID(人机接口设备)示例
如果选择 HID类(如USB键盘/鼠标):
// 发送键盘报告
void SendKeyPress(uint8_t key) {
uint8_t report[8] = {0};
report[2] = key; // 模拟按键
USBD_HID_SendReport(&hUsbDeviceFS, report, 8);
}
4. 编译与测试
-
编译代码并烧录到STM32。
-
连接USB到PC,检查是否识别:
-
CDC类 → 在设备管理器看到 虚拟串口(COMx)。
-
HID类 → 在设备管理器看到 HID设备。
-
-
使用 PuTTY(CDC) 或 HIDAPI(HID) 测试通信。
5. 常见问题
(1) USB无法识别
-
检查 DP(PA12) 是否有 1.5kΩ上拉(设备模式)。
-
确认 时钟配置正确(48MHz USB时钟)。
-
检查 USB枚举描述符 (如
usbd_desc.c
)。
(2) 数据传输不稳定
-
增加 USB缓冲区大小 (修改
USB_CDC_RX_DATA_SIZE
)。 -
检查 中断优先级(USB中断应较高优先级)。
(3) 如何自定义USB类?
- 修改
usbd_custom_hid.c
或实现 自定义USB类(参考ST官方例程)。
6. 进阶优化
-
使用DMA(减少CPU负载)。
-
实现DFU(USB固件升级) (参考ST的
DfuSe
工具)。 -
USB OTG(Host/Device切换)(适用于STM32F4/F7/H7)。
总结
步骤 | 关键点 |
---|---|
1. CubeMX配置 | 选择USB模式(Device/Host)、Class(CDC/HID) |
2. 生成代码 | 自动生成 MX_USB_DEVICE_Init() 和回调函数 |
3. 实现业务逻辑 | 在 CDC_Receive_FS() 或 HID_SendReport() 处理数据 |
4. 调试 | 检查设备识别、数据传输稳定性 |
如果需要更具体的实现(如 自定义USB类 或 USB音频),可以基于ST提供的例程扩展。