硬汉嵌入式论坛

 找回密码
 立即注册
查看: 532|回复: 13
收起左侧

[USB] STM32H7 USBHS USB3300 CDC测速问题

  [复制链接]

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2026-1-26 14:11:28 | 显示全部楼层 |阅读模式
最近调试了一下STM32H7 + USB3300 使用CDC进行通信,在这个过程中碰到很多坑,在这里记录一下。STM32H7系列引入了Cache和MPU,相对来说调试难度和系统架构变复杂了不少,希望我的经历能对大家有帮助。

这是一段非常有价值的调试经历,涵盖了高性能 MCU 开发中最核心的几个坑:外设 FIFO 管理、DMA 机制以及 Cache 一致性。

为了确保核心逻辑清晰,我将这段探索历程整理为一篇结构严谨的技术博客,方便你记录或分享。

极致性能:STM32H7 + USB3300 高速 USB 通信优化之路
0. 前言
在 STM32H7 上实现 USB 2.0 High-Speed (480Mbps) 传输时,硬件性能极高,但由于其复杂的架构(I/D Cache、AXI 总线、Internal DMA),开发者往往会遇到“速度上不去”或“开启缓存就挂掉”的窘境。本文记录了从 20MB/s 迈向链路极限的调优全过程。

硬件环境:

MCU: STM32H7 系列
PHY: USB3300 (外置高速 PHY)
模式: USB CDC (Communication Device Class)
1. 初始阶段:稳扎稳打的起点
配置:开启 I-Cache,失能 D-Cache,禁用 Internal DMA。
表现:系统运行稳定,测速结果为 20.51 MB/s。
分析:在没有 D-Cache 和 DMA 的参与下,CPU 负责搬运所有数据。虽然 20MB/s 已经超过了全速 (Full-Speed) 的理论极限,但对于 480Mbps 的高速链路来说,CPU 搬运成为了明显的瓶颈。

2. 进阶阶段:开启 Internal DMA 与 FIFO 陷阱
为了释放 CPU 压力并提升带宽,我们尝试开启 USB 内部的 Internal DMA。

遇到问题:接收正常,但无法发送数据。
原因深度解析:STM32H7 的 USB 内部 DMA 对 FIFO 的分配有严格要求。手册指出:“When DMA is used, 3n * FIFO locations should be reserved for internal DMA registers”。
解决方案:重新计算并调整了 USB_OTG_HS 的 FIFO 长度设置,预留出 DMA 寄存器所需的空间。
优化结果:数据发送恢复正常,测速跃升至 22.61 MB/s(I-Cache ON, D-Cache OFF)。这是纯硬件搬运带来的显著增益。

3. 攻克阶段:D-Cache 的“幽灵”错误与 MPU 救场
在获得 22.61 MB/s 的成绩后,我们尝试开启 D-Cache 以进一步提升整体性能,却直接陷入了“枚举失败”的死胡同。

现象:PC 端识别设备异常,得到的 PID 和 VID 均为 0。
奇怪的发现:
数据一致性问题:开启 D-Cache 后,CPU 写入设备描述符的操作停留在 Cache 中,而 Internal DMA 直接从物理 SRAM 中读取数据。
结果:DMA 读到的是 SRAM 里的初始零值,导致枚举阶段发送给主机的描述符全是 0。
解决方案(白名单策略):
由于 USB 库内部全局变量极多,手动刷 Cache (SCB_CleanDCache) 极其繁琐且易错。我通过 MPU (Memory Protection Unit) 划定了专属区域:
将 RAM_D1 (AXI SRAM) 整体设置为 Non-cacheable(通过 MPU Region 0)。
确保 USB 库的所有句柄和缓冲区都落在此非缓存区。
最终战果:
配置:Internal DMA ON + I-Cache ON + D-Cache ON + MPU 局部隔离。
测速:21.98 MB/s。

4. 经验总结与数据对比
为了提高处理效率,我们将三种模式下的性能与稳定性进行了直观对比:

配置模式        I-Cache        D-Cache        Internal DMA        MPU 设置        测速结果        稳定性
基础模式        开启        关闭        关闭        无        20.51 MB/s        稳定
DMA 模式        开启        关闭        开启        无        22.61 MB/s        需手动调优 FIFO
完全体模式        开启        开启        开启        隔离 AXI SRAM        21.98 MB/s        极高(枚举正常)

关键结论:
DMA 是提速核心:开启 Internal DMA 后,吞吐量有质的飞跃。
FIFO 空间补偿:开启 DMA 后必须严格按照手册公式重新计算 FIFO 大小,否则发送功能会失效。
一致性高于一切:在 H7 这种带 Cache 的架构中,如果不处理 Cache 一致性,USB 几乎无法正常工作。使用 MPU 将 AXI SRAM 设置为非缓存区,是兼顾开发效率与系统稳定性最平衡的方案。

这貌似就是HS CDC的性能上限了? 坛友们有没有实测更快的?

回复

使用道具 举报

15

主题

62

回帖

107

积分

初级会员

积分
107
发表于 2026-1-26 19:04:34 | 显示全部楼层
H743 CDC,实测快40M,没用DMA,没开I-Cache和D-Cache
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2026-1-26 20:04:57 | 显示全部楼层
海米阿门 发表于 2026-1-26 19:04
H743 CDC,实测快40M,没用DMA,没开I-Cache和D-Cache

兄弟真的假的,来个图片
回复

使用道具 举报

4

主题

1484

回帖

1496

积分

至尊会员

积分
1496
发表于 2026-1-27 17:04:17 | 显示全部楼层
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2026-1-27 22:58:02 | 显示全部楼层
海米阿门 发表于 2026-1-26 19:04
H743 CDC,实测快40M,没用DMA,没开I-Cache和D-Cache

我今天又测试了一下,  最高跑到35MB/S 已经是极限了, 剩下就算再增加缓存我觉得意义也不是很大了./
回复

使用道具 举报

15

主题

62

回帖

107

积分

初级会员

积分
107
发表于 2026-1-28 19:16:30 | 显示全部楼层
Winston 发表于 2026-1-27 22:58
我今天又测试了一下,  最高跑到35MB/S 已经是极限了, 剩下就算再增加缓存我觉得意义也不是很大了./

差不多,应该没开DMA,没开cachae把,极限,优化的好也就42M顶天了
回复

使用道具 举报

21

主题

59

回帖

122

积分

初级会员

积分
122
发表于 2026-1-28 23:33:43 来自手机 | 显示全部楼层
有没有原理图分享下,也打算玩玩高速cdc
回复

使用道具 举报

1

主题

89

回帖

92

积分

初级会员

积分
92
发表于 2026-1-29 09:27:50 | 显示全部楼层
bigfanofiot 发表于 2026-1-28 23:33
有没有原理图分享下,也打算玩玩高速cdc

可以看一下我这个开源项目:https://github.com/dukelec/cdbus_bridge
内置高速 usb 的小体积 AT32 芯片,不用外加 phy,cdc 协议
速度没 H7 快,够我用了
回复

使用道具 举报

30

主题

426

回帖

516

积分

金牌会员

积分
516
发表于 2026-1-29 09:47:07 | 显示全部楼层
dukelec 发表于 2026-1-29 09:27
可以看一下我这个开源项目:https://github.com/dukelec/cdbus_bridge
内置高速 usb 的小体积 AT32 芯片 ...

老哥,你们是一个组织还是只有你一个人啊,做的东西好厉害,文档写的也好
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

afa

积分
21
发表于 2026-1-29 11:13:00 | 显示全部楼层
1、D-Cache开启,但USB的区域无法缓存命中,相当于没有优化2、我使用
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

afa

积分
21
发表于 2026-1-29 11:25:19 | 显示全部楼层
1、D-Cache开启,但USB区域配置MPU无法缓存命中,等于没啥优化(H7开启DMA后,对应等待区域要么配置无法缓存命中,要么每次使用时手动清除); 2、使用Threadx+USBX,开启零拷贝(未对DMA调优),持续发送(通过发送完成回调)测速稳定27MB/s左右(单次发送14144个字节,500us左右)
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

afa

积分
21
发表于 2026-1-29 11:25:41 | 显示全部楼层
海米阿门 发表于 2026-1-26 19:04
H743 CDC,实测快40M,没用DMA,没开I-Cache和D-Cache

用啥上位机软件测得,大佬?
回复

使用道具 举报

1

主题

89

回帖

92

积分

初级会员

积分
92
发表于 2026-1-29 12:08:05 来自手机 | 显示全部楼层
tovinz 发表于 2026-1-29 09:47
老哥,你们是一个组织还是只有你一个人啊,做的东西好厉害,文档写的也好

过奖,有几个团队,不过这个 github 帐号的项目是我一个慢慢在搞,然后抽时间精力弄团队里面的私有项目
回复

使用道具 举报

15

主题

62

回帖

107

积分

初级会员

积分
107
发表于 2026-1-30 17:18:47 | 显示全部楼层
liushufa 发表于 2026-1-29 11:25
用啥上位机软件测得,大佬?

SerialApp,别人写的,网上找得到,大差不差
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-2-24 11:01 , Processed in 0.054435 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表