CherryUSB开发者指南:如何为你的嵌入式平台移植高性能USB协议栈
CherryUSB 是一个小而美的、可移植性高的、用于嵌入式系统(带 USB IP)的高性能 USB 主从协议栈。本文将为开发者提供一份全面指南,帮助你快速将 CherryUSB 协议栈移植到自己的嵌入式平台,充分利用其高性能和跨平台特性。## 📋 移植前准备工作在开始移植前,请确保你已准备好以下环境和工具:- 一个可以正常打印 "helloworld" 的基础工程(用于 Devic
CherryUSB开发者指南:如何为你的嵌入式平台移植高性能USB协议栈
CherryUSB 是一个小而美的、可移植性高的、用于嵌入式系统(带 USB IP)的高性能 USB 主从协议栈。本文将为开发者提供一份全面指南,帮助你快速将 CherryUSB 协议栈移植到自己的嵌入式平台,充分利用其高性能和跨平台特性。
📋 移植前准备工作
在开始移植前,请确保你已准备好以下环境和工具:
- 一个可以正常打印 "helloworld" 的基础工程(用于 Device 模式)
- 支持 OS 调度的工程环境(用于 Host 模式)
- 芯片手册中关于 USB IP 的详细说明文档
- CherryUSB 源码(可通过
git clone https://gitcode.com/cherry-embedded/CherryUSB获取)
🔌 USB Device 模式移植步骤
1. 源码集成与配置
首先将 CherryUSB 源码拷贝到你的工程目录,并添加必要的源文件和头文件路径。核心文件包括:
usbd_core.c(设备核心实现)usb_dc_xxx.c(对应芯片 USB IP 的设备控制器驱动,可在 port/ 目录下查找支持的 USB IP 驱动)
然后拷贝配置模板文件:
cp cherryusb_config_template.h your_project/usb_config.h
2. 硬件初始化实现
实现 usb_dc_low_level_init 函数,负责 USB 时钟、引脚和中断的初始化。以下是一个 STM32 平台的初始化示例:
该函数需要完成:
- GPIO 引脚配置(DM/DP 引脚设置为复用功能)
- USB 时钟使能(确保时钟频率符合 USB 规范)
- 中断优先级配置和使能
3. 中断处理与协议栈初始化
在芯片的 USB 中断服务程序中调用协议栈的中断处理函数:
void OTG_HS_IRQHandler(void) {
USBD_IRQHandler(0); // busid 从 0 开始
}
最后注册设备描述符并初始化协议栈:
usbd_desc_register(&usbd_desc);
usbd_initialize(0, USB_OTG_HS_PERIPH_BASE);
🖥️ USB Host 模式移植要点
1. 核心文件与 OS 适配
Host 模式需要添加以下核心文件:
usbh_core.c(主机核心实现)usb_hc_xxx.c(对应芯片 USB IP 的主机控制器驱动)- OS 适配文件(如 osal/usb_osal_freertos.c 或其他 OS 对应的文件)
2. 主机控制器初始化
实现 usb_hc_low_level_init 函数,完成主机模式下的硬件初始化。与 Device 模式类似,需要配置时钟、引脚和中断,但需注意主机模式特有的硬件要求。
3. 链接脚本修改
使用 GCC 编译时,需在链接脚本中添加 class 信息存储段:
/* 在 ld 文件中添加 */
. = ALIGN(4);
__usbh_class_info_start__ = .;
KEEP(*(.usbh_class_info))
__usbh_class_info_end__ = .;
⚡ 性能优化配置
Cache 配置(针对带 Cache 的芯片)
CherryUSB 使用 USB_NOCACHE_RAM_SECTION 宏定义非缓存区域,需在链接脚本中添加对应段:
/* GCC 链接脚本示例 */
RAM_nocache (xrw) : ORIGIN = 0x20030000, LENGTH = 64K
._nocache_ram : {
. = ALIGN(4);
*(.noncacheable)
} > RAM_nocache
同时需要配置 MPU 使该区域为非缓存,确保 USB 数据传输的正确性。
性能测试结果
CherryUSB 经过优化后可实现高性能传输,以下是 MSC 设备模式下的速度测试结果:
📚 硬件设计参考
USB 硬件设计对协议栈稳定性至关重要,以下是一个参考的 USB OTG 硬件原理图:
关键设计要点:
- 确保 VBUS 供电稳定(建议添加 22uF 电容)
- DM/DP 线上添加 ESD 保护器件
- 差分线阻抗控制在 90Ω±10%
📝 移植验证与调试
移植完成后,建议从简单的示例开始验证:
- Device 模式:使用 demo/cdc_acm_template.c 测试 CDC-ACM 功能
- Host 模式:使用 demo/usb_host.c 测试 USB 主机枚举
可通过 USB 协议分析仪抓取总线数据,或使用串口打印调试信息定位问题。
🎯 总结
CherryUSB 凭借其模块化设计和丰富的驱动支持,使得 USB 协议栈移植过程变得简单高效。通过本文介绍的步骤,你可以快速将 CherryUSB 集成到自己的嵌入式平台,为项目添加可靠的 USB 功能。更多详细信息请参考 docs/zh/quick_start/transplant.rst 官方移植文档。
希望这份指南能帮助你顺利完成 CherryUSB 的移植工作,如有任何问题,欢迎参与项目讨论和贡献!
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐






所有评论(0)