本文将介绍APM32F103的USB设备模式,包括控制传输(Control)、批量传输(Bulk)、中断传输(Interrupt)和同步传输(Isochronous)的区别,并以Mass Storage Class(MSC)为例进行详细配置和实现。
1. USB设备模式的四种类型
- 控制传输(Control):适用于初始化阶段的数据传输,如设备描述符和配置描述符。
- 批量传输(Bulk):常用于大数据传输,适配块设备(如MSC)的读写。
- 中断传输(Interrupt):周期性数据传输,适合键盘、鼠标等设备。
- 同步传输(Isochronous):主要用于实时数据,如音频和视频流。
2. MSC示例:配置与实现
2.1 硬件初始化配置USB GPIO和时钟:
- #include "apm32f10x.h"
- #include "drv_usb_device.h"
- void USB_Init(void) {
- // 启用USB时钟
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_USB);
-
- // 配置USB引脚为功能模式
- GPIO_Config_T gpioConfig;
- gpioConfig.pin = GPIO_PIN_11 | GPIO_PIN_12; // USB D+ 和 D-
- gpioConfig.mode = GPIO_MODE_AF_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- GPIO_Config(GPIOA, &gpioConfig);
- }
2.2 配置MSC类初始化MSC类并注册协议处理函数:
- #include "usbd_class_msc.h"
- #include "usbd_core.h"
- void USB_MSC_Config(void) {
- // 初始化USB设备核心
- USBD_Init();
- // 注册MSC类处理函数
- USBD_RegisterClassHandler(&USBD_MSC_ClassHandler);
- // 启用USB设备
- USBD_Enable();
- }
2.3 数据收发实现批量传输实现:
- void MSC_BulkDataHandler(void) {
- if (USBD_ReadIntFlag(USBD_INT_CTR)) {
- // 判断传输方向
- if (USBD_ReadDir() == 0) {
- // OUT方向数据接收
- USBD_MSC_BOT_OutData(USBD_ReadEP());
- } else {
- // IN方向数据发送
- USBD_MSC_BOT_InData(USBD_ReadEP());
- }
- }
- }
2.4 主程序入口在主函数中调用初始化和配置函数:
- int main(void) {
- // 初始化系统时钟和USB硬件
- SystemInit();
- USB_Init();
- // 配置USB MSC类
- USB_MSC_Config();
- while (1) {
- MSC_BulkDataHandler();
- }
- }
3. MSC传输流程图

4. USB设备模式的其他应用场景
除了MSC(大容量存储类),APM32F103的USB设备模式还支持其他常见设备类,以下是几个典型的应用场景及其实现思路:
4.1 HID(Human Interface Device,人体接口设备)HID类适用于键盘、鼠标或游戏手柄等设备。其传输方式主要基于中断传输。
- 端点配置:通常配置一个IN端点用于向主机发送数据。
- 协议处理:需要实现标准的HID描述符和报告格式,具体内容可以参考USB HID规范。
4.2 CDC(Communication Device Class,通信设备类)CDC类主要用于虚拟串口通信,通过USB接口模拟传统的UART通信。
- 端点配置:需要配置一个控制端点(用于管理)、一个IN端点(数据发送)和一个OUT端点(数据接收)。
- 实现功能:
- 主机通过控制端点发送波特率和数据格式等配置指令。
- 数据通过批量传输端点实现双向通信。
4.3 Audio(音频设备)Audio类适用于麦克风、耳机或扬声器等音频设备。它采用同步传输来保证音频数据的实时性。
- 端点配置:一个IN端点(用于音频采集数据)或OUT端点(用于播放音频数据)。
- 音频流处理:需要配置固定的采样率和数据帧大小,并根据主机的反馈调整同步机制。
5. 结语
通过本文的示例和说明,用户可以快速实现基于APM32F103的USB设备模式开发,并了解如何根据实际需求选择合适的设备类(MSC、HID、CDC、Audio等)。在实际开发中,可以参考官方库文档及本文代码示例进行扩展。
|