Флеш-память 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 F000 | 0x1FFF F800, 16 байт |
| STM32F101/F103, 256–512 КБ | 2 КБ | до 256 страниц | 2 КБ, 0x1FFF F000 | 0x1FFF F800 |
| STM32F101/F103, 768 КБ–1 МБ (XL) | 2 КБ | банк 1 — страницы 0–255, банк 2 с 0x0808 0000 — 256–511 | 6 КБ, 0x1FFF E000 | 0x1FFF F800 |
| STM32F105/F107 | 2 КБ | до 128 страниц | 18 КБ, 0x1FFF B000 | 0x1FFF F800 |
| STM32F030x4/x6/x8, F031, F051 | 1 КБ | до 64 страниц | 3 КБ, 0x1FFF EC00 | 0x1FFF F800 |
| STM32F042, F070x6 | 1 КБ | до 32 страниц | 13 КБ, 0x1FFF C400 | 0x1FFF F800 |
| STM32F07x (кроме F070x6) | 2 КБ | до 64 страниц | 12 КБ, 0x1FFF C800 | 0x1FFF F800 |
| STM32F09x, F030xC | 2 КБ | до 128 страниц | 8 КБ, 0x1FFF D800 | 0x1FFF F800 |
По RM0008 (таблицы 4–8), RM0091 и RM0360 (таблицы 4 и 5). Пишут эти микроконтроллеры только полусловами — по 16 бит. В HAL у них нет номера страницы: в структуре стирания задают адрес первой страницы PageAddress и число страниц NbPages.
STM32F4 и STM32F7: секторы разного размера
| Линейка | Секторы | Системная память | OTP | Байты конфигурации |
|---|---|---|---|---|
| STM32F401, F411, F405/407 | 0–3 по 16 КБ, 4 — 64 КБ, дальше по 128 КБ: до 11 у 1 МБ | 30 КБ, 0x1FFF 0000 | 0x1FFF 7800, 512 + 16 байт | 0x1FFF C000, 16 байт |
| STM32F42x/43x, 2 МБ | банк 1 — 0–11, банк 2 с 0x0810 0000 — 12–23 | 30 КБ, 0x1FFF 0000 | 0x1FFF 7800 | 0x1FFF C000 и 0x1FFE C000 |
| STM32F42x/43x, 1 МБ, DB1M = 1 | банк 1 — 0–7, банк 2 с 0x0808 0000 — 12–19 | 30 КБ | 0x1FFF 7800 | оба банка |
| STM32F74x/75x | 0–3 по 32 КБ, 4 — 128 КБ, 5–7 по 256 КБ | 60 КБ, 0x1FF0 0000 | 0x1FF0 F000 | 0x1FFF 0000, 32 байта |
| STM32F76x/77x, nDBANK = 1 | 0–3 по 32 КБ, 4 — 128 КБ, 5–11 по 256 КБ | 60 КБ, 0x1FF0 0000 | 0x1FF0 F000 | 0x1FFF 0000 |
| STM32F76x/77x, nDBANK = 0 | в каждом банке 16, 16, 16, 16, 64 и по 128 КБ; банк 2 — секторы с 12 | 60 КБ | 0x1FF0 F000 | 0x1FFF 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–G070 | 2 КБ | один | 8 КБ, 0x1FFF 0000 | 0x1FFF 7800 |
| STM32G0B1/G0C1, 512 КБ | 2 КБ | два по 256 КБ, банк 2 с 0x0804 0000 | 28 КБ, 0x1FFF 0000 | 0x1FFF 7800, 128 байт |
| STM32G0B1/G0C1, 256 КБ | 2 КБ | два (DUAL_BANK = 1, с завода) или один | 28 КБ | 0x1FFF 7800 |
| STM32G0B1/G0C1, 128 КБ | 2 КБ | один | 28 КБ | 0x1FFF 7800 |
| STM32G431/G441 | 2 КБ | один | 28 КБ, 0x1FFF 0000 | 0x1FFF 7800, 48 байт |
| STM32G47x/48x | 2 КБ (DBANK = 1) или 4 КБ (DBANK = 0) | два при DBANK = 1 (с завода), банк 2 всегда с 0x0804 0000; один при DBANK = 0 | 28 КБ, 0x1FFF 0000 и 0x1FFF 8000 | 0x1FFF 7800 и 0x1FFF F800 |
| STM32G491/G4A1 | 2 КБ | один | 28 КБ | 0x1FFF 7800 |
| STM32L41x–L46x | 2 КБ | один | 28 КБ, 0x1FFF 0000 | 0x1FFF 7800 |
| STM32L47x–L4Ax | 2 КБ | два (у 256 и 512 КБ — при DUALBANK = 1, с завода), страницы банка 2 — с 256 | 28 КБ в каждом банке | 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.
Источники
- 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, системная память и байты конфигурации; запись полусловами
- STMicroelectronics. RM0091 Rev 10 (STM32F0x1/x2/x8) и RM0360 Rev 5 (STM32F030/F070) — раздел 3.2.1, таблицы 4 и 5 — страницы 1 и 2 КБ, системная память 3, 8, 12 и 13 КБ; запись полусловами
- 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
- STMicroelectronics. RM0368 Rev 6 (STM32F401) и RM0383 (STM32F411) — RM0368, таблица 5; RM0383, таблица 4 — до 8 секторов, системная память, OTP, байты конфигурации
- STMicroelectronics. RM0385 Rev 9 (STM32F74x/75x) и RM0410 Rev 5 (STM32F76x/77x) — RM0385, таблицы 3 и 4; RM0410, таблицы 3–6 — секторы 32, 128, 256 КБ и двухбанковый режим nDBANK = 0
- STMicroelectronics. RM0444 Rev 6 (STM32G0x1) и RM0454 Rev 5 (STM32G0x0) — RM0444, таблицы 9–12 — страницы 2 КБ, банки STM32G0B1/G0C1, бит DUAL_BANK, FLASH_CR: BKER и PNB; RM0454, таблицы 8 и 9; запись двойными словами
- STMicroelectronics. RM0440 Rev 9. Reference manual: STM32G4 Series — таблица 1 — категории; таблицы 7, 8, 18, 28 — страницы 2 и 4 КБ, бит DBANK, второй банк с 0x0804 0000
- STMicroelectronics. RM0394 Rev 5 (STM32L41x–L46x) и RM0351 Rev 11 (STM32L47x–L4Ax) — RM0394, таблица 8; RM0351, таблицы 8–10 и бит DUALBANK — страницы второго банка нумеруются с 256
- STMicroelectronics. RM0433 Rev 9. Reference manual: STM32H742, STM32H743/753 and STM32H750 — таблицы 14 и 15 — по 8 секторов 128 КБ в банке; карта памяти — границы банков у исполнений 1 МБ; запись флеш-словами по 256 бит
- STMicroelectronics. UM2237 Rev 29. STM32CubeProgrammer software description — 3.2.2 — ключ -e: all, номера секторов, диапазон [start end]
- 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>Обновлено .
Нашли ошибку в расчёте?