硬汉嵌入式论坛

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

求助:基于DMA的USB CDC功能

[复制链接]

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 2024-11-26 11:29:35 | 显示全部楼层 |阅读模式

想通过DMA实现USB的数据传输,但是官方例程好像都没有,目前使用stm32H743的内部phy,有什么例程推荐或者是,用RL-USB协议栈吗


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-27 08:59:14 | 显示全部楼层
DMA方式的还真没做,我也是一直用的非DMA方式。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-11-28 13:48:26 | 显示全部楼层
eric2013 发表于 2024-11-27 08:59
DMA方式的还真没做,我也是一直用的非DMA方式。

翻了一下论坛,发现在帖子“https://www.armbbs.cn/forum.php? ... highlight=USB%2BDMA”下“初晴sama”回复了“我的协议栈 https://github.com/sakumisu/CherryUSB 是使用的 usb dma”,尝试用了其中stm32h7部分的示例(USB_device),发现能正常上发数据,查看寄存器发现DMA_EN并没有开,进一步发现写在main函数的USB初始化是没有调用的。但是看了一下数据发送的函数,都是设置寄存器(不过官方例程也是),因为需要和电脑通信所以好像不能用USB_Host的模式,论坛权限还不能私信,可以帮忙问一下“初晴sama”吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-29 08:44:47 | 显示全部楼层
CCC12345 发表于 2024-11-28 13:48
翻了一下论坛,发现在帖子“https://www.armbbs.cn/forum.php?mod=viewthread&tid=113857&highlight=USB% ...

直接在他的帖子下面留意就行。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-11-29 09:38:37 | 显示全部楼层
eric2013 发表于 2024-11-29 08:44
直接在他的帖子下面留意就行。

留言是吧,确实,谢谢
回复

使用道具 举报

17

主题

109

回帖

160

积分

初级会员

积分
160
发表于 2024-12-1 20:22:30 | 显示全部楼层
本帖最后由 初晴sama 于 2024-12-1 20:24 编辑
CCC12345 发表于 2024-11-29 09:38
留言是吧,确实,谢谢

你好,默认device关闭dma功能,原因是如果开启了dma,需要做nocache处理,比如 cpu_mpu_config(0, MPU_Normal_NonCache, 0x24070000, MPU_REGION_SIZE_64KB); 这部分参考我们 host demo中的例程,从里面复制而来,并加入到device例程:https://github.com/CherryUSB/che ... bt6/Core/Src/main.c

并且还需要配置链接脚本。这些参考主机的sct文件即可。

最后在 usb_config.h 中定义 #define CONFIG_USB_DWC2_DMA_ENABLE即可使用dma模式。

但是需要说明一点,如果你对cache不了解,建议关闭dma 使用,否则你会枚举不了(然后发现关闭了能枚举)。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-12-2 17:38:20 | 显示全部楼层
初晴sama 发表于 2024-12-1 20:22
你好,默认device关闭dma功能,原因是如果开启了dma,需要做nocache处理,比如 cpu_mpu_config(0, MPU_No ...

你好!也就是说如果对cache了解的话开启dma使用也是能正常枚举及使用是吧,是需要什么操作呢?已尝试加入以下代码,修改sct文件并定义CONFIG_USB_DWC2_DMA_ENABLE,然后不能枚举,去掉两个Enable Cache就可以了,但是调试时发现GAHBCFG寄存器的DMAEN位开着,此时枚举失败。同一个代码不调试正常运行的时候就传输正常,然后我打印GAHBCFG寄存器的值发现是0x7217 54C3,很奇怪的值,手册中默认该寄存器31:9都是0才对。但感觉挺奇怪的,为什么就USB的DMA功能被官方ban掉,连个参考的例程都不出
/////////////////////////////////////
  cpu_mpu_config(0, MPU_Normal_NonCache, 0x24070000, MPU_REGION_SIZE_64KB);
  /* USER CODE END 1 */

  /* Enable I-Cache---------------------------------------------------------*/
  SCB_EnableICache();
  /* Enable D-Cache---------------------------------------------------------*/
  SCB_EnableDCache();
/////////////////////////////////////
回复

使用道具 举报

17

主题

109

回帖

160

积分

初级会员

积分
160
发表于 2024-12-2 21:31:19 | 显示全部楼层
本帖最后由 初晴sama 于 2024-12-2 21:32 编辑
CCC12345 发表于 2024-12-2 17:38
你好!也就是说如果对cache了解的话开启dma使用也是能正常枚举及使用是吧,是需要什么操作呢?已尝试加入 ...

我说了,还需要修改 sct ,你怎么选择性跳过呢。这些文档里都写了,所以其实你对cache并不了解,还是建议关闭 DMA。或者不使用带cache的ST H7,更换成 STM32F4。
回复

使用道具 举报

17

主题

109

回帖

160

积分

初级会员

积分
160
发表于 2024-12-2 21:39:18 | 显示全部楼层
参考 https://github.com/CherryUSB/che ... 6/stm32h743xih6.sct。你不改的话,调用 cpu_mpu_config 是没用的,又没把 RAM 放在这个位置。最后再说一下,这些文档里都写了。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-12-3 13:56:09 | 显示全部楼层
初晴sama 发表于 2024-12-2 21:31
我说了,还需要修改 sct ,你怎么选择性跳过呢。这些文档里都写了,所以其实你对cache并不了解,还是建议 ...

上一条回复有说“修改sct文件”了,也在option-》Linker确定了,编译也不会覆盖该文件。不过我确实没怎么了解cache,更新一下上一条的现象:调试时发现GAHBCFG寄存器的DMAEN位开着,串口助手和设备管理器可以看到设备(应该算枚举成功?)但是点击“打开串口”就会卡死。不调试的时候则可以正常传输
回复

使用道具 举报

17

主题

109

回帖

160

积分

初级会员

积分
160
发表于 2024-12-3 14:35:46 | 显示全部楼层
CCC12345 发表于 2024-12-3 13:56
上一条回复有说“修改sct文件”了,也在option-》Linker确定了,编译也不会覆盖该文件。不过我确实没怎么 ...

这个你自己解决就好了。不是USB 问题
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-12-4 15:19:53 | 显示全部楼层
初晴sama 发表于 2024-12-3 14:35
这个你自己解决就好了。不是USB 问题

好的,谢谢!
回复

使用道具 举报

14

主题

58

回帖

100

积分

初级会员

积分
100
发表于 2025-5-17 10:08:39 | 显示全部楼层
本帖最后由 Superusrss 于 2025-5-17 10:11 编辑
初晴sama 发表于 2024-12-1 20:22
你好,默认device关闭dma功能,原因是如果开启了dma,需要做nocache处理,比如 cpu_mpu_config(0, MPU_No ...

最新版本USB host也是没有DMA的,貌似CONFIG_USB_DWC2_DMA_ENABLE这个宏只在device class中出现,host class 开启DMA会报错"This dwc2 version does not support dma mode, so stop working"

理论上不开启DMA就不需要做把buffer放在no_cache的内存上把?至少st USB库是这样,开启后会造成数据不一致需要cache maintance.

不过即使没有DMA和cache,cherryusb也比ST库快,下面使用USBH MSC + FATFS测试
ST:900K 读写
CherryUSB: 1.3M 读写

开始写文件1:/Speed00.txt 2048KB ...
........
  写耗时 : 1530ms   平均写速度 : 1370687B/S (1338KB/S)
开始读文件 2048KB ...
........
  读耗时 : 1549ms   平均读速度 : 1353874B/S (1322KB/S)

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 02:46 , Processed in 0.307114 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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