簡體   English   中英

STM32L476 flash Page擦除沒有效果

[英]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處的閃存是存儲體 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM