本帖最后由 宫影空明人不往 于 2025-6-26 14:10 编辑
#申请原创# 一、CherryUSB 简介
CherryUSB 是一个轻量级且具有高可移植性的开源 USB 协议栈,涵盖了常见的 USB 功能,包括 USB Device、USB Host 和 OTG。该协议栈针对USB IP进行分类,因此可以比较容易地移植到各类 MCU 平台。
二、APM32F402 硬件平台概述
APM32F402 微控制器基于 ARM Cortex-M4 内核,主频可达 120MHz,内置丰富的外设,包括 USB OTG FS 接口、DMA 控制器、各类定时器、串口、I2C、SPI 等,可满足大多数嵌入式应用需求。APM32F402 的 USB OTG 模块支持 USB2.0 全速模式 ,因此非常适合作为 CherryUSB 协议栈的底层硬件平台。
三、移植前准备
1. 硬件开发板
这里选择刚发布的 APM32F402 MicroBoard作为 移植的硬件开发板,板级外设刚好附带了OTG FS 的Type C口,可满足移植需求。
2. 开发环境
这里选择常见的Keil MDK-ARM进行移植。
3. CherryUSB 源码
从官方仓库获取 CherryUSB 的最新版本,了解其目录结构和关键文件;常见的目录包含 core、device、host、osal、port 等。 这里下载的版本为1.4.1。
四、移植步骤
1. 创建工程
这里我直接使用F402 SDK里面的模版工程进行移植。
2. 拷贝 CherryUSB 源码
将下载的CherryUSB包解压放在SDK的Middlewares文件夹中,并在工程中添加相应的头文件路径,分别是:USB类,USB定义,USB内核以及所支持的USB IP。USB类和IP则为CDC ASM和DWC2。相应的头文件路径如图所示。

接着就是将需要编译的C文件添加到工程中,分别是USB类文件,设备内核文件,USB IP文件以及cdc 接口文件,还有将usb_config.h文件放出来方便更改。
文件路径如下:
CherryUSB-1.4.1\class\cdc\usbd_cdc_acm.c
CherryUSB-1.4.1\core\usbd_core.c
CherryUSB-1.4.1\port\dwc2\usb_dc_dwc2.c
CherryUSB-1.4.1\port\dwc2\usb_glue_st.c
CherryUSB-1.4.1\demo\cdc_acm_template.c
其中usb_config.h为CherryUSB-1.4.1\cherryusb_config_template.h重命名,具体添加情况见下图。

其中,usb_glue_st.c文件主要实现延时函数以及USB GGCCFG寄存器的配置,可单独创建文件实现,这里直接挪用cherryusb自带的文件,并将延时函数修改成DAL库的延时函数DAL_Delay()。
3. 文件以及工程配置修改
由于上面添加的文件部分指令只支持AC6编译,因此需将模版工程的编译器选择更改成AC6。
文件修改主要为:编辑USB 端点以及缓冲相关信息,以及编写USB底层初始化函数。
端点数量和缓冲大小在usb_config.h文件中修改。这里将OTG FS设备的端点最大数量设置为4,FIFO深度设置为1.25KB。

底层初始化和解除初始化主要进行IO的配置以及模块时钟的使能和中断的使能。具体函数为:

以及将CherryUSB的中断处理函数放置在F403的USB中断处理函数中

4. 其他处理
由于APM32F403的USB时钟需额外配置,以及cherryusb有log打印需开启相应串口。可参考SDK自带的USB例程的时钟配置以及串口配置进行修改,具体代码修改将不展开。
同时由于官方的CDC接口做了485的DTR处理,这里使用的是普通的串口线进行通信,因此将该状态屏蔽掉。

5.调用库函数打开usb
在main函数中调用cdc_asm_init函数进行初始化,并调用cdc_acm_data_send_with_dtr_test函数进行打印测试。

五.结果验证
将移植好的工程编译烧录到APM32F402 MicroBoard上,并用USB线连接其与PC,开启PC串口接收后可看见数据正常打印。

其他的类ip也可参考上述步骤进行移植。
|