stm32低功耗停止模式,关闭了1.8区域时钟,关闭了HSI和HSE时钟,通过外部中断唤醒,外部中断不需要这些配置吗,1.8v区域时钟和HSI,HSE时钟吗?
在 STM32 的 Stop 模式下,即使关闭了 1.8V 区域的时钟、关闭了 HSI 和 HSE,外部中断(EXTI)仍然可以正常唤醒芯片。
不需要 HSI、HSE 和完整的 1.8V 区域时钟来检测外部边沿并产生唤醒。1. Stop 模式到底关了什么?进入 Stop 模式后:
- 1.8V 内核区域的所有时钟都被停止
- HSI、HSE、PLL 全部关闭
- 大部分外设停止工作
- 但 SRAM 和寄存器内容保留
- GPIO 状态保持
- 电压调节器可工作在正常模式或低功耗模式
- 为什么 EXTI 还能唤醒?关键点在于:EXTI 的边沿检测电路是异步的。
- EXTI 有专门的异步唤醒路径
- 它不依赖系统主时钟(HSI/HSE/PLL)
- 也不需要 1.8V 区域的完整时钟树在运行
- 只要对应的 GPIO 引脚和 EXTI 线配置正确,外部信号的边沿就能被检测到,并产生唤醒请求
这就是为什么官方文档明确说:
Stop 模式可以通过任意配置好的 EXTI 线(外部中断或事件)唤醒。
唤醒后的时钟情况唤醒后系统会自动发生以下变化:
芯片退出 Stop 模式
默认使用 HSI 作为系统时钟(频率较低,通常 8MHz 或 16MHz)
然后才会进入你配置的 EXTI 中断服务函数
中断返回后,从进入 Stop 的那条指令后面继续执行
因此,唤醒后必须重新配置系统时钟(如果之前用的是 HSE + PLL 等高频时钟),否则外设时序会出错。典型做法:c
// 进入 Stop 前 HAL_SuspendTick(); // 可选,关掉 SysTick HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后(在中断回调或返回后立刻执行) SystemClock_Config(); // 重新配置 HSE/PLL 等 HAL_ResumeTick();
- 需要提前配置好的内容虽然不需要时钟,但以下配置必须在进入 Stop 之前完成:
必须配置的项目 说明 GPIO 模式 配置为外部中断模式(上升沿/下降沿/双边沿) EXTI 线映射 正确映射到对应引脚 EXTI 触发方式 RTSR / FTSR 配置好 中断屏蔽 EXTI_IMR 对应位置 1(允许中断) NVIC 使能对应的 EXTI 中断通道 清除挂起标志 进入前清除 EXTI_PR 和相关唤醒标志
- 和其他唤醒源的对比
唤醒源 是否需要 HSI/HSE 是否需要 1.8V 时钟 说明 EXTI 外部中断 不需要 不需要 异步边沿检测 RTC 闹钟/唤醒 不需要(用 LSE/LSI) 不需要 备份域时钟 普通外设中断(定时器、UART等) 需要 需要 通常无法唤醒 Stop LPUART(部分系列) 可用 LSE 特殊支持 低功耗串口可唤醒 总结
- Stop 模式下关闭 1.8V 区域时钟、关闭 HSI/HSE 不影响 EXTI 外部中断唤醒。
- EXTI 使用的是异步检测电路,专门为低功耗唤醒设计。
- 唤醒后系统默认跑在 HSI 上,需要软件重新配置时钟。
- 进入 Stop 前必须正确配置好 GPIO + EXTI + NVIC。