2

我有一个问题,我尝试将值写入 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();

但无济于事。

我错过了一些明显的东西吗?

4

2 回答 2

1

发现问题。它与 STM32L476 上的双组闪存有关。擦除页 256 将擦除存储区 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();
于 2021-08-18T13:03:11.627 回答
1

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

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

要在 处擦除页面0x08080000,您需要FLASH_PageErase(page, FLASH_BANK_2 );设置page0

于 2021-08-18T12:57:13.917 回答