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,不知道原因在哪。
唤醒功能还没有用过,后面试试。 正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,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;不把睡眠前的状态赋回来的话会导致唤醒后不重新枚举,设备无法正常工做 frankk 发表于 2021-10-18 19:22
正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,stm32cubemc 版本5.5.0,芯片f401
感谢分享。 frankk 发表于 2021-10-18 19:22
正好最近在做唤醒相关的程序,花了点时间仔细研究了一下,stm32cubemc 版本5.5.0,芯片f401
{:8:}感谢大佬 楼主在F103下怎么修改的这个唤醒,我现在做了一个USB的键盘,也出现系统休眠后,键盘无法唤醒系统的问题,你那个函数是加在什么位置的?
页:
[1]