你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-L496ZG评测】+ USB OTG 之 HID 远程唤醒PC

[复制链接]
creep 提问时间:2017-4-24 22:57 /
本帖最后由 creep 于 2017-4-25 08:46 编辑



    STM32L496上面有个USB OTG FS接口可以作为Host也可以作为Device,使用ST提供的USB库可以将STM32L496-Nucleo 枚举成一个HID设备,因为HID设备在windows是免驱,在很多对通信速度要求不高的场合时使用HID设备通信是一个很好的选择。如果对速度要求比较高可以考虑使用全速CDC模式或者高速CDC,但是鉴于我们都懂的原因,国内的很多操作系统都是不完整的系统,在使用CDC模式很大的可能性会遇到驱动的安装问题。


  全速USB使用内部的48MHZ的HSI时钟,硬件连接如下:
     
    TIM截图20170424213941.png


在底层初始化中要按照硬件的连接进行相应功能的设置:


  1. <font face="微软雅黑" size="3">void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
  2. {
  3.   GPIO_InitTypeDef  GPIO_InitStruct;
  4.   
  5.   /* Configure USB FS GPIOs */
  6.   __HAL_RCC_GPIOA_CLK_ENABLE();
  7.   
  8.   /* Configure DM DP Pins */
  9.   GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);
  10.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  11.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  12.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  13.   GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
  14.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  15.   
  16.   /* Configure VBUS Pin */
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;
  18.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  20.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  21.   
  22.   /* Configure ID pin */
  23.   GPIO_InitStruct.Pin = GPIO_PIN_10;
  24.   GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  25.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  26.   GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
  27.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  28.   
  29.   /* Enable USB FS Clock */
  30.   __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
  31.   
  32.   /* Set USB FS Interrupt priority */
  33.   HAL_NVIC_SetPriority(OTG_FS_IRQn, 0x0F, 0);
  34.   
  35.   /* Enable USB FS Interrupt */
  36.   HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
  37.   
  38.   if(hpcd->Init.low_power_enable == 1)
  39.   {
  40.     /* Enable EXTI Line 18 for USB wakeup */
  41.     __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT();            
  42.   }   
  43. }</font>
复制代码


HID作为PC的一个USB devcie 支持remote wakeup 功能可以睡眠状态下的电脑唤醒,工作原理是如果使能了唤醒功能,USB内核会发送一个wakeup信号给Host(PC):


TIM截图20170424214547.png


为了模拟这个效果我们使用STM32L496-Nucleo上的USER 按键来触发唤醒信号,当检测到按键按下中断时就发一个唤醒信号给主机PC,按键的中断回调函数如下:信号的发送要严格按下参考手册描述的进行执行。


  1. <font face="微软雅黑" size="3">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.   if (GPIO_Pin == SEL_JOY_PIN)
  4.   {
  5.     if ((((USBD_HandleTypeDef *)hpcd.pData)->dev_remote_wakeup == 1)&&
  6.         (((USBD_HandleTypeDef *)hpcd.pData)->dev_state == USBD_STATE_SUSPENDED))
  7.     {
  8.       if ((&hpcd)->Init.low_power_enable)
  9.       {
  10.         /* Reset SLEEPDEEP bit of Cortex System Control Register */
  11.         SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));  
  12.         
  13.         SystemClockConfig_STOP();
  14.       }
  15.       
  16.       /* Ungate PHY clock */
  17.       __HAL_PCD_UNGATE_PHYCLOCK((&hpcd));
  18.       
  19.       /* Activate Remote wakeup */
  20.       HAL_PCD_ActivateRemoteWakeup((&hpcd));
  21.       
  22.       /* Remote wakeup delay */
  23.       HAL_Delay(10);
  24.       
  25.       /* Disable Remote wakeup */
  26.       HAL_PCD_DeActivateRemoteWakeup((&hpcd));
  27.       
  28.       /* change state to configured */
  29.       ((USBD_HandleTypeDef *)hpcd.pData)->dev_state = USBD_STATE_CONFIGURED;
  30.       
  31.       /* Change remote_wakeup feature to 0*/
  32.       ((USBD_HandleTypeDef *)hpcd.pData)->dev_remote_wakeup=0;
  33.       remotewakeupon = 1;
  34.     }
  35.   }
  36. }</font>
复制代码


移植USB设备可以使用cubemx也可以参考HAL库移植好的例子进行修改,基本常见的模式都可以找到例子,移植的时候要安装原理图的USB接线进行修改。通过简单的移植后下载到Nucleo 中可以看到电脑上枚举出来的设备,如果有多个设备可以使用VID&PID进行区分:


0.png


首先在XP系统中进行测试,可以看到电脑休眠后按下开发板的user按键马上可以点亮电脑屏幕唤醒系统。


11.gif




WIN10测试也可以唤醒系统唤醒指纹解锁。有的系统要设置设备能唤醒电脑,但是WIN10上没法设置这个选项。


TIM图片20170423230414.gif






测试代码:


HID_Remote_Wakeup.rar (62.6 KB, 下载次数: 92)
收藏 3 评论17 发布时间:2017-4-24 22:57

举报

17个回答
creep 回答时间:2017-5-12 21:40:44
donatello1996 发表于 2017-5-12 20:54
好的谢谢c神提醒,对了我点鼠标敲键盘可以正常唤醒,请问这个程序的功能跟点鼠标的效果一样吗? ...

我的不用敲键盘,直接按下user按键就可以唤醒。和鼠标唤醒效果一模一样。
donatello1996 回答时间:2017-5-12 20:54:19
creep 发表于 2017-5-12 18:41
电脑有个选项设置允许唤醒的,你瞅瞅。

好的谢谢c神提醒,对了我点鼠标敲键盘可以正常唤醒,请问这个程序的功能跟点鼠标的效果一样吗?
creep 回答时间:2017-5-12 18:41:10
donatello1996 发表于 2017-5-12 18:37
下了楼主的程序,电脑睡眠,按用户按键没法唤醒,c神知道是什么原因吗

电脑有个选项设置允许唤醒的,你瞅瞅。
Stm32McuLover 回答时间:2017-4-24 23:41:57
前来顶帖
limale 回答时间:2017-4-25 00:07:23
赞赞赞     
Paderboy 回答时间:2017-4-25 08:10:19
赞,顶起
creep 回答时间:2017-4-25 08:37:03

感谢支持   
creep 回答时间:2017-4-25 08:37:23

               
creep 回答时间:2017-4-25 08:37:55

谢谢 Paderboy
pener 回答时间:2017-4-26 08:41:14
这个不错不错,先备注
creep 回答时间:2017-4-26 08:56:53
pener 发表于 2017-4-26 08:41
这个不错不错,先备注

            
请叫我小张张 回答时间:2017-4-26 09:20:04
赞赞赞
五哥1 回答时间:2017-4-27 01:45:48
了不起
wofei1314 回答时间:2017-5-12 16:23:32
好贴!
donatello1996 回答时间:2017-5-12 18:37:00
下了楼主的程序,电脑睡眠,按用户按键没法唤醒,c神知道是什么原因吗
donatello1996 回答时间:2017-5-12 18:37:01
下了楼主的程序,电脑睡眠,按用户按键没法唤醒,c神知道是什么原因吗
donatello1996 回答时间:2017-5-12 18:37:02
下了楼主的程序,电脑睡眠,按用户按键没法唤醒,c神知道是什么原因吗
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版