硬汉嵌入式论坛

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

STM32F407 USB设备如何唤醒休眠(睡眠)的电脑

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
QQ
发表于 2021-9-23 10:23:12 | 显示全部楼层 |阅读模式
  1. USBD_StatusTypeDef USBD_FS_RemoteWakeup(USBD_HandleTypeDef *pdev)
  2. {
  3.         HAL_PCD_ActivateRemoteWakeup((PCD_HandleTypeDef *)(pdev->pData));
  4.         USBD_LL_Delay(10);
  5.         HAL_PCD_DeActivateRemoteWakeup((PCD_HandleTypeDef *)(pdev->pData));
  6.         return USBD_OK;
  7. }
复制代码
在F103当中,使用上面的函数可以成功唤醒PC,在F407中就不管用了。其中配置描述符里的设备特性字段为0xE0(自供电和支持远程唤醒);使用工具可以看到在PC进入休眠之前,会给USB设备发一个Set Feature的请求,让设备使能RemoteWakeup的能力,STM32模拟的USB设备也成功回应了该请求。

之后设备会进入挂起状态,主机休眠。
手里有两种STM32F407的板都不能成功唤醒PC,STM32F103的板则可以,用的都是内部全速的PHY,不知道原因在哪。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2021-9-24 09:25:53 | 显示全部楼层
唤醒功能还没有用过,后面试试。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-10-18 19:22:08 | 显示全部楼层
正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,stm32cubemc 版本5.5.0,芯片f401
  1.             __HAL_PCD_UNGATE_PHYCLOCK(&hpcd_USB_OTG_FS);
  2.             hUsbDeviceFS.dev_state = hUsbDeviceFS.dev_old_state;
  3.             HAL_PCD_ActivateRemoteWakeup((PCD_HandleTypeDef *)(hUsbDeviceFS.pData));
  4.             USBD_LL_Delay(10);
  5.             HAL_PCD_DeActivateRemoteWakeup((PCD_HandleTypeDef *)(hUsbDeviceFS.pData));
复制代码


上面代码实测能正常唤醒
__HAL_PCD_UNGATE_PHYCLOCK(&hpcd_USB_OTG_FS);这句时因为pc休眠会触发Suspend中断HAL_PCD_SuspendCallback()函数会将usb的PHY 时钟关闭,导致HAL_PCD_ActivateRemoteWakeup不起作用.
但是光把时钟打开还不够,还需要hUsbDeviceFS.dev_state = hUsbDeviceFS.dev_old_state;不把睡眠前的状态赋回来的话会导致唤醒后不重新枚举,设备无法正常工做
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2021-10-18 20:59:21 | 显示全部楼层
frankk 发表于 2021-10-18 19:22
正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,stm32cubemc 版本5.5.0,芯片f401

感谢分享。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
QQ
 楼主| 发表于 2021-10-19 19:54:18 | 显示全部楼层
frankk 发表于 2021-10-18 19:22
正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,stm32cubemc 版本5.5.0,芯片f401

感谢大佬
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-1-27 11:45:48 | 显示全部楼层
楼主在F103下怎么修改的这个唤醒,我现在做了一个USB的键盘,也出现系统休眠后,键盘无法唤醒系统的问题,你那个函数是加在什么位置的?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 15:38 , Processed in 0.206007 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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