经过几次立即复位后,Flash正在破坏

时间:2014-03-23 18:31:20

标签: flash stm32 stm32f4discovery

我想将设备ID永久存储在闪存中。所以我使用STM32的内部Flash。我可以在STM32中写入和读取Flash。将值写入闪存后,关闭然后我可以毫无问题地阅读它。但问题出现了几种不同的情况,例如: 当我在第一次复位后立即复位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;
  }
}

阅读功能

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

1 个答案:

答案 0 :(得分:1)

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