STM32L476 flash页擦除没有效果

STM32L476 flash Page erase has no effect

我在尝试将值写入 STM32L476 中的闪存页面(第 256 页 @ 0x08080000)时遇到问题。但是,我在闪存状态寄存器中设置了 PROGERR 错误。这意味着试图将非零值写入未擦除为 0xFFFFFFFF 的闪存位置。

我是这样擦除闪存的:

uint32_t page = 256;
HAL_FLASH_Unlock();
FLASH_PageErase(page, FLASH_BANK_BOTH);
FLASH_WaitForLastOperation((uint32_t) FLASH_TIMEOUT_VALUE);
CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));
HAL_FLASH_Lock();

然而,当我在擦除后检查闪存内容时,它并没有改变旧的、未擦除的值。

我试着改成

uint32_t page = 256;
HAL_FLASH_Unlock();
SET_BIT(FLASH->SR, (FLASH_FLAG_ALL_ERRORS));
FLASH_WaitForLastOperation((uint32_t) FLASH_TIMEOUT_VALUE);
FLASH_PageErase(page, FLASH_BANK_BOTH);
FLASH_WaitForLastOperation((uint32_t) FLASH_TIMEOUT_VALUE);
CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));
HAL_FLASH_Lock();

但无济于事。

我是不是遗漏了什么明显的东西?

每行有 256 页,编号为 0-255。因此,第 256 页无效。地址 0x08080000 处的闪存是 bank 2 的第 0 页。无效的页码将导致 FLASH_PageErase 断言失败或使用不同的值。

FLASH_BANK_BOTHFLASH_PageErase 无效,因此断言也将失败或使用不同的银行值。您一次只能擦除一个库。否则,来自闪存的 运行 会导致崩溃,因为您不能同时读取和写入一个存储体。

要擦除 0x08080000 处的页面,您需要执行 FLASH_PageErase(page, FLASH_BANK_2 ); 并将 page 设置为 0

发现问题。它与 STM32L476 上的双组闪存有关。擦除第 256 页会擦除 bank 1 中的第 0 页。

正确检查并擦除正确的页面如下所示:

uint32_t page = 256;
HAL_FLASH_Unlock();
FLASH_PageErase(page & 0xFF, (page & 0x100) == 0 ? FLASH_BANK_1 : FLASH_BANK_2);
FLASH_WaitForLastOperation((uint32_t) FLASH_TIMEOUT_VALUE);
CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));
HAL_FLASH_Lock();