我已经按如下设置启用 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 中间件内部使用的一些数据结构同样也必须放置到非缓存内存。
|
|