CherryUSB项目移植指南:从零开始实现USB主从协议栈移植
前言
CherryUSB是一款轻量级、高性能的USB协议栈,支持多种USB IP核和操作系统。本文将详细介绍如何将CherryUSB协议栈移植到不同芯片平台,涵盖USB设备(Device)模式和主机(Host)模式的移植要点,以及常见问题的解决方案。
准备工作
在开始移植前,需要确保:
- 已搭建基础工程环境,能够正常打印"helloworld"
- 对于主机模式,需确保操作系统调度功能正常
- 熟悉目标芯片的USB IP核特性
- 准备好芯片厂商提供的USB相关驱动代码
USB设备模式移植详解
1. 源码集成
将CherryUSB源码添加到工程中,必须包含以下核心文件:
usbd_core.c:USB设备核心逻辑usb_dc_xxx.c:对应USB IP的DCD(Device Controller Driver)驱动
提示:若不确定芯片使用的USB IP类型,可参考port目录下的说明文档。若无现成支持,需自行实现驱动。
2. 配置文件设置
复制cherryusb_config_template.h为usb_config.h,并根据需求修改配置项:
- 设备描述符参数
- 端点数量及大小
- 类支持配置
- 调试输出级别
3. 底层初始化实现
实现usb_dc_low_level_init函数,完成:
- USB时钟配置
- GPIO引脚初始化
- 中断优先级设置
- 电源管理配置
void usb_dc_low_level_init(void)
{
// 1. 使能USB时钟
RCC->APB1ENR |= RCC_APB1ENR_USBEN;
// 2. 配置USB引脚
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 3. 配置NVIC
HAL_NVIC_SetPriority(USB_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USB_IRQn);
}
4. 协议栈初始化
在应用代码中调用初始化函数:
usbd_initialize(0, (uint32_t)USB_BASE);
参数说明:
- 第一个参数:总线ID,从0开始
- 第二个参数:USB IP寄存器基地址
5. 中断处理
在USB中断服务函数中调用:
void USB_IRQHandler(void)
{
USBD_IRQHandler(0);
}
USB主机模式移植详解
1. 源码集成
必须包含以下文件:
usbh_core.c:主机核心逻辑usb_hc_xxx.c:对应USB IP的HCD(Host Controller Driver)驱动- OS抽象层文件(根据使用的OS选择)
2. 初始化流程
- 实现
usb_hc_low_level_init函数 - 调用
usbh_initialize初始化主机协议栈 - 在中断服务函数中调用
USBH_IRQHandler
3. 链接脚本修改
对于GCC工具链,需在链接脚本中添加:
.usbh_class_info :
{
. = ALIGN(4);
__usbh_class_info_start__ = .;
KEEP(*(.usbh_class_info))
__usbh_class_info_end__ = .;
. = ALIGN(4);
} > FLASH
缓存(Cache)配置指南
对于带Cache的芯片(如STM32H7),需特殊处理:
- 定义非Cache内存区域
- 配置MPU属性
- 在链接脚本中指定非Cache段
GCC示例:
MEMORY {
RAM_NOCACHE (xrw) : ORIGIN = 0x24070000, LENGTH = 64K
}
._nocache :
{
*(.noncacheable)
*(.noncacheable.*)
} > RAM_NOCACHE
常见问题解决方案
-
枚举失败:
- 检查描述符配置
- 确认端点配置正确
- 验证电源管理设置
-
数据传输不稳定:
- 调整端点缓冲区大小
- 检查时钟精度
- 确认DMA配置正确
-
主机无法识别设备:
- 验证VBUS供电
- 检查连接线质量
- 确认终端电阻配置
最佳实践建议
- 从最简单的CDC设备开始移植
- 逐步添加复杂功能(如MSC、HID)
- 充分利用协议栈的调试输出功能
- 参考官方提供的demo工程
结语
通过本文的指导,开发者应能顺利完成CherryUSB协议栈的移植工作。实际移植过程中可能会遇到芯片特定的问题,建议结合芯片参考手册和CherryUSB文档进行调试。对于复杂应用场景,可考虑分阶段实现功能,确保每个环节都稳定可靠。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



