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
相关产品推荐
相关产品推荐

