0

我正在将设置保存到闪存并再次读取它们。其中 2 个值总是空的。然而,数据被写入闪存,因为在复位后读取的值是新保存的值而不是空的。

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

当您实际执行以下操作(旧的低效方式)时,保存和读取设置有效:保存设置 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();
}

我开始尝试清理数据缓存并使数据缓存失效。至少这两个值不再是 NULL,但是,它们仍然是旧值。所有其他值都是新的、保存的值。进行重置,所有值都正确。

有人遇到过类似的问题吗?或者也许我可以尝试摆脱这个问题的想法?

4

0 回答 0