Мне удалось получить решение с помощью Камила Цука , который помог мне решить некоторые проблемы.Одна из проблем, с которыми я столкнулся при работе с 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();
}
Эта программа позволила мне сохранять данные во внутренней флэш-памяти, которые сохранялись даже после полной перезагрузки, когда все питание былоотключен, а затем снова подключен к плате.