在 STM32U 系列低功耗开发中,为降低功耗常将系统时钟(SYSCLK)降至 12MHz,此时执行 Flash 擦写操作易触发报错,错误码 128、PGSERR 标志置位,导致功能中断。本文基于意法半导体官方 LAT1656 经验文档,从故障现象、根源、解决方案到实操代码,全面拆解 STM32U3 Flash 擦写故障,为嵌入式开发者提供可直接落地的排查方案。
资料获取:经验分享 | LAT1656 STM32U3 Flash擦写故障问题分析
1. 故障现象:降频后 Flash 擦写必报错
使用 NUCLEO-U385RG-Q 开发板,运行官方 FLASH_EraseProgram 例程时,出现典型场景差异:
- 正常场景:系统时钟 96MHz(默认高性能配置),Flash 擦除、编程操作完全正常,无报错;
- 故障场景:为控功耗将时钟改为 24MHz、最终降至 12MHz,再次执行 Flash 擦写时,立即触发error code=128,解析为
Programming sequence error,查看 FLASH_SR 寄存器,PGSERR(编程序列错误)位固定置 1,擦写失败。
该故障仅在低时钟、低功耗配置下出现,高时钟模式无异常,核心与 STM32U3 动态调压机制强相关。
2. 核心根源:Range2 电压模式不支持 Flash 擦写
STM32U3 内置动态电压缩放(DVS)管理,划分两种电压工作模式:
- Range1(高性能模式):高供电电压,支持 Flash 擦写、编程、选项字节修改等所有操作;
- Range2(低功耗模式):低供电电压,仅支持常规运行,禁止执行 Flash 擦写 / 编程操作。
故障本质:系统时钟降至 12MHz 时,代码默认将动态调压设为 Range2(低功耗),而 Flash 擦写必须在 Range1 下执行,电压模式不匹配触发 PGSERR 错误,对应手册明确条款:擦除 / 编程操作在 Range2 电压模式下启动,直接置位 PGSERR。
3. 分步解决方案:按时钟场景适配调压
解决核心逻辑:Flash 操作前强制切至 Range1,操作完成后切回 Range2 控功耗,分两种时钟场景配置。
3.1 场景一:SYSCLK≤24MHz(如 12MHz)
无需开启 EPOD 升压,直接切换电压模式:
// Flash操作前:切至Range1(高性能)
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) {
Error_Handler();
}
// 执行Flash擦写/编程操作...
// Flash操作后:切回Range2(低功耗)
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2) != HAL_OK) {
Error_Handler();
}
3.2 场景二:SYSCLK>24MHz
需先开启 EPOD 嵌入式升压,再切换至 Range1,严格遵循时序:
- 配置 EPOD 升压时钟(3–16MHz);
- 使能 EPOD 升压(R1EN=1、R2EN=0);
- 等待 R1RDY、BOOSTRDY 标志置位;
- 切换至 Range1,配置 Flash 等待状态;
- 执行 Flash 操作,完成后切回 Range2。
关键配置代码:
// 1. 配置EPOD升压时钟
if (HAL_RCCEx_EpodBoosterClkConfig(RCC_EPODBOOSTER_SOURCE_MSIS, RCC_EPODBOOSTER_DIV1) != HAL_OK) {
Error_Handler();
}
// 2. 使能EPOD升压
if (HAL_PWREx_EnableEpodBooster() != HAL_OK) {
Error_Handler();
}
// 3. 切至Range1,执行Flash操作
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) {
Error_Handler();
}
4. 关键避坑要点
- 电压模式优先级:Flash 擦写 / 编程、选项字节修改前,必须强制切至 Range1,与时钟频率无关;
- 标志位清除:操作前需清除 FLASH_SR 所有错误标志,避免历史错误触发 PGSERR;
- 时序合规:>24MHz 场景,EPOD 升压与电压切换需严格按手册时序执行,不可跳过等待步骤;
- 功耗平衡:Flash 操作完成后,及时切回 Range2,避免长期高功耗运行。
STM32U3 Flash 擦写故障并非硬件缺陷,而是动态调压模式与 Flash 操作的适配问题,核心解决思路是 “操作前升电压、操作后降功耗”。开发者在低功耗项目中,需严格遵循 “Range1 执行 Flash 操作、Range2 常规运行” 的原则,按时钟场景适配配置,即可彻底规避 PGSERR 报错,兼顾低功耗与功能稳定性。
667