Перейти к содержанию

Карта секторов и страниц флеш-памяти STM32

Введите название микроконтроллера или выберите линейку и объём — калькулятор покажет секторы или страницы основной памяти с адресами, системную память, OTP и байты конфигурации, найдёт сектор по адресу и скажет, что стереть под прошивку заданного размера, не задев загрузчик.

Исходные данные

STM32F407VG: STM32F405, F407, F415, F417, 1 МБ

RM0090 Rev 22, табл. 5

Шестнадцатеричный; без 0x — тоже hex

Шестнадцатеричный, после загрузчика: 0x08008000

КБ

Результат

Стереть
секторы 2–6
5 секторов, 352 КБ: 0x0800 8000–0x0805 FFFF; образ 0x0800 8000–0x0805 2FFF
Адрес 0x0806 0000
Сектор 7: 0x0806 0000–0x0807 FFFF, смещение 0x0
Основная память
0x0800 0000–0x080F FFFF12 секторов
Единица записи
байт, полуслово, слово или двойное слово — по PSIZE: ×32 при 2,7–3,6 В, ×16 при 2,1–2,7 В, ×8 ниже 2,1 В, ×64 с внешним VPP

Секторы основной памяти

№НачалоКонецРазмер
00x0800 00000x0800 3FFF16 КБ
10x0800 40000x0800 7FFF16 КБ
20x0800 80000x0800 BFFF16 КБ
30x0800 C0000x0800 FFFF16 КБ
40x0801 00000x0801 FFFF64 КБ
50x0802 00000x0803 FFFF128 КБ
60x0804 00000x0805 FFFF128 КБ
70x0806 00000x0807 FFFF128 КБ
80x0808 00000x0809 FFFF128 КБ
90x080A 00000x080B FFFF128 КБ
100x080C 00000x080D FFFF128 КБ
110x080E 00000x080F FFFF128 КБ

Системная память, OTP, байты конфигурации

Системная память (загрузчик ST)0x1FFF 0000–0x1FFF 77FF30 КБ
OTP0x1FFF 7800–0x1FFF 7A0F528 байт; 512 байт данных и 16 байт блокировки
Байты конфигурации (option bytes)0x1FFF C000–0x1FFF C00F16 байт

STM32CubeProgrammer CLI

STM32_Programmer_CLI -c port=SWD -e [2 6]

В zsh на macOS диапазон в квадратных скобках не работает (UM2237, с. 110): запустите команду в bash или перечислите номера через пробел.

HAL: HAL_FLASHEx_Erase()

FLASH_EraseInitTypeDef erase = {0};
uint32_t bad = 0; /* first block that failed, 0xFFFFFFFF if none */

HAL_FLASH_Unlock();
erase.TypeErase    = FLASH_TYPEERASE_SECTORS;
erase.Sector       = FLASH_SECTOR_2;
erase.NbSectors    = 5U;
erase.VoltageRange = FLASH_VOLTAGE_RANGE_3; /* 2.7-3.6 V: PSIZE x32 */
if (HAL_FLASHEx_Erase(&erase, &bad) != HAL_OK) { /* bad = failed block */ }
HAL_FLASH_Lock();

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

Флеш-память STM32 стирается не байтами, а секторами (STM32F4, F7, H7) или страницами (STM32F0, F1, G0, G4, L4), и у каждого семейства свои размеры и нумерация. Чтобы записать прошивку после своего загрузчика, сохранить настройки в последнем секторе или стереть память из программы, нужно знать, с какого адреса начинается каждый сектор и как он называется в HAL и в STM32CubeProgrammer. Калькулятор строит эту карту по таблицам справочных руководств ST.

Коротко

  • Основная память всех линеек здесь начинается с 0x0800 0000; стирается целыми секторами или страницами.
  • STM32F1, F0: страницы 1 КБ (до 128 КБ у F1, до 64 КБ у F03x–F05x) или 2 КБ; запись полусловами.
  • STM32F4: секторы 16, 16, 16, 16, 64 и дальше по 128 КБ; у F7 — 32, 128 и 256 КБ.
  • STM32G0, G4, L4: страницы 2 КБ (у G47x/48x при DBANK = 0 — 4 КБ), запись двойными словами.
  • STM32H743: по 8 секторов 128 КБ в каждом из двух банков, запись словами по 256 бит.
  • Двухбанковая память (с завода у G0B1 на 256 КБ, G47x/48x, L47x) нумеруется по-разному: у L4 страницы второго банка — с 256, у F42x — секторы с 12, у G0B1, G4 и H7 нумерация в банке начинается заново.

Как устроена флеш-память STM32

Основная память — это программа и константы; рядом с ней в отдельном информационном блоке лежат системная память с загрузчиком ST, однократно программируемая область OTP (не у всех) и байты конфигурации. Калькулятор показывает обе части, а таблицы ниже — их общий вид по семействам.

STM32F0 и STM32F1: страницы

ЛинейкаСтраницаОсновная памятьСистемная памятьБайты конфигурации
STM32F101/F102/F103 до 128 КБ1 КБ16–128 страниц2 КБ, 0x1FFF F0000x1FFF F800, 16 байт
STM32F101/F103, 256–512 КБ2 КБдо 256 страниц2 КБ, 0x1FFF F0000x1FFF F800
STM32F101/F103, 768 КБ–1 МБ (XL)2 КБбанк 1 — страницы 0–255, банк 2 с 0x0808 0000 — 256–5116 КБ, 0x1FFF E0000x1FFF F800
STM32F105/F1072 КБдо 128 страниц18 КБ, 0x1FFF B0000x1FFF F800
STM32F030x4/x6/x8, F031, F0511 КБдо 64 страниц3 КБ, 0x1FFF EC000x1FFF F800
STM32F042, F070x61 КБдо 32 страниц13 КБ, 0x1FFF C4000x1FFF F800
STM32F07x (кроме F070x6)2 КБдо 64 страниц12 КБ, 0x1FFF C8000x1FFF F800
STM32F09x, F030xC2 КБдо 128 страниц8 КБ, 0x1FFF D8000x1FFF F800

По RM0008 (таблицы 4–8), RM0091 и RM0360 (таблицы 4 и 5). Пишут эти микроконтроллеры только полусловами — по 16 бит. В HAL у них нет номера страницы: в структуре стирания задают адрес первой страницы PageAddress и число страниц NbPages.

STM32F4 и STM32F7: секторы разного размера

ЛинейкаСекторыСистемная памятьOTPБайты конфигурации
STM32F401, F411, F405/4070–3 по 16 КБ, 4 — 64 КБ, дальше по 128 КБ: до 11 у 1 МБ30 КБ, 0x1FFF 00000x1FFF 7800, 512 + 16 байт0x1FFF C000, 16 байт
STM32F42x/43x, 2 МБбанк 1 — 0–11, банк 2 с 0x0810 0000 — 12–2330 КБ, 0x1FFF 00000x1FFF 78000x1FFF C000 и 0x1FFE C000
STM32F42x/43x, 1 МБ, DB1M = 1банк 1 — 0–7, банк 2 с 0x0808 0000 — 12–1930 КБ0x1FFF 7800оба банка
STM32F74x/75x0–3 по 32 КБ, 4 — 128 КБ, 5–7 по 256 КБ60 КБ, 0x1FF0 00000x1FF0 F0000x1FFF 0000, 32 байта
STM32F76x/77x, nDBANK = 10–3 по 32 КБ, 4 — 128 КБ, 5–11 по 256 КБ60 КБ, 0x1FF0 00000x1FF0 F0000x1FFF 0000
STM32F76x/77x, nDBANK = 0в каждом банке 16, 16, 16, 16, 64 и по 128 КБ; банк 2 — секторы с 1260 КБ0x1FF0 F0000x1FFF 0000

По RM0090 (таблицы 5–9), RM0368 (таблица 5), RM0383 (таблица 4), RM0385 (таблицы 3, 4) и RM0410 (таблицы 3–6). Разрядность записи у F4 и F7 задаёт поле PSIZE, и она ограничена питанием: 32 бита при 2,7–3,6 В, 16 бит при 2,1–2,7 В, 8 бит ниже 2,1 В, 64 бита — только с внешним напряжением VPP (RM0090, таблица 13). В HAL это поле VoltageRange: FLASH_VOLTAGE_RANGE_3 для обычного питания 3,3 В. У STM32F42x на 1 МБ по умолчанию DB1M = 0 — один банк (RM0090, таблица 7). Заводское значение nDBANK у STM32F76x в прочитанных разделах RM0410 не указано, поэтому калькулятор открывает однобанковую раскладку с пометкой: проверьте регистр FLASH_OPTCR1 своего кристалла.

STM32G0, G4 и L4: страницы и два банка

ЛинейкаСтраницаБанкиСистемная памятьБайты конфигурации
STM32G031–G081, G030–G0702 КБодин8 КБ, 0x1FFF 00000x1FFF 7800
STM32G0B1/G0C1, 512 КБ2 КБдва по 256 КБ, банк 2 с 0x0804 000028 КБ, 0x1FFF 00000x1FFF 7800, 128 байт
STM32G0B1/G0C1, 256 КБ2 КБдва (DUAL_BANK = 1, с завода) или один28 КБ0x1FFF 7800
STM32G0B1/G0C1, 128 КБ2 КБодин28 КБ0x1FFF 7800
STM32G431/G4412 КБодин28 КБ, 0x1FFF 00000x1FFF 7800, 48 байт
STM32G47x/48x2 КБ (DBANK = 1) или 4 КБ (DBANK = 0)два при DBANK = 1 (с завода), банк 2 всегда с 0x0804 0000; один при DBANK = 028 КБ, 0x1FFF 0000 и 0x1FFF 80000x1FFF 7800 и 0x1FFF F800
STM32G491/G4A12 КБодин28 КБ0x1FFF 7800
STM32L41x–L46x2 КБодин28 КБ, 0x1FFF 00000x1FFF 7800
STM32L47x–L4Ax2 КБдва (у 256 и 512 КБ — при DUALBANK = 1, с завода), страницы банка 2 — с 25628 КБ в каждом банке0x1FFF 7800–7827 и 0x1FFF F800–F827

По RM0444 (таблицы 9–12), RM0454 (таблицы 8, 9), RM0440 (таблицы 7, 8, 18, 28), RM0394 (таблица 8) и RM0351 (таблицы 8–10). У всех OTP — 1 КБ с 0x1FFF 7000. Байты конфигурации L47x занимают 40 байт в каждом банке по таблице 13 RM0351, хотя таблица 8 того же руководства пишет 16 байт. Заводские значения битов DBANK, DUALBANK и DUAL_BANK — «два банка» (RM0440, с. 111; RM0351, с. 112; RM0444, таблица 17), и калькулятор по умолчанию показывает именно эту раскладку. Пишут они только двойными словами — 64 бита данных и 8 бит кода коррекции ошибок; попытка записать байт или полуслово выставляет ошибку SIZERR. В HAL страницу задают номером внутри банка (Page) и банком (Banks).

STM32H743: два банка по 1 МБ

У STM32H742/H743/H753 два банка по 8 секторов 128 КБ: банк 1 с 0x0800 0000, банк 2 с 0x0810 0000, секторы в каждом нумеруются с 0 (RM0433, таблица 15). У исполнений на 1 МБ в каждом банке по 4 сектора, и банк 2 всё равно начинается с 0x0810 0000 — между банками остаётся промежуток. Записывают флеш-словами по 256 бит (32 байта) с адреса, кратного 32. Системная память — по 128 КБ в каждом банке с 0x1FF0 0000 и 0x1FF4 0000, а байты конфигурации доступны только через регистры. У STM32H750 один сектор 128 КБ.

Пример: STM32F407VG, загрузчик и приложение 300 КБ

У STM32F407VG 1 МБ флеш-памяти. Загрузчик на 32 КБ занимает секторы 0 и 1 (0x0800 0000–0x0800 7FFF), приложение собрано с адреса 0x0800 8000 и весит 300 КБ = 307 200 байт, то есть кончается на 0x0805 2FFF. Чтобы его обновить, нужно стереть секторы 2, 3, 4, 5 и 6 — это 16 + 16 + 64 + 128 + 128 = 352 КБ; в секторе 6 остаются свободными 52 КБ с 0x0805 3000. Загрузчик не пострадает, потому что приложение начинается точно на границе сектора 2.

FLASH_EraseInitTypeDef erase = {0};
uint32_t bad = 0;
HAL_FLASH_Unlock();
erase.TypeErase    = FLASH_TYPEERASE_SECTORS;
erase.Sector       = FLASH_SECTOR_2;
erase.NbSectors    = 5U;
erase.VoltageRange = FLASH_VOLTAGE_RANGE_3; /* 2.7-3.6 V: x32 */
HAL_FLASHEx_Erase(&erase, &bad);
HAL_FLASH_Lock();

Из командной строки то же самое делает STM32_Programmer_CLI -c port=SWD -e [2 6]; в zsh на macOS диапазон в скобках не срабатывает (UM2237, с. 110), там запускайте команду из bash или пишите -e 2 3 4 5 6. Адрес 0x0800 8000 должен совпадать с ORIGIN области FLASH в скрипте компоновщика приложения и со смещением таблицы векторов, которое загрузчик записывает в VTOR перед переходом.

Ещё два примера, которые удобно проверить в калькуляторе. У STM32F103C8 (64 КБ, страницы по 1 КБ) адрес 0x0800 F800 — начало страницы 62; последняя страница, 63, начинается с 0x0800 FC00 — её часто отводят под настройки. У STM32G0B1RE (512 КБ) адрес 0x0804 0000 — страница 0 второго банка: в HAL это Banks = FLASH_BANK_2, Page = 0. Стирание у G0 всегда относится к физическому банку, даже если банки переставлены битом nSWAP_BANK (RM0444, раздел 3.3.2).

Типичные ошибки

Стёрт сектор загрузчика. Загрузчик на 8 КБ у STM32F4 всё равно занимает весь сектор 0 размером 16 КБ, и приложение нельзя класть на 0x0800 2000: стирание сектора 0 под приложение уничтожит загрузчик. Калькулятор предупреждает, если начало прошивки не совпадает с началом сектора или страницы.

Секторы STM32F4 считают одинаковыми. «Последний сектор под настройки» у STM32F407 — это 128 КБ, и его стирание длится секунды; маленькие секторы 1–3 по 16 КБ удобнее, если сдвинуть приложение. У STM32F7 первые секторы уже по 32 КБ, а в двухбанковом режиме размеры и номера меняются.

Не тот банк. У STM32F42x на 1 МБ с DB1M = 1 второй банк — это секторы 12–19, а не 8–11. У STM32L476 страница 256 — это в HAL страница 0 с FLASH_BANK_2. У STM32G474 на 256 КБ в двухбанковом режиме второй банк начинается с 0x0804 0000, а адреса 0x0802 0000–0x0803 FFFF пусты; у H743 на 1 МБ такая же дыра между 0x0808 0000 и 0x080F FFFF. Образ, который проходит через промежуток, записать одним куском нельзя.

Запись меньше единицы записи. STM32G0, G4 и L4 не запишут байт или полуслово; H7 копит данные до 32-байтного слова. Структуры, которые сохраняются во флеш-память, выравнивают и дополняют до 8 или 32 байт.

Карту адресов удобно сверить с файлом прошивки: калькулятор HEX-дампа показывает, какие адреса занимает образ в формате Intel HEX, а статья о форматах прошивки объясняет, чем HEX отличается от BIN. Такты ожидания флеш-памяти при высокой частоте считает калькулятор LATENCY, а запись из программы, байты конфигурации и защита RDP разобраны на странице о флеш-памяти и загрузчике STM32.

Частые вопросы

Какой размер сектора у STM32F407?

Разный: секторы 0–3 по 16 КБ (с 0x0800 0000 до 0x0800 FFFF), сектор 4 — 64 КБ, секторы 5–11 — по 128 КБ (RM0090, таблица 5). У исполнений на 512 КБ секторов восемь, 0–7.

Какой размер страницы у STM32F103C8?

1 КБ: у STM32F103 с флеш-памятью до 128 КБ страницы по 1 КБ, у high-density (256–512 КБ) и XL-density — по 2 КБ (RM0008, таблицы 4–8). Адрес 0x0800 F800 — страница 62 из 64.

Можно ли стереть часть сектора?

Нет. Стирается только целый сектор или страница (или вся память), а записывать можно лишь единицей записи: полусловом у STM32F0/F1, двойным словом у G0, G4, L4, флеш-словом 32 байта у H7. Поэтому прошивку размещают с начала сектора, а не сразу за последним байтом загрузчика.

Как стереть секторы из командной строки?

STM32CubeProgrammer: ключ -e с номерами секторов или диапазоном, например STM32_Programmer_CLI -c port=SWD -e [2 6] (UM2237, раздел 3.2.2). Ключ -e all стирает всю память.

Где лежит загрузчик ST?

В системной памяти: у STM32F1 — 2 КБ с 0x1FFF F000, у STM32F4 — 30 КБ с 0x1FFF 0000, у G0, G4, L4 — с 0x1FFF 0000, у F7 и H7 — с 0x1FF0 0000. Стереть её программой нельзя. Как туда попасть выводом BOOT0, рассказано на странице о флеш-памяти и загрузчике STM32.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — 2.3 — плотности low/medium/high/XL; 3.3.3, таблицы 4–8 — страницы 1 и 2 КБ, второй банк XL-density, системная память и байты конфигурации; запись полусловами
  2. STMicroelectronics. RM0091 Rev 10 (STM32F0x1/x2/x8) и RM0360 Rev 5 (STM32F030/F070) — раздел 3.2.1, таблицы 4 и 5 — страницы 1 и 2 КБ, системная память 3, 8, 12 и 13 КБ; запись полусловами
  3. STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — таблицы 5–9 — секторы 16, 64 и 128 КБ, два банка STM32F42x/43x и бит DB1M; таблица 13 — PSIZE; регистр FLASH_CR — поле SNB
  4. STMicroelectronics. RM0368 Rev 6 (STM32F401) и RM0383 (STM32F411) — RM0368, таблица 5; RM0383, таблица 4 — до 8 секторов, системная память, OTP, байты конфигурации
  5. STMicroelectronics. RM0385 Rev 9 (STM32F74x/75x) и RM0410 Rev 5 (STM32F76x/77x) — RM0385, таблицы 3 и 4; RM0410, таблицы 3–6 — секторы 32, 128, 256 КБ и двухбанковый режим nDBANK = 0
  6. STMicroelectronics. RM0444 Rev 6 (STM32G0x1) и RM0454 Rev 5 (STM32G0x0) — RM0444, таблицы 9–12 — страницы 2 КБ, банки STM32G0B1/G0C1, бит DUAL_BANK, FLASH_CR: BKER и PNB; RM0454, таблицы 8 и 9; запись двойными словами
  7. STMicroelectronics. RM0440 Rev 9. Reference manual: STM32G4 Series — таблица 1 — категории; таблицы 7, 8, 18, 28 — страницы 2 и 4 КБ, бит DBANK, второй банк с 0x0804 0000
  8. STMicroelectronics. RM0394 Rev 5 (STM32L41x–L46x) и RM0351 Rev 11 (STM32L47x–L4Ax) — RM0394, таблица 8; RM0351, таблицы 8–10 и бит DUALBANK — страницы второго банка нумеруются с 256
  9. STMicroelectronics. RM0433 Rev 9. Reference manual: STM32H742, STM32H743/753 and STM32H750 — таблицы 14 и 15 — по 8 секторов 128 КБ в банке; карта памяти — границы банков у исполнений 1 МБ; запись флеш-словами по 256 бит
  10. STMicroelectronics. UM2237 Rev 29. STM32CubeProgrammer software description — 3.2.2 — ключ -e: all, номера секторов, диапазон [start end]
  11. STMicroelectronics. CMSIS Device и HAL для STM32F0, F1, F4, F7, G0, G4, L4, H7 (GitHub) — второй источник для тестов: FLASH_PAGE_SIZE, FLASH_SECTOR_TOTAL, FLASH_END, FLASH_BANK2_BASE, FLASH_OTP_BASE, OB_BASE; поля FLASH_EraseInitTypeDef
Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/stm32-flash-sectors/" title="Карта секторов и страниц флеш-памяти STM32" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/stm32-flash-sectors/">Карта секторов и страниц флеш-памяти STM32</a> — GAW.ru</p>
Автоподстройка высоты рамки

Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.

<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>

Обновлено .

Нашли ошибку в расчёте?