繁体   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