STM32G070 Flash擦除失败:报Programming Size/Alignment Error求助
STM32G070 Flash擦除报错PGA_ERR+SIZ_ERR(错误码96)分析与解决
错误码含义拆解
先明确两个错误的硬件定义(来自STM32G070参考手册):
- SIZ_ERR(位6):Flash操作的长度/地址不符合对齐要求,或超出有效范围
- PGA_ERR(位5):操作目标地址不在合法Flash区域,或地址未按要求对齐
核心排查方向
1. 页号超出芯片Flash容量范围
STM32G070不同封装的Flash容量差异很大:
- G070CBT6/C8T6:128KB(共64页,页号0~63)
- G070FBT6/F8T6:64KB(共32页,页号0~31)
- G070RBT6:256KB(共128页,页号0~127)
你指定的页号是62:
- 如果用的是64KB版本的芯片,页号最大只能到31,62完全超出Flash范围,直接触发PGA_ERR+SIZ_ERR
- 先查你手上芯片的型号,确认Flash总页数,把
Page参数改成合法范围内的值(比如页30)测试
2. EraseInitStruct参数配置错误
- 确认
Page参数是页号而非字节地址:如果误把Flash字节地址填到Page字段,会导致地址完全超出合法范围,触发两个错误 - 检查
NbPages:如果设置的页数加上起始页号超出总页数,也会触发范围错误
3. Flash时钟配置异常
STM32G0的Flash控制器对HCLK时钟频率有要求(擦除操作最高支持64MHz):
- 如果HCLK超过手册规定的最大值,Flash控制器无法稳定工作,会抛出异常错误码
- 检查RCC配置,确保HCLK在芯片手册允许的Flash操作频率范围内
4. 写保护误配置
虽然你调用了HAL_FLASH_Unlock(),但如果该页被配置了永久写保护(WRP),也可能间接触发类似错误:
- 读取
FLASH_WRPR寄存器,确认页62未被设置写保护;如果有,需要先解除写保护再操作
HAL层相关性判断
HAL_FLASHEx_Erase的实现完全遵循STM32G0的硬件规范,极少出现本身的bug。错误几乎都是由参数配置、芯片型号不匹配或硬件时钟问题导致的:
- 可以查看HAL源码:
HAL_FLASHEx_Erase仅做基础的参数传递和错误状态返回,不会主动校验页号是否超出芯片容量(部分HAL版本可能省略此校验),所以非法参数会直接触发硬件错误
快速验证步骤
- 尝试擦除页0(所有型号都合法),如果成功,说明代码逻辑正常,仅页号参数错误
- 擦除页0仍报错的话,检查
HAL_FLASH_Unlock()是否正确执行(G0系列需要解锁CR和OPTCR两个寄存器,HAL函数已处理,但可以手动读取FLASH_CR的LOCK位确认)
内容的提问来源于stack exchange,提问作者Leonardo Oliveira
相关产品推荐
相关产品推荐

