[STM32H7] 在 NUCLEO‑H723ZG 上开启带 DMA 与 D‑Cache 的 USB

[复制链接]
4|0
codekid 发表于 2026-9-18 16:39 | 显示全部楼层 |阅读模式

我已经按如下设置启用 USB:已开启对应的 USB 中间件。
在链接脚本里面,我把全部内容从 DTCMRAM 移到了 RAM。
定义了一个段:
.dma_buffer :
{
*(.dma_buffer)
} >RAM_D2
使用方式:
/** Received data over USB are stored in this buffer */
__attribute__((section(".dma_buffer")))
uint8_t UserRxBufferHS[APP_RX_DATA_SIZE];
/** Data to send over USB CDC are stored in this buffer */
__attribute__((section(".dma_buffer")))
uint8_t UserTxBufferHS[APP_TX_DATA_SIZE];
此时 USB 设备可以完成枚举,但是看起来没有任何描述符传输到主机端。
我启用 MPU,但是问题没有解决。
然而,如果 MPU 使用 RAM 区域基地址 (0x24000000) 而不是 RAM_D2 (0x30000000),设备就可以正确枚举;并且收发缓冲区不再需要`__attribute__((section(".dma_buffer")))`。

我希望只把 USB 相关内存放置到非缓存区,其余应用内存继续保留 Cache 开启以维持性能。
我把整个 RAM 全部设置 MPU 非缓存,USB‑DMA 可以工作,但代价是整个应用全部关闭 Cache,性能受损。
仅仅把 RX/TX 用户缓冲区放到非缓存段是不够的。根据我的测试USB 设备描述符以及 USB 中间件内部使用的一些数据结构同样也必须放置到非缓存内存。

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

本版积分规则

53

主题

748

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0