[英]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_BOTH
對FLASH_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.