lousejon 发表于 2021-9-23 10:23:12

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

USBD_StatusTypeDef USBD_FS_RemoteWakeup(USBD_HandleTypeDef *pdev)
{
        HAL_PCD_ActivateRemoteWakeup((PCD_HandleTypeDef *)(pdev->pData));
        USBD_LL_Delay(10);
        HAL_PCD_DeActivateRemoteWakeup((PCD_HandleTypeDef *)(pdev->pData));
        return USBD_OK;
}在F103当中,使用上面的函数可以成功唤醒PC,在F407中就不管用了。其中配置描述符里的设备特性字段为0xE0(自供电和支持远程唤醒);使用工具可以看到在PC进入休眠之前,会给USB设备发一个Set Feature的请求,让设备使能RemoteWakeup的能力,STM32模拟的USB设备也成功回应了该请求。

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

eric2013 发表于 2021-9-24 09:25:53

唤醒功能还没有用过,后面试试。

frankk 发表于 2021-10-18 19:22:08

正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,stm32cubemc 版本5.5.0,芯片f401
            __HAL_PCD_UNGATE_PHYCLOCK(&hpcd_USB_OTG_FS);
            hUsbDeviceFS.dev_state = hUsbDeviceFS.dev_old_state;
            HAL_PCD_ActivateRemoteWakeup((PCD_HandleTypeDef *)(hUsbDeviceFS.pData));
            USBD_LL_Delay(10);
            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;不把睡眠前的状态赋回来的话会导致唤醒后不重新枚举,设备无法正常工做

eric2013 发表于 2021-10-18 20:59:21

frankk 发表于 2021-10-18 19:22
正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,stm32cubemc 版本5.5.0,芯片f401




感谢分享。

lousejon 发表于 2021-10-19 19:54:18

frankk 发表于 2021-10-18 19:22
正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,stm32cubemc 版本5.5.0,芯片f401




{:8:}感谢大佬

afei8856 发表于 2022-1-27 11:45:48

楼主在F103下怎么修改的这个唤醒,我现在做了一个USB的键盘,也出现系统休眠后,键盘无法唤醒系统的问题,你那个函数是加在什么位置的?
页: [1]
查看完整版本: STM32F407 USB设备如何唤醒休眠(睡眠)的电脑