ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32C0低功耗USB设备STOP模式唤醒机制与实现方案

STM32C0低功耗USB设备STOP模式唤醒机制与实现方案 去年做一批基于 STM32C0 的 USB 小外设时遇到一个绕不开的低功耗需求USB 总线挂起之后让 MCU 进入 STOP 模式省电主机那边发一个 USB Resume 信号过来设备又能立刻醒过来接着干活。听起来简单真做起来才发现坑不少——STM32C0 的 USB 外设在 STOP 模式下是彻底没有时钟的常规的“USB 中断唤醒”在 STOP 下根本不生效。这篇文章把我踩过的坑和最终跑通的方案完整写出来既讲原理也给代码和实测时序适合正在做 STM32C0 低功耗 USB 设备的工程师参考。1. USB 总线挂起与恢复STOP 模式的唤醒源陷阱1.1 低速 USB 的 J/K 状态与 Resume 时序先快速过一遍 USB 总线的电平模型。STM32C0 的 USB 控制器是低速设备速率 1.5Mbps总线上只有两根线 D 和 D-。空闲状态下D- 被设备内部 1.5kΩ 上拉拉高D 被主机端 15kΩ 下拉拉低这个组合叫 J 状态。主机想要唤醒设备时会主动把 D 拉高、D- 拉低持续至少 20ms这个状态叫 K 状态。总线从 J 跳到 K再回到 J整套动作就是 USB Resume 序列。挂起检测的逻辑是反向的主机停止发送帧起始包SOF之后总线进入 J 状态设备端连续 3ms 检测不到任何总线活动USB 外设就会产生一个挂起事件。按照 USB 规范设备这时候必须进入挂起状态把非必要电路关掉响应主机电源管理策略。对于 USB HID、传感器这类设备挂起就是做低功耗的黄金窗口。这个时序里最重要的数据就是 3ms 和 20ms。3ms 决定了从主机停止发包到设备触发挂起中断的固定门槛20ms 则给了从 STOP 唤醒到重新恢复 USB 外设的充足余量。后面所有设计都是围绕这两个数字展开的。1.2 STM32C0 的 STOP 模式为什么收不到 USB 事件问题出在 STOP 模式本身。C0 进入 STOP 模式后系统时钟和大部分外设时钟都会停掉USB 外设的工作时钟自然也没了。一个没有时钟的外设哪怕总线上 K 状态再明显它也检测不到更别提产生中断。很多人第一次做低功耗 USB 会这么写先初始化 USB 中断在挂起中断里进入 WFI然后期待主机的 Resume 信号能触发 USB 的 WKUP 中断把 MCU 弄醒。这个思路在 Sleep 模式下说得通——Sleep 模式只是停了 CPU
返回列表