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

查看: 5645|回复: 17

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

[复制链接]

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2017-4-24 22:57:08 | 显示全部楼层 |阅读模式
本帖最后由 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, 下载次数: 79)
<
回复

使用道具 举报

64

主题

744

回帖

23

蝴蝶豆

实习版主

最后登录
2020-12-8
发表于 2017-4-24 23:41:57 | 显示全部楼层
前来顶帖
回复 支持 反对

使用道具 举报

3

主题

1377

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2017-4-25 00:07:23 | 显示全部楼层
赞赞赞     
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2017-4-25 08:10:19 | 显示全部楼层
赞,顶起
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
 楼主| 发表于 2017-4-25 08:37:03 | 显示全部楼层

感谢支持   
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
 楼主| 发表于 2017-4-25 08:37:23 | 显示全部楼层

               
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
 楼主| 发表于 2017-4-25 08:37:55 | 显示全部楼层

谢谢 Paderboy
回复 支持 反对

使用道具 举报

1

主题

28

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-5-26
发表于 2017-4-26 08:41:14 | 显示全部楼层
这个不错不错,先备注
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
 楼主| 发表于 2017-4-26 08:56:53 | 显示全部楼层
pener 发表于 2017-4-26 08:41
这个不错不错,先备注

            
回复 支持 反对

使用道具 举报

14

主题

191

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-12-5
发表于 2017-4-26 09:20:04 | 显示全部楼层
赞赞赞
回复 支持 反对

使用道具 举报

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