硬汉嵌入式论坛

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

[USB] STM32-V7 开发板 usb cdc 虚拟串口使用问题

[复制链接]

7

主题

32

回帖

53

积分

初级会员

积分
53
发表于 2025-6-18 14:49:50 | 显示全部楼层 |阅读模式
目前,手里有块STM32-V7 开发板,需要使用到 usb 设备接口,usb 作为 cdc 类。目前遇到两个问题,1是如何检测 usb 是否连接上电脑,usb线插拔检测。如果不做应用层协议,如何检测到设备插入电脑。目前找到一种方式,如下,但是实际测试不行。

USB 线插入 PC,hUsbDeviceFS.dev_state 为 USBD_STATE_CONFIGURED;
拔下线,hUsbDeviceFS.dev_state 为 USBD_STATE_SUSPENDED;
目前测试中,拔下线后,hUsbDeviceFS.dev_state 仍为 USBD_STATE_CONFIGURED,不确定原因?


2是如何检测 usb 连接上电脑后,串口设备被打开。目前,查找到一种方式是使能流控后,终端工具打开后会上报 CDC_SET_CONTROL_LINE_STATE 事件。有没有其他方式能检测到?


目前代码是cubemx 工具生成的,带 freertos,没有使用 RL-USB 中间件。硬件是STM32-V7 开发板。
STM32Cube_FW_H7_V1.10.0

谢谢。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-18 16:30:06 | 显示全部楼层
RL-USB的话,有个连接状态查询函数。
ST USB的话,有个HAL_PCD_DisconnectCallback,HAL_PCD_ConnectCallback,看看是不是好使
回复

使用道具 举报

7

主题

32

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2025-6-18 17:02:04 | 显示全部楼层
eric2013 发表于 2025-6-18 16:30
RL-USB的话,有个连接状态查询函数。
ST USB的话,有个HAL_PCD_DisconnectCallback,HAL_PCD_ConnectCallb ...

硬汉哥,谢谢回复。使用的STM32-V7 开发板,默认USB VBUS 引脚没有接,PA9 用在调试串口了。
我看了网上文章,实际测试时这两个函数不会被调用。因为如下配置,没有使能,不会设置对应的中断位,所以,中断处理函数中不会进入对应流程。
hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE;

我的理解如果 VBUS 引脚接出来,应该是可以检测到 USB 插拔的,使用的硬件方式检测。我是想了解下有没有通过软件方式能检测到的,目前找到的方式就是我上面写的,通过判断 hUsbDeviceFS.dev_state 为 USBD_STATE_CONFIGURED。

使能中断配置

使能中断配置

中断函数中连接回调函数触发

中断函数中连接回调函数触发
回复

使用道具 举报

24

主题

365

回帖

437

积分

高级会员

积分
437
发表于 2025-6-18 17:21:44 | 显示全部楼层
本帖最后由 tovinz 于 2025-6-18 17:28 编辑

可以尝试在触发 RESET 中断的时候视为 USB 插入,在触发 SUSPEND 中断的视为 USB 拔出
在触发 CDC_GET_LINE_CODING 视为可能是串口助手打开,
因为 USB ACM CDC 设置插入主机的时候,驱动会默认先后配置一次和获取一次 CDC_LINE_CODING,当打开串口调试助等工具时又会配置和获取一次 CDC_LINE_CODING。
在触发 CDC_SET_LINE_CTLSTE(0x22) 视为串口助手关闭


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-19 09:36:53 | 显示全部楼层
longge 发表于 2025-6-18 17:02
硬汉哥,谢谢回复。使用的STM32-V7 开发板,默认USB VBUS 引脚没有接,PA9 用在调试串口了。
我看了 ...

那不太清楚了

RL-USB是有个USBD_Configured,可以方便的判断.
回复

使用道具 举报

0

主题

49

回帖

49

积分

初级会员

积分
49
发表于 2025-6-20 17:40:50 | 显示全部楼层
只能通过 DTR 状态,CDC_Control_FS 函数的 case CDC_SET_CONTROL_LINE_STATE: 里面增加一句 cdc_dtr = hUsbDeviceFS.request.wValue & 0x01;

然后等 DTR 有效后,要延迟一下才允许传输数据给 PC,否则容易收到 PC 的回显,可以参考这个代码的 usb_detection 函数(上面的代码片段也可以在下面代码目录中找到):
(譬如 Linux 系统打开串口默认是开启回显的,然后应用程序通常会立即关闭回显,但这之间有时间差,所以需要延时,否则 mcu 容易收到 PC 回显反弹回来的乱码)

https://github.com/dukelec/cdbus ... w_bl/usr/app_main.c
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 03:39 , Processed in 0.044872 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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