APM32F4xx 系列内置高速 + 全速双 USB OTG 控制器,自带高速 PHY,支持主机、从机自动切换,可直接实现 USB 串口、U 盘读写、HID 设备等功能。AN1087 应用笔记基于官方 OTG SDK,把 USB 原理、从机开发、主机状态机、枚举流程、数据收发全部讲透,新手也能快速做出稳定 USB 项目。
资料获取:AN1087_APM32F4xx_OTG应用笔记
1. APM32F4xx OTG 核心特性(先看懂再开发)
- 支持 USB 2.0,OTG 双角色:ID 脚自动识别主机 / 从机
- 内置高速 PHY,高速 / 全速兼容
- 从机模式:4IN+4OUT端点,端点 0 为控制端点
- 主机模式:8 个主机通道,支持低速 / 全速 / 高速
- 支持 HNP 角色切换、SRP 低功耗会话请求
- 配套官方 OTG SDK,含HID/MSC/CDC三大类例程
角色识别逻辑
2. USB 从机(Device)开发实战(最常用)
从机模式用于连接电脑,实现虚拟串口、键盘鼠标、U 盘等。
2.1 开发步骤(官方标准流程)
- 配置 USB 时钟与 GPIO(PA11/PA12 为 USB_DM/DP)
- 调用USBD_Init初始化从机
- 编写描述符:设备、配置、字符串、报告
- 实现回调:标准请求、类请求、收发完成
- 使能 USB 中断,等待枚举与通信
2.2 关键初始化结构体
typedef struct {
USBD_Descriptor_T *pDeviceDesc; // 设备描述符
USBD_Descriptor_T *pConfigurationDesc;// 配置描述符
USBD_Descriptor_T *pStringDesc; // 字符串描述符
USBD_StdReqCallback_T *pStdReqCallback; // 标准请求回调
USBD_ReqHandler_T classReqHandler; // 类请求回调
USBD_EPHandler_T inEpHandler; // IN端点完成回调
USBD_EPHandler_T outEpHandler; // OUT端点完成回调
} USBD_InitParam_T;
2.3 数据收发函数(直接复制)
// 从机发送数据(IN)
USBD_TxData(USB_EP_1, data, len);
// 从机接收数据(OUT)
USBD_RxData(USB_EP_1, buf, len);
2.4 典型从机应用
3. USB 主机(Host)开发实战(读 U 盘、挂设备)
主机模式用于外接 USB 设备,如 U 盘、鼠标、键盘等。
3.1 核心:状态机必须轮询
while(1){
USBH_CoreHandler(); // 主机状态机,必须循环调用
}
3.2 主机状态流程
- 设备断开 → 空闲 → 设备插入
- 枚举:获取描述符→设置地址→配置设备
- 类请求 → 类运行(如 MSC 读写)
- 挂起 / 唤醒 / 异常处理
3.3 枚举流程(SDK 自动完成)
- 获取设备描述符 → 设置地址 → 全描述符
- 获取配置 → 获取字符串 → 设置配置
3.4 典型主机应用
- 读写 U 盘(FATFS)
- 读取 HID 设备(鼠标 / 键盘)
- 连接 USB 摄像头、打印机等外设
4. 必改关键配置(usb_config.h)
- USB_VBUS_SWITCH:VBUS 检测开关
- USB_EP0_PACKET_SIZE:端点 0 包长
- USB_FS_RX_FIFO_SIZE:接收 FIFO 大小
- USB_FS_TX_FIFO_x_SIZE:发送 FIFO 大小
5. 硬件设计要点(一次稳定)
6. 常见问题速解(AN1087 重点)
- 电脑不识别:描述符错误、FIFO 配置错误、GPIO 配置错
- 枚举失败:端点 0 未处理、控制请求没响应
- 数据发不出:FIFO 溢出、未启动传输
- 主机找不到设备:未轮询 USBH_CoreHandler ()
AN1087 是 APM32F4xx USB OTG 最完整的官方开发手册,覆盖原理 + 从机 + 主机 + 状态机 + 枚举 + 收发,搭配官方 SDK 直接跑通 VCP、MSC、HID 三大类应用。不管是做 USB 串口、U 盘还是外接设备,照着文档配置就能稳定量产。
阅读全文
159