Flash 经过几次立即重置后,闪存正在损坏

Flash 经过几次立即重置后,闪存正在损坏,flash,stm32,stm32f4discovery,Flash,Stm32,Stm32f4discovery,我想将设备ID永久存储在闪存中。所以我使用的是STM32的内部闪存。我可以在STM32中写入和读取闪存。将值写入闪存后,关闭,然后我可以毫无问题地读取它。但问题来自两种不同的场景,例如: 当我在第一次复位后立即复位MCU时,闪存中的数据变为0。 另一种情况可能是数据在一段时间后消失(未测试,无法获得完整的条件) 你知道闪光灯的问题吗 IDE:Keil MDK uVision 4 写入功能: void EEPROM_Write(uint32_t Data) { /* Porgram FLA

我想将设备ID永久存储在闪存中。所以我使用的是STM32的内部闪存。我可以在STM32中写入和读取闪存。将值写入闪存后,关闭,然后我可以毫无问题地读取它。但问题来自两种不同的场景,例如: 当我在第一次复位后立即复位MCU时,闪存中的数据变为0。 另一种情况可能是数据在一段时间后消失(未测试,无法获得完整的条件) 你知道闪光灯的问题吗

IDE: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;
  }
}

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

您是否检查了
BANK1\u START\u ADDR
BANK1\u END\u ADDR
之间的地址是否未被用于编程/调试stm32的任何程序覆盖?如果您只想存储像设备ID这样小的数据,为什么不使用备份寄存器呢?存储的数据量会增加太多,所以BKP对我来说不是一个好的选择。然而,我已经解决了这个问题,并将其发布到我的博客上。你能在stackoverflow上写下你的解决方案摘要吗?你的博客文章不是英文的,如果你的博客链接随着时间的推移变得无效,那么这些信息至少可以在stackoverflow上找到。没错。我需要准备一个mcu博客的快速文章,所以我准备了一个不同的语言,但我会尽快翻译成英语。然而,图表、代码和数字都是英文的,尽管文章的正文不是这样的,所以如果你急需的话,你可以试试这些。再次对此表示歉意
uint32_t EEPROM_Read(void)
{
    uint32_t readValue;
    FLASH_UnlockBank1();
    Address = BANK1_WRITE_START_ADDR;
    readValue = (*(__IO uint32_t*) Address);
    FLASH_LockBank1();  
    return  readValue;
}