STM32U575 使用 LPTIM3 从 STOP2 模式唤醒时,常出现 “无法唤醒、持续停留在 STOP2” 的问题,核心原因是未启用 LPTIM3 的 Autonomous(自主)模式,缺少睡眠时钟使能和自主模式使能配置。本文基于 ST 官方 LAT1394 应用笔记,详解问题根源、关键配置要点及 1 分钟解决流程,适用于所有 STM32U5 系列 LPTIM(1/3/4)的 STOP2 唤醒场景。
1. 核心问题与现象
1.1 典型场景
- 硬件:STM32U575 芯片,LPTIM3 配置为内部计数器模式;
- 软件:移植自其他项目的成熟代码,LPTIM3 初始化正常,主循环中调用
HAL_PWREx_EnterSTOP2Mode进入低功耗; - 现象:MCU 进入 STOP2 后无法唤醒,电源模式输出引脚(PA5/PA6/PA7)波形显示 CSLEEP/CDSTOP/SRDSTOP 均为高电平(对应持续 STOP2 状态),排除硬件故障和芯片 BUG(勘误手册无相关记录)。
1.2 关键前提(参考手册 RM0456)
- LPTIM3 支持 STOP2 唤醒:STM32U575 的 LPTIM1/3/4 均支持从 STOP2 唤醒,仅 LPTIM2 不支持;
- 核心矛盾:代码仅初始化 LPTIM3 基本功能,未配置自主模式相关时钟位,导致 STOP2 模式下 LPTIM3 无法正常产生中断唤醒 MCU。
2. 问题根源:Autonomous 模式未启用(关键寄存器配置缺失)
2.1 LPTIM3 唤醒 STOP2 的核心要求
根据 RM0456 参考手册,STOP2 模式下 LPTIM3 需工作在 Autonomous 模式,需同时满足三个寄存器位配置:
| 寄存器位 | 功能 | 要求 |
|---|---|---|
| LPTIM3EN | LPTIM3 时钟使能 | 置 1(基本使能) |
| LPTIM3SMEN | 睡眠 / 停止模式时钟使能 | 置 1(确保 STOP2 下时钟不关闭) |
| LPTIM3AMEN | 自主模式使能 | 置 1(允许 STOP2 下产生中断) |
2.2 用户代码的缺失点
用户移植的代码仅配置了
LPTIM3EN(通过HAL_LPTIM_Init自动使能),未手动配置LPTIM3SMEN和LPTIM3AMEN,导致 STOP2 模式下 LPTIM3 时钟被关闭,无法计数产生唤醒中断。2.3 自主模式的核心作用
Autonomous 模式允许 LPTIM3 在 STOP2 模式下(APB 时钟停止)仍通过内部振荡器(LPOSC)运行,独立完成计数并触发中断,是唤醒 MCU 的关键。
3. 解决方案:3 步配置 Autonomous 模式
无需修改硬件,仅需在 LPTIM3 初始化后、启动前添加 2 行代码,启用睡眠时钟和自主模式:
3.1 原有 LPTIM3 初始化代码(保留不变)
static void MX_LPTIM3_Init(void) {
hlptim3.Instance = LPTIM3;
hlptim3.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; // 内部低功耗振荡器
hlptim3.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
hlptim3.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
hlptim3.Init.Period = 99; // 计数周期
hlptim3.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
if (HAL_LPTIM_Init(&hlptim3) != HAL_OK) {
Error_Handler();
}
}
3.2 添加 Autonomous 模式配置代码
在启动 LPTIM3 之前(调用
HAL_LPTIM_TimeOut_Start_IT前),添加以下代码:// 启用LPTIM3睡眠/停止模式时钟(LPTIM3SMEN置1)
__HAL_RCC_LPTIM3_CLK_SLEEP_ENABLE();
// 启用LPTIM3自主模式(LPTIM3AMEN置1)
__HAL_RCC_LPTIM3_CLKAM_ENABLE();
3.3 完整启动流程
// 初始化LPTIM3
MX_LPTIM3_Init();
// 配置Autonomous模式(关键新增)
__HAL_RCC_LPTIM3_CLK_SLEEP_ENABLE();
__HAL_RCC_LPTIM3_CLKAM_ENABLE();
// 启动LPTIM3超时中断(触发唤醒)
if (HAL_LPTIM_TimeOut_Start_IT(&hlptim3, TIMEOUT) != HAL_OK) {
Error_Handler();
}
// 进入STOP2模式(需先暂停滴答定时器)
HAL_SuspendTick();
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
3.4 验证结果
添加代码后,电源模式输出引脚波形显示:CSLEEP/CDSTOP/SRDSTOP 会周期性高低变化,MCU 正常从 STOP2 唤醒,循环进入低功耗模式,问题彻底解决。
4. 关键注意事项
- 通用配置规则:所有 SRD 域外设(LPTIM1/3/4、SPI3、I2C3 等)在 STOP2 模式下唤醒,均需启用
SMEN(睡眠时钟)和AMEN(自主模式)位,配置逻辑与 LPTIM3 一致; - 移植代码必查:从其他项目移植低功耗代码时,需检查目标芯片的外设自主模式配置,不可直接复用旧代码;
- 调试辅助:启用 PA5/PA6/PA7 作为电源模式输出引脚(AF0 复用功能),可直观通过波形判断 MCU 是否进入 / 退出 STOP2 模式;
- 时钟源选择:LPTIM3 需选择 LPOSC(低功耗振荡器)等独立时钟源,避免依赖 APB 时钟(STOP2 下 APB 时钟停止)。
STM32U5 LPTIM3 STOP2 模式唤醒失败,并非硬件或芯片缺陷,而是自主模式配置缺失导致。核心解决思路是 “启用睡眠时钟 + 自主模式”,仅需 2 行代码即可补齐配置,确保 LPTIM3 在 STOP2 模式下正常运行并触发唤醒。
阅读全文
124