1. 完整工程开发整体流程
- 在
usbd_board.h配置库全局宏参数; - 修改对应 USB Class 内部宏(端点地址、包大小、轮询间隔);
- 在
usbd_board.c的USBD_HardwareInit()完成硬件初始化:时钟、IO、FIFO 大小配置; - 在
usb_descriptor.c/h修改 VID、PID、字符串、设备配置等各类描述符; - 实现 USB 中断服务函数,调用库中断处理入口;
- 注册 Class 类处理接口、用户业务回调;
- 调用
USBD_Init()完成 USB 设备初始化,启动 USB 设备; - 在应用层回调函数处理 USB 连接、断开、数据收发业务逻辑。
资料获取:APM32 USB Device Library应用笔记
2. 库全局宏配置(usbd_board.h)
库基础配置宏,示例默认参数:
#define USBD_SUP_CLASS_MAX_NUM 1 //最大支持Class数量
#define USBD_SUP_INTERFACE_MAX_NUM 1 //最大interface数量
#define USBD_SUP_CONFIGURATION_MAX_NUM 1 //最大配置数量
#define USBD_SUP_STR_DESC_MAX_NUM 512 //字符串描述符最大字符长度
#define USBD_SUP_LPM 0 //LPM功能开关
#define USBD_SUP_SELF_PWR 1 //自供电模式开关
复合 USB 设备(多 Class 组合)需要修改USBD_SUP_CLASS_MAX_NUM,支持同时多个设备类。
同时每个 Class 拥有独立配置宏,以 HID 鼠标举例:报告描述符长度、端点地址、包大小、轮询间隔等,必须与描述符保持一致。
3. 硬件层配置要点
硬件配置函数USBD_HardwareInit()位于usbd_board.c,主要完成:
- USB 外设时钟使能;
- USB IO 引脚配置;
- RX‑FIFO、TX‑FIFO 缓冲区大小配置;
- 端点 FIFO 分配。
重点约束:Class 文件内部的端点地址、最大包长宏,必须和硬件 FIFO 配置一一对应,否则通信异常。例如 CDC 类中USBD_CDC_FS_MP_SIZE全速包长,需要匹配 FIFO 分配。
4. 描述符配置说明
全部描述符存放于usb_descriptor.c/h,包含 10 类描述符:
- 设备描述符;
- 配置描述符;
- 配置字符串描述符;
- 接口字符串描述符;
- 语言 ID 字符串描述符;
- 制造商字符串描述符;
- 产品字符串描述符;
- 序列号字符串描述符;
- 其他速度描述符;
- 设备修饰描述符。
开发者量产项目重点修改:VID、PID、厂商名称、产品名称、序列号。描述符回调挂载至USBD_DESC_T结构体。
5. Class 类配置与注册方法
- 修改对应 Class 头文件中的端点地址、包大小、轮询间隔、报告描述符;
- 初始化该 Class 的
USBD_CLASS_T结构体实例; - 调用
USBD_Init(),将 Class 结构体指针作为入参注册进 USB 内核; - 部分类(MSC、Custom‑HID、CDC)需要调用注册接口函数,绑定用户读写业务回调。
USBD_Init函数原型
USBD_STA_T USBD_Init(USBD_INFO_T* usbInfo, USBD_SPEED_T usbDevSpeed,
USBD_DESC_T* usbDevDesc, USBD_CLASS_T* usbDevClass,
void (*userCallbackFunc)(struct _USBD_INFO_T*, uint8_t));
该接口完成描述符注册、Class 挂载、用户回调注册、硬件初始化。
6. 中断服务函数配置
USB 外设中断需要在工程中断服务函数中调用库内部处理入口,USB 所有事件(复位、挂起、SOF、数据收发)全部依靠中断驱动;不配置中断回调,USB 协议栈将无法运行。
7. 项目移植适配步骤与常见注意事项
阅读全文
70