本帖最后由 Peixu 于 2025-6-6 17:46 编辑
在基于 APM32F107 微控制器的项目开发过程中,低功耗性能是许多应用场景重点关注的指标之一。然而,不少开发者在完成 USB 初始化操作后,将系统切换至 STOP 模式时,会遇到功耗异常的问题。即便已对所有 IO 引脚和时钟进行了细致的配置处理,系统整体功耗仍明显高于正常 STOP 模式下的预期值,通常高出 1 毫安以上,这一现象严重影响了产品的能耗表现。
如以下现象所示 使用APM32F107在初始化了 USB 之后进入STOP的时候,就算配置了所有的io和时钟的处理,功耗还是没办法降下去。 比正常的STOP高一点多毫安。
经查阅 APM32F107 的数据手册可知,USB 外设本身存在 1.75mA 的固有功耗,
这一信息为解决该问题指明了方向 —— 系统进入 STOP 模式时,USB 模块并未实现完全关闭,处于持续耗电状态,进而拉高了整体功耗。
要解决这一问题,需从 USB 模块的关闭机制入手,采取针对性措施确保其在 STOP 模式下不再消耗额外电能。
对于标准的 APM32F107 开发场景,最为关键的解决步骤是在系统进入 STOP 模式前,在程序中加入USB_DeviceReset()函数调用。此函数能够对 USB 设备进行全面复位,切断其与外部设备的数据交互链路,同时关闭内部相关电路,使其进入低功耗状态,从而避免在 STOP 模式下产生不必要的功耗。
如图:查看手册 USB外设是有1.75mA的功耗, 说明USB没有完全关闭。
若使用的是 APM32F107 的 OTG 系列芯片,处理流程会更加复杂。除了调用USB_DeviceReset()函数外,还需对 USB 外设的相关寄存器进行特定配置。
首先,将OTGFSRS[color=rgba(0, 0, 0, 0.85)]寄存器置 1,这一操作可触发 USB 外设的硬件复位流程,使 USB 模块停止当前所有数据传输和处理任务;其次,将OTGFSEN寄存器置 0,关闭 USB 外设的时钟供应,时钟是模块正常工作的时序基础,关闭时钟意味着从根本上切断了 USB 模块的工作能源,使其彻底停止运行,进入低功耗状态。
解决方案:
如参考下图需要在加入 USB_DeviceReset();
如果是OTG系列,除了上面那个函数,也是要把USB外设复位(OTGFSRST = 1),同时关闭时钟(OTGFSEN = 0)
|