E
Member
一块电池供电的设备,MCU 进 STOP 模式省电,唤醒后 UART 收不到数据、ADC 读数漂移。查了半天是唤醒后外设寄存器没恢复——低功耗模式下有些外设时钟停了,寄存器状态丢了,代码却默认它们还在。
1. 先看手册的低功耗模式对照表。STOP、STANDBY、SLEEP 对时钟和寄存器的保留策略完全不同。我们用的芯片 STOP 模式下 SRAM 保留、寄存器保留,但外设时钟停;STANDBY 下连寄存器都不保。选模式之前先把这张表看明白,别凭感觉选。
2. 唤醒后按顺序恢复外设。我的做法:唤醒中断里先恢复系统时钟(HSI/PLL 重新起振需要时间),再按依赖顺序重新初始化外设——先 GPIO、再 UART、再 ADC。直接在主循环里用外设而不重新初始化,是最常见的翻车点。
3. 关键参数进休眠前先保存。ADC 校准值、UART 波特率分频系数、定时器比较值,这些进休眠前读出来存到保留 RAM 或备份寄存器里,唤醒后写回去。别指望所有寄存器都能自己恢复,实测下来总有几只“漏网之鱼”。
4. 唤醒源别贪多。外部中断、RTC、看门狗全开当唤醒源,误唤醒会把电池耗光。只开真正需要的唤醒源,唤醒后第一件事是判断唤醒原因,无关唤醒直接回去睡。
最后这块设备唤醒后 UART、ADC 全部正常,待机电流 8μA,电池续航从 3 个月提到 9 个月。
你们低功耗设计里,唤醒后外设恢复是靠重新初始化,还是靠寄存器备份?有没有遇到过手册没写明的寄存器丢失?
1. 先看手册的低功耗模式对照表。STOP、STANDBY、SLEEP 对时钟和寄存器的保留策略完全不同。我们用的芯片 STOP 模式下 SRAM 保留、寄存器保留,但外设时钟停;STANDBY 下连寄存器都不保。选模式之前先把这张表看明白,别凭感觉选。
2. 唤醒后按顺序恢复外设。我的做法:唤醒中断里先恢复系统时钟(HSI/PLL 重新起振需要时间),再按依赖顺序重新初始化外设——先 GPIO、再 UART、再 ADC。直接在主循环里用外设而不重新初始化,是最常见的翻车点。
3. 关键参数进休眠前先保存。ADC 校准值、UART 波特率分频系数、定时器比较值,这些进休眠前读出来存到保留 RAM 或备份寄存器里,唤醒后写回去。别指望所有寄存器都能自己恢复,实测下来总有几只“漏网之鱼”。
4. 唤醒源别贪多。外部中断、RTC、看门狗全开当唤醒源,误唤醒会把电池耗光。只开真正需要的唤醒源,唤醒后第一件事是判断唤醒原因,无关唤醒直接回去睡。
最后这块设备唤醒后 UART、ADC 全部正常,待机电流 8μA,电池续航从 3 个月提到 9 个月。
你们低功耗设计里,唤醒后外设恢复是靠重新初始化,还是靠寄存器备份?有没有遇到过手册没写明的寄存器丢失?
