gpt4 book ai didi

几次立即重置后闪存损坏

转载 作者:行者123 更新时间:2023-12-01 14:03:33 25 4
gpt4 key购买 nike

我想将设备 ID 永久存储在闪存中。所以我用的是STM32的内部Flash。我可以在 STM32 中写入和读取闪存。将值写入闪存后,关闭电源,然后我可以毫无问题地读取它。但是问题出现在几个不同的场景中,例如:当我在第一次重置后立即重置 MCU 时,闪存内的数据变为 0。另一种情况可能是数据在一段时间后消失(未测试且无法获得完整条件)对这个闪存问题有什么想法吗?

集成开发环境:Keil MDK uVision 4

写函数:

void EEPROM_Write(uint32_t Data)
{
/* Porgram FLASH Bank1 ********************************************************/
FLASH_UnlockBank1(); /* Unlock the Flash Bank1 Program Erase controller */
NbrOfPage = (BANK1_WRITE_END_ADDR - BANK1_WRITE_START_ADDR) / FLASH_PAGE_SIZE; /* Define the number of page to be erased */
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); /* Clear All pending flags */

for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++) /* Erase the FLASH pages */
{
FLASHStatus = FLASH_ErasePage(BANK1_WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
}

Address = BANK1_WRITE_START_ADDR; /* Program Flash Bank1 */
while((Address < BANK1_WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
{
FLASHStatus = FLASH_ProgramWord(Address, Data);
Address = Address + 4;
}

FLASH_LockBank1();
Address = BANK1_WRITE_START_ADDR; /* Check the corectness of written data */
while((Address < BANK1_WRITE_END_ADDR) && (MemoryProgramStatus != FAILED))
{
if((*(__IO uint32_t*) Address) != Data)
{
MemoryProgramStatus = FAILED;
}
Address += 4;
}
}

读取函数

uint32_t EEPROM_Read(void)
{
uint32_t readValue;
FLASH_UnlockBank1();
Address = BANK1_WRITE_START_ADDR;
readValue = (*(__IO uint32_t*) Address);
FLASH_LockBank1();
return readValue;
}

最佳答案

幸运的是,我已经解决了我的问题,如下所述:在主函数内初始化外设后,我根据某些条件调用了 EEPROM_Write() 函数。一旦我重新启动了整个系统,闪存写入操作就被外部开关需求中断了。因此,我找到了几个不同的解决方案,而不是在开始时调用 EEPROM_Write(),例如我在低功耗中断出现时调用此函数。更多详细信息发布在我的博客上:http://www.ozturkibrahim.com/TR/eeprom-emulation-on-stm32/谢谢

关于几次立即重置后闪存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22595175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com