【免费下载】 CherryUSB项目移植指南:从零开始实现USB主从协议栈移植

CherryUSB项目移植指南:从零开始实现USB主从协议栈移植

【免费下载链接】CherryUSB CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP 【免费下载链接】CherryUSB 项目地址: https://gitcode.com/gh_mirrors/ch/CherryUSB

前言

CherryUSB是一款轻量级、高性能的USB协议栈,支持多种USB IP核和操作系统。本文将详细介绍如何将CherryUSB协议栈移植到不同芯片平台,涵盖USB设备(Device)模式和主机(Host)模式的移植要点,以及常见问题的解决方案。

准备工作

在开始移植前,需要确保:

  1. 已搭建基础工程环境,能够正常打印"helloworld"
  2. 对于主机模式,需确保操作系统调度功能正常
  3. 熟悉目标芯片的USB IP核特性
  4. 准备好芯片厂商提供的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.husb_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. 初始化流程

  1. 实现usb_hc_low_level_init函数
  2. 调用usbh_initialize初始化主机协议栈
  3. 在中断服务函数中调用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),需特殊处理:

  1. 定义非Cache内存区域
  2. 配置MPU属性
  3. 在链接脚本中指定非Cache段

GCC示例:

MEMORY {
    RAM_NOCACHE (xrw) : ORIGIN = 0x24070000, LENGTH = 64K
}

._nocache :
{
    *(.noncacheable)
    *(.noncacheable.*)
} > RAM_NOCACHE

常见问题解决方案

  1. 枚举失败

    • 检查描述符配置
    • 确认端点配置正确
    • 验证电源管理设置
  2. 数据传输不稳定

    • 调整端点缓冲区大小
    • 检查时钟精度
    • 确认DMA配置正确
  3. 主机无法识别设备

    • 验证VBUS供电
    • 检查连接线质量
    • 确认终端电阻配置

最佳实践建议

  1. 从最简单的CDC设备开始移植
  2. 逐步添加复杂功能(如MSC、HID)
  3. 充分利用协议栈的调试输出功能
  4. 参考官方提供的demo工程

结语

通过本文的指导,开发者应能顺利完成CherryUSB协议栈的移植工作。实际移植过程中可能会遇到芯片特定的问题,建议结合芯片参考手册和CherryUSB文档进行调试。对于复杂应用场景,可考虑分阶段实现功能,确保每个环节都稳定可靠。

【免费下载链接】CherryUSB CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP 【免费下载链接】CherryUSB 项目地址: https://gitcode.com/gh_mirrors/ch/CherryUSB

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值