写入后stm32f746闪存读取返回null

时间:2018-08-28 15:11:06

标签: c++ stm32 ram flash-memory stm32f7

我正在将设置保存到闪存中,然后再次读取它们。其中两个值始终返回为空。但是,数据已写入闪存,因为在重置后,读取的值是新保存的值,并且不为空。

从另一家公司接手代码后,我做了一些代码重构之后,我开始遇到这个问题。

当您实际执行以下操作时(旧的低效方式),可以保存并读回设置: 保存设置0-读取设置0 保存设置1-读取设置1 ... 保存设置13阅读设置13

这是极其低效且缓慢的,因为从闪存读取具有所有设置的同一页面,清除了整个闪存块,将新设置放入读取缓冲区,然后将整个块(仅更改了1个设置)写入闪存。所有14种设置都会发生这种情况!!但这有效...

unsigned char Save_One_Setting(unsigned char Setting_Number, unsigned char* value, unsigned char length)
{
  /* Program the user Flash area word by word
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
  unsigned int a;

  Address = FLASH_USER_START_ADDR;
  a = 0;
  while (Address < FLASH_USER_END_ADDR)
  {
    buf[a++] = *(__IO uint32_t *)Address;
    Address = Address + 4;
  }

  memset(&buf[Setting_Number * 60], 0, 60);         // Clear setting value
  memcpy(&buf[Setting_Number * 60], &value[0], length); // Set setting value

  Erase_User_Flash_Memory();

  HAL_FLASH_Unlock();

  Address = FLASH_USER_START_ADDR;
  a = 0;

  while (Address < FLASH_USER_END_ADDR)
  {
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, buf[a++]) == HAL_OK)
    {
        Address = Address + 4;
    }
   else
    {
      /* Error occurred while writing data in Flash memory.
         User can add here some code to deal with this error */
      while (1)
      {
        /* Make LED1 blink (100ms on, 2s off) to indicate error in Write operation */
        BSP_LED_On(LED1);
        HAL_Delay(100);
        BSP_LED_Off(LED1);
        HAL_Delay(2000);
      }
    }
  }

  /* Lock the Flash to disable the flash control register access (recommended
     to protect the FLASH memory against possible unwanted operation) *********/
  HAL_FLASH_Lock();
}

我实际上是通过将闪存中的设置读取到缓冲区中,然后更新缓冲区中所有更改的设置,然后擦除闪存块并将缓冲区写回到闪存中来进行更改的。缺点:将缓冲区保存到闪存后,我的第一个和第四个值始终返回为NULL。

但是,在系统重置后,将从闪存读取正确的值。

unsigned char Save_Settings(Save_Settings_struct* newSettings)
{
  /* Program the user Flash area word by word
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
  unsigned int a;
  unsigned char readBack[60];

  Address = FLASH_USER_START_ADDR;
  a = 0;
  while (Address < FLASH_USER_END_ADDR)
  {
    buf[a++] = *(__IO uint32_t *)Address;
    Address = Address + 4;
  }

  a = 0;

  while (a < S_MAXSETTING)
  {
      if (newSettings[a].settingNumber < S_MAXSETTING)
      {
          memset(&buf[a * 60], 0, 60);          // Clear setting value
          memcpy(&buf[a * 60], newSettings[a].settingValue, newSettings[a].settingLength);  // Set setting value
      }

      ++a;
  }

  Erase_User_Flash_Memory();

  HAL_FLASH_Unlock();

  Address = FLASH_USER_START_ADDR;
  a = 0;

  while (Address < FLASH_USER_END_ADDR)
  {
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, buf[a++]) == HAL_OK)
    {
        Address = Address + 4;
    }
   else
    {
      /* Error occurred while writing data in Flash memory.
         User can add here some code to deal with this error */
      while (1)
      {
        /* Make LED1 blink (100ms on, 2s off) to indicate error in Write operation */
        BSP_LED_On(LED1);
        HAL_Delay(100);
        BSP_LED_Off(LED1);
        HAL_Delay(2000);
      }
    }
  }

  /* Lock the Flash to disable the flash control register access (recommended
     to protect the FLASH memory against possible unwanted operation) *********/
  HAL_FLASH_Lock();
}

我开始研究清理和使数据缓存无效。至少2个值不再是NULL,但是它们仍然是旧值。所有其他值都是新的保存值。进行重置,所有值都是正确的。

有人遇到过类似的问题吗?还是我可以尝试摆脱这个问题的想法?

0 个答案:

没有答案