Работаем под Atollic True Studio с STM32F205VG, программатор SWD ST Link V2.
Работаем с внутренней флэш памятью контроллера.
Стирается флэш секторами , а не как нам захочется.
Для начала ознакомимся со структурой FLASH памяти STM32F205VG . В даташите на STM32F205xx структура как-то не описана. Получим другим способом из программы STM32 ST-Link Utitlity:
Обязательно ставим printf (SWO) на HardFault_Handler, т.к. поначалу контроллер не раз буде туда вылетать.
Чтобы заведомо прописать в какой-то сектор какие-то значения мне подходит такой способ :
в файле например main.c :
uint8_t dd[0x100] __attribute__((section(".rodata"))) \
__attribute__((aligned(8)))={0x31,0x31,0x31,0x31,0x31,
0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31};
uint8_t dd2[0x100] __attribute__((section(".mySection"))) \
__attribute__((aligned(8)))={0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,
0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32};
И потом в LD файле компоновщика не забываем указать нужный на регион памяти куда мы хотим прописать все .rodata :
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
FLASH1 (rx): ORIGIN = 0x8000000, LENGTH = 0x0C000
FLASH2 (rx): ORIGIN = 0x800C000, LENGTH = 16K /*0x08010000-0x0000C000*/
FLASH3 (rx): ORIGIN = 0x8010000, LENGTH = 64K /*0x08040000-0x08010000*/
}
...................
.rodata :
{
. = ALIGN(4);
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
} >FLASH2
.mySection :
{
. = ALIGN(4);
KEEP(*(.mySection)) /* Startup code */
. = ALIGN(4);
} >FLASH3
И после прошивки вы увидите , что по адресу флэш 0x0800C000 (sector 3) '1111111' :
и по адресу 0x8010000 (sector 4) у нас так как мы планировали '22222222' :
Теперь можно эксперементировать с очисткой памяти :
Начинаем изучать примеры и выясняется , что большая часть у нас не сработает ,т.к. изменились дефайны.
Под наш контроллер в 2020г. для очистки памяти используем HAL_FLASHEx_Erase :
Первые неудачи
Error finishing flash operation
Также выясняется сразу , что если происходила не корректная попытка стирания памяти , то контроллер где-то это запоминает и при следующем старте можно увидеть например такое сообщение "Error finishing flash operation". В GDB скрипте на строчке 13 команда load , т.е. прошивка в контроллер программы. И получается , что после перезапуска контроллер где-то помнит , что была аварийная операция с флэш памятью.
Избавится от этой проблемы , а точнее от невозможности далее прошить контроллер , только полное стирание флэш контроллера через STM32 ST-Link Utitlity.
А потом опять при очередной попытке стирания сектора.
Как решить проблему : сменить ST-Link V2 на другой программатор, например JLink.
И проблема ушла тут же. А вообще БЫЛА ЛИ ПРОБЛЕМА? Вот так можно убивать часы в поиске черной кошки в темной комнате...