STM32F411VET6 хранение данных во флэш-памяти R / W - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь сохранить данные во флэш-памяти на STM32F411VET6.Я хочу, чтобы память сохранялась и оставалась там даже после перезагрузки MC.Я просмотрел это , это , это и это примеры, но я все еще не уверен, что делаю это правильно.Мне удалось создать местоположение в памяти (я проверил в файле карты) с этим в качестве моего разбросанного файла:

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00060000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  USER_CONFIG 0x08060000 0x0001FFFF  {
   userConfig.o (+RW)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

и это для моего кода (адаптировано из этого примера):

__attribute__((__section__("USER_CONFIG"))) const char userValues[64];

void Write_Flash(uint32_t data[], uint8_t flashTypeProgram)
{
  uint8_t addressGap;
  HAL_FLASH_Unlock();
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR);
  FLASH_Erase_Sector(FLASH_SECTOR_7, VOLTAGE_RANGE_3);
  int ii = 0;
  for (ii = 0; ii < 64 / pow(2, flashTypeProgram); ii++)
  {
    addressGap = pow(2, flashTypeProgram) * ii;
    HAL_FLASH_Program(flashTypeProgram, userValues[0] + addressGap, data[ii]);
  }
  HAL_FLASH_Lock();
}

но всякий раз, когда я строю код, я получаю сообщение об ошибке «Нет раздела, совпадающего с шаблоном userConfig.o».

Есть ли что-то, что я настраиваю неправильно или почему, если япропускаю звонок где-то?

1 Ответ

0 голосов
/ 21 февраля 2019

Мне удалось получить решение с помощью Камила Цука , который помог мне решить некоторые проблемы.Одна из проблем, с которыми я столкнулся при работе с scatter-файлом, заключалась в том, что мои адреса загрузки и выполнения не совпадали, что приводило к тому, что компоновщик не работал должным образом (очень хорошо объяснено в этой ссылке ).Я изменил свой файл .sct следующим образом:

LR_IROM1 0x08000000 0x00060000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00060000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_IROM2 0x08060000 0x00020000 {  ; load region size_region
  USER_CONFIG 0x08060000 0x00020000  {
   *(.user_data)
  }
}

Эта реализация, в которой была создана дополнительная область загрузки, привела бы к тому, что мой адрес загрузки и адрес исключения стали одинаковыми.

Затем вЕсли кто-то приходит сюда и ищет помощи, вот мой код для перепрошивки:

__attribute__((section(".user_data"))) const char userConfig[64];

[...]

void Write_Flash(uint32_t data[], uint8_t flashTypeProgram)
{
  uint8_t addressGap;
  HAL_FLASH_Unlock();
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR);
  FLASH_Erase_Sector(FLASH_SECTOR_7, VOLTAGE_RANGE_3);
  int ii = 0;
  for (ii = 0; ii < 64 / pow(2, flashTypeProgram); ii++)
  {
    addressGap = pow(2, flashTypeProgram) * ii;
    HAL_FLASH_Program(flashTypeProgram, (uint32_t) &userConfig[0] + addressGap, data[ii]);
  }
  HAL_FLASH_Lock();
}

Эта программа позволила мне сохранять данные во внутренней флэш-памяти, которые сохранялись даже после полной перезагрузки, когда все питание былоотключен, а затем снова подключен к плате.

...