1
STM32 USB复位机制
主机可以对USB设备进行复位,主要是主机在和设备通讯之前会发送Reset信号把设备设置到默认的未配置状态,即主机拉低两根信号线(SE0状态)并保持10ms。当STM32 USB设备检测到主机的复位信号之后,如果复位中断使能,则会进入复位中断处理函数。
STM32 USB设备也可以对自身进行复位,置位控制寄存器的FRES对USB模块强制复位,此时USB模块将一直保持在复位状态下直到软件清除此位。如果USB复位中断被使能,将产生一个复位中断。USB设备在上电后首先会强制对自己进行复位,让自己处于未配置状态。
2
STM32 USB挂起机制
USB主机以3毫秒内不发送任何信号标志进入挂起状态(3ms以上的J状态,J状态也叫做IDEL状态)。通常情况下USB主机每毫秒会发送一个SOF,当USB模块检测到3个连续的SOF分组丢失事件即可判定主机发出了挂起请求,接着它会置位SB_ISTR寄存器的SUSP位,以触发挂起中断,如果USB挂起中断被使能,将产生一个挂起中断。
USB设备也可以在任何地方将USB_CNTR寄存器的FSUSP置为’1’来强制挂起自己,这个过程不需要主机参与。
实际的挂起操作过程对于不同的USB设备来说是不同的,因为需要不同的操作来降低电源消耗。STM32典型的挂起处理如下。
将USB_CNTR寄存器的FSUSP置为’1’,这将使USB模块进入挂起状态。USB模块一旦进入挂起状态,对SOF的检测立刻停止,以避免在USB挂起时又发生新的SUSP事件。
消除或减少USB模块以外的其他模块的静态电流消耗。
将USB_CNTR寄存器的LP_MODE位置为’1’,这将消除模拟USB收发器的静态电流消耗,但仍能检测到唤醒信号。
可以选择关闭外部振荡器和设备的PLL,以停止设备内部的任何活动。
3
STM32 USB唤醒机制
USB设备进入挂起状态之后,将由Resume信号进行唤醒。Resume信号可以由USB主机发起,也可以由USB设备本身触发, 但是只有USB主机可以结束Resume信号 。
1.主机在挂起设备后可通过翻转数据线上的极性并保持20ms来唤醒设备,并以低速EOP信号结尾。
2.如果设备支持远程唤醒,设备可向主机发起远程唤醒请求,前提是设备已进入idle状态至少5ms,设备会驱动总线进入K状态,如下图,K状态必须维持1ms-15ms之内,此信号会在1ms内被主机接管,主机会继续驱动唤醒信号直到20ms,并以低速EOP信号结尾。

STM32 设备被唤醒后,如果唤醒中断使能,则会进入唤醒中断,我们在中断处理函数里面首先要将USB_CNTR寄存器的LP_MODE位置为’0’,退出低功耗模式,然后清除USB_CNTR寄存器的FSUSP位,退出强制挂起操作。
关键字:STM32 USB
引用地址:
STM32 USB复位机制、挂起机制及其唤醒机制详解
推荐阅读最新更新时间:2026-03-25 10:19
保障嵌入式系统稳定的关键机制:看门狗、复位与异常处理
在嵌入式系统开发中,系统一旦“跑飞”,最令人担忧的并非软件缺陷,而是程序卡死且无法被及时察觉。此时,芯片内置的自我保护机制显得尤为关键。复位源与异常处理机制共同构成了确保系统可靠性的重要基石。本文将系统阐述它们的作用、原理及实际应用。 一、看门狗(Watchdog mer) 1. 原理 看门狗定时器本质上是一个独立定时器,持续倒计时: 软件在规定时间内“喂狗”(重置看门狗计数器),系统继续运行。 如果程序死循环或跑飞,没有及时喂狗,看门狗触发复位,将 拉回初始状态。 示例: 独立看门狗 IWDG 喂狗代码 #include "stm32f4xx_hal.h" IWDG_Han
[嵌入式]
用stm32的usb hid实现游戏控制器
1、 用cubemx生成基础工程,游戏控制器一般就是按钮和旋钮的组合,按钮就是gpio,旋钮是adc。具体配置就不罗嗦了。 connectivity这里打开usb,勾选Device,参数保持默认即可。 Middleware and Software Packs这里选择USB_DEVICE,Mode这里选择Custom HID,参数如果懂可以根据需求改,不懂保持默认,后边我们在代码里改也可以。 之后配置好时钟和其他设置,生成代码即可。 2、 我用的vscode+platformio开发环境,新建工程并打开导出的代码。Cubemx和platformio的文件夹结构不同,需要挪一下文件,主要是将Core/Src下的文件放
[单片机]
STM32 CubeMX配置详解:USB烧录程序的使用与设置
本次使用STM32G474VET6芯片 配置并编写测试程序 1.配置芯片 CubeMX- 选择芯片,SYS默认不变 配置RCC与时钟树 配置USB 生成代码。为了方便观察程序是否烧录成功,再开启一个GPIO驱动LED 2.进入MDK,循环中加入LED的闪烁 正式进入USB烧录步骤: 1.进入DFU模式:BOOT0拉高 → 复位 → 芯片进入Bootloader。 本型号芯片BOOT0连接PB8引脚,将PB8与3V3短接,然后复位(重新上电)芯片,芯片即可进入Bootloader 2.连接USB到电脑:使用USB-C线连接开发板与电脑。 USB-C母座DP、DN引脚直连单片机D
[单片机]
STM32外设实战指南:USB功能详解
1. 文档概述 1.1 目的 本文档提供USB(通用串行总线)技术的全面说明,包括协议标准、硬件接口、数据传输规范及开发指南。 1.2 适用范围 USB 2.0/3.0/3.1/4.0等版本 Type-A/B/C等接口类型 2. USB技术简介 2.1 基本概念 定义:USB(Universal Serial Bus)是一种标准化连接接口,用于设备间的数据传输与电力供应。 特点:热插拔、即插即用、多设备级联、支持多种传输模式。 2.2 发展历史 版本 发布时间 速率 关键改进 USB 1.0 1996 1.5 Mbps 低速设备支持 USB 2.0 2000 480 Mbps 高速模式(Hi-Spee
[单片机]
STM32单片机的usb上电和断电函数的定义
usb_pwr.c 这个文件看文件名就知道跟功耗有关了,有很多的状态:上电、掉电、挂起、恢复。 当首先是usb的上电和断电函数的定义了。 usb上电函数如下: /******************************************************************************* * Function Name : PowerOn * Description : 上电 * Input : None. * Output : None. * Return : USB_SUCCESS. ****************************************************
[单片机]
STM32 USART与USB接收不定数据方法,标准库、HAL库都适用
很多时候,我们使用串口或USB接收数据时,往往不知道PC端会发多长的数据下来, 为了解决这个不定数据接收问题,在此各提供一个解决思路。 串口数据不定接收: 由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据, 由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。 IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一 次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以 叫做一包数据。 还有一个RXNE中断,当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就 会产生IDLE中断。比如给单片机一次性发送8个字
[单片机]
STM32Cumebx HAL库实现STM32 USB虚拟串口的收发
这里记录一下用STM32Cumebx实现USB虚拟串口的过程,以F072为例大家可以一起学习讨论一下。 1.新建工程 这里选择SW烧录调试,看个人习惯,如果不习惯用SW的你们可以换其他的也行。 我这里因为直接使用MCU的内部时钟就没有勾选RCC了,然后直接配置时钟树,具体如下: 最后一点比较重要点的就是要配置USB堆的大小,把它改大一点,不然容易出现电脑实现出现黄色感叹号情况,这里选的编译软件是MDK-ARM。 最后编译生成代码 2.用keil打开工程编辑 找到usb_cdc_if.c文件,在文件开始处添加接收USB转串口数
[单片机]
关于stm32的USB和SPI疑似存在干扰的问题
情况是这样的,最近做一个项目,使用的是stm32f103RE单片机,使用到了单片机的usb口和SPI1。USB虚拟成串口向上位机发送数据,已经通过修改官网的例程调试通过,SPI1也能正常工作。但是当把两个功能做在同一个工程中时,发现出现了一些问题:USB想上位机发送一段时间后会停止发送(我的程序是在while中一直发送);USB发送会出现乱码。当我把SPI1的读写函数注释掉之后上述问题有消失了。这个问题纠结了我好几天了,不知道各位高手能不能帮我解答解答。 调试发现程序停在了while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);中,但是之前没有添加USB功能模块
[单片机]