программируем внутреннюю Flash контроллера

Работаем под Atollic True Studio с STM32F205VG, программатор SWD ST Link V2.

Работаем с внутренней флэш памятью контроллера.

Стирается флэш секторами , а не как нам захочется.

Для начала ознакомимся со структурой FLASH памяти STM32F205VG . В даташите на STM32F205xx структура как-то не описана. Получим другим способом из программы STM32 ST-Link Utitlity:

фотка 1

Обязательно ставим 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' :

фотка 2

и по адресу 0x8010000 (sector 4) у нас так как мы планировали '22222222' :

фотка 3

Теперь можно эксперементировать с очисткой памяти :

Начинаем изучать примеры и выясняется , что большая часть у нас не сработает ,т.к. изменились дефайны.

Под наш контроллер в 2020г. для очистки памяти используем HAL_FLASHEx_Erase :

Первые неудачи

Error finishing flash operation

Также выясняется сразу , что если происходила не корректная попытка стирания памяти , то контроллер где-то это запоминает и при следующем старте можно увидеть например такое сообщение "Error finishing flash operation". В GDB скрипте на строчке 13 команда load , т.е. прошивка в контроллер программы. И получается , что после перезапуска контроллер где-то помнит , что была аварийная операция с флэш памятью.

фотка 4

Избавится от этой проблемы , а точнее от невозможности далее прошить контроллер , только полное стирание флэш контроллера через STM32 ST-Link Utitlity.
А потом опять при очередной попытке стирания сектора.

Как решить проблему : сменить ST-Link V2 на другой программатор, например JLink.

И проблема ушла тут же. А вообще БЫЛА ЛИ ПРОБЛЕМА? Вот так можно убивать часы в поиске черной кошки в темной комнате...