簡體   English   中英

寫入 STM32L4R5 微控制器的 Flash Memory 出現問題

[英]Problem with Writing to the Flash Memory of the STM32L4R5 microcontroller

我正在嘗試在 HAL_FLASH_Program() 的“FLASH_TYPEPROGRAM_FAST”模式下寫入 STM32L4R5 的 flash memory。

MCU 的 flash 配置為 Single Bank。

寫入 flash 僅在使用“FLASH_TYPEPROGRAM_DOUBLEWORD”時有效。 flash 在“FLASH_TYPEPROGRAM_FAST”模式下寫入時讀取為 0xFFFFFFFF。

這是我的測試項目:

// Page Erase Structure
static FLASH_EraseInitTypeDef EraseInitStruct;

// Page Erase Status
uint32_t eraseStatus;

// Data Buffer
uint64_t pDataBuf[32] =
{
   0x1111111122222222, 0x3333333344444444,
   0x5555555566666666, 0x7777777788888888,
   0x12345678ABC12345, 0x23456789DEF01234,
   0x34567890AAABBB12, 0x4567890FABCDDD34,
   0x1111111122222222, 0x3333333344444444,
   0x5555555566666666, 0x7777777788888888,
   0x12345678ABC12345, 0x23456789DEF01234,
   0x34567890AAABBB12, 0x4567890FABCDDD34,
   0x1111111122222222, 0x3333333344444444,
   0x5555555566666666, 0x7777777788888888,
   0x12345678ABC12345, 0x23456789DEF01234,
   0x34567890AAABBB12, 0x4567890FABCDDD34,
   0x1111111122222222, 0x3333333344444444,
   0x5555555566666666, 0x7777777788888888,
   0x12345678ABC12345, 0x23456789DEF01234,
   0x34567890AAABBB12, 0x4567890FABCDDD34
};

// Flash Page Start Address
uint32_t pageAddr = 0x081FE000;

// Fill Erase Init Structure
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks     = FLASH_BANK_1;
EraseInitStruct.Page      = 255;
EraseInitStruct.NbPages   = 1;

// Unlocking the FLASH Control Register
HAL_FLASH_Unlock();

// Clear OPTVERR Bit Set on Virgin Samples
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);

// Erasing the Flash Page 
HAL_FLASHEx_Erase(&EraseInitStruct, &Error);

#if 0
// Wriring a Doubled Word to Flash. pDataBuf[0] is the 64-bit Word
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, pageAddr, pDataBuf[0]);
#else
// Wriring 32 Double Words. pDataBuf is the Starting Address of the 64-bit Array  
HAL_FLASH_Program(FLASH_TYPEPROGRAM_FAST_AND_LAST, pageAddr, pDataBuf);
#endif

// Locking the FLASH Control Register
HAL_FLASH_Lock();

我做錯什么了嗎?

謝謝,

伊萬

文檔 RM0932,STM32L4+ 參考手冊,FLASH 部分。 它涵蓋了對 flash 的讀取和寫入,適用於單組和雙組配置以及該系列的不同 MCU 型號。 似乎,大多數差異是關於從 Flash 讀取(64 位用於雙排,128 位用於單排)。 至於寫作,第128頁:

在此處輸入圖像描述

Flash對數據寬度非常挑剔,每個STM32的flash似乎都有不同的數據寬度。 最近我偶然發現了一個,它只接受 16 位的寫入和讀取。 這個喜歡雙字。 沒有通用的 function 可以讀寫 flash 到任何 STM32,因此您的命令之一似乎不遵守此 MCU 的 Flash 數據寬度規則。 您可以根據參考手冊檢查是否出現任何錯誤標志,盡管如您所見,它並沒有說明任何關於嘗試寫入 32 位數據的內容。 我預計寫入會失敗,但我們無法從提供的屏幕截圖中得出關於錯誤標志的任何結論。 如果您足夠好奇,您可以查看您的每種模式/功能使用的數據寬度,看看會發生什么。 64 位寫入必須工作。

暫無
暫無

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

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