1 前言 ' S8 K0 Y0 z2 v8 G4 H; \6 K5 @ 本文将针对 STM32F767 的 USB_OTG_FS 模块工作在 Host 模式下的挂起与恢复以及远程唤醒方面的问题进行讨论。 2 问题描述 2 m# E! u; q$ e9 f" ? 客户使用 STM32F767 做项目,使用 USB 作为 Host,客户发现 USB 在进入到挂起状态后通过远程唤醒信号并不能将其唤醒。 1 i7 s& m' H' }3 V. R* i# Y 3 问题分析与解决 : M2 v2 {6 N) N; G ~& S/ X 经过与客户邮件电话沟通发现用户是通过操作寄存器 OTG_HPRT 的 PSUSP,与 PRE 位来实现 USB 总线的挂起与恢复,发现 USB 总线的挂起与恢复会有问题。 3 T4 Z m5 e4 Q( ? / Q2 h- p, [, N0 \ 为了重现客户的现象,通过 STM32CubMX 工具基于 NUCLEO-F767 板子上新建一个工程,使 USB 工作在HID HOST 模式下。我们希望 HOST 端主动进入挂起状态后使用另外一块实现了鼠标功能的 STM32F407-DISCOVERY 板子可以发送一个远程唤醒信号来使 USB 总线恢复,从而唤醒 USB 主机。由于当前最新 F7 的 HAL 库(V1.9.0)针对HOST 并没有提供挂起与恢复的接口,于是,我们需要自己来实现以下两个功能,并添加到路径< Drivers\STM32F7xx_HAL_Driver\Src>下面的中。 h) k; {' ?* R! d1 Q' _ 于是 HOST 端主动进入挂起的代码实现为:代码操作 HPRT 寄存器的 PSUSP 位,使 USB 进入到挂起状态 8 L2 m9 t5 y& B! n1 I! [1 ~ 下面是 Host 从挂起模式恢复:代码两次操作了 PRES 位,为的是确保操作成功 ( ]# S. M/ \7 Y7 F- m$ b7 y0 n " U$ m" Y7 c, M : }, k; s5 L0 r! p7 u) M 那么这样的代码能成功挂起和恢复 USB 总线吗? ( E+ ^* h% m' y2 ]& B/ ? 经过实际测试,如果 HOST 主动调用 USB_SuspendPort 进入挂起状态是可以正常进入的,如果 HOST 自己主动再次调用 USB_ResumePort 恢复的话也可以正常恢复。但是,如果通过接收到远程唤醒信号后,HOST 端被动地在中断内调用 USB_ResumePort 函数来恢复的话则会失败! 同样的操作,放在 OTG_HS 的话又能够正常,但是客户当前使用的是 OTG_FS 来做产品的,看来两个 USB 外设之间还是存在一定的差异性,针对 OTG_FS 的远程唤醒对寄存器操作还是有一定的要求。 ' m) ~! Y3 y1 c# T5 j 经过一番研究与测试,我们最终通过修改后的代码来实现客户的需求: : a) X$ t' J$ i3 n : K% |# q6 C/ I; ~/ U4 q ... 了解更多,请下载后阅读 * w, v$ B0 y! p# W$ ` 下载地址1>> 下载地址2>> 更多实战经验>> ) E: Z& k% n2 [" |1 |; ^1 s0 r " \5 K6 k+ J4 y7 H4 C |
最全USB HID开发资料,悉心整理一个月,亲自测试
USB Audio设计与实现
【MCU实战经验】+STM32F107的USB使用
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32 USB-HID通信移植步骤STM32 USB HID键盘例程
基于STM32F746G-Discover的扩展电路板
【合集】STM32F7教程、资料大集合
F769 Discovery实现播放U盘音乐的播放器
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据