You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32L476 Flash页擦除无效果且写入触发PROGERR错误求解

STM32L476 Flash擦除失败问题根因及解决方法

核心问题:Flash页号与Bank参数配置错误

STM32L476采用双Bank Flash架构,单页大小为2KB:

  • Bank1地址范围:`0x080000000x0807FFFF,共256页,页号独立编号范围为0255
  • Bank2地址范围:0x08080000~0x080FFFFF,共256页,页号独立编号范围为0~255

你要操作的0x08080000地址属于Bank2的第0页,而HAL库FLASH_PageErase()函数的页号参数为单Bank独立编号,不是全局连续编号。你传入的代码传入页号256 + FLASH_BANK_BOTH参数时,Bank1不存在256号合法页,参数非法导致擦除操作直接被硬件拒绝,Flash内容自然不会变化。

其他遗漏操作点

  • 未校验HAL操作返回值:所有HAL Flash操作函数都有返回值,可标识操作是否成功、返回具体错误码,当前代码没有做返回值判断,无法定位失败节点
  • 未排查写保护配置:需要确认Bank2的对应页是否被选项字节中的写保护(WRP)位锁定,保护状态下擦除操作会静默失败

修正后的参考代码

uint32_t page = 0; // Bank2的页号从0开始独立计数
HAL_StatusTypeDef op_status;

HAL_FLASH_Unlock();
// 清除所有之前的错误标志
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
// 仅擦除Bank2的目标页,不要使用FLASH_BANK_BOTH参数
op_status = FLASH_PageErase(page, FLASH_BANK_2);
if (op_status != HAL_OK) {
    // 此处可添加错误处理逻辑,读取错误码定位问题
}
op_status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
if (op_status != HAL_OK) {
    // 此处可添加超时/操作错误处理逻辑
}
CLEAR_BIT(FLASH->CR, FLASH_CR_PER | FLASH_CR_PNB);
HAL_FLASH_Lock();

// 可选添加擦除结果校验
if (*(uint32_t *)0x08080000 != 0xFFFFFFFF) {
    // 擦除失败处理逻辑
}

内容的提问来源于stack exchange,提问作者Louis Cloete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:09:03