Сектор и страница флеш-памяти
В ОЗУ любой байт можно переписать сколько угодно раз. Во флеш-памяти запись лишь переводит биты из 1 в 0, а вернуть единицы можно только стиранием — и не байта, а целой области. Эту наименьшую стираемую область называют сектором или страницей.
Обновлено Редакция GAW
Сектор (или страница) флеш-памяти — наименьшая область, которую флеш-память стирает одной операцией. Стирание переводит все биты области в 1, и байты читаются как FFh. Программирование умеет только обратное — переводить единицы в нули, поэтому переписать уже записанный байт на месте нельзя: сначала стирают весь сектор, потом пишут заново. Этим флеш-память отличается от ОЗУ и от EEPROM, которая стирает отдельные байты сама.
Как это выглядит у разных микросхем
Названия у производителей разные, поэтому сверяйтесь с даташитом конкретного кристалла:
| Память | Единица программирования | Наименьшее стирание | Источник |
|---|---|---|---|
| STM32F103, medium-density | полуслово 16 бит | страница 1 КБ, 128 страниц | RM0008, табл. 5 |
| STM32F103, high-density | полуслово 16 бит | страница 2 КБ, 256 страниц | RM0008, табл. 6 |
| STM32F405/407 | x8…x64 по PSIZE | секторы 16, 64 и 128 КБ | RM0090, табл. 5 |
| W25Q128JV (SPI NOR) | от 1 до 256 байт в странице | сектор 4 КБ, блоки 32 и 64 КБ | W25Q128JV, разд. 1 |
| W25N01GV (SPI NAND) | страница 2 048 байт | блок 128 КБ | W25N01GV, разд. 1 |
Обратите внимание на STM32F4: первые четыре сектора по 16 КБ, пятый — 64 КБ, остальные — по 128 КБ. Чтобы сохранить пару настроек, ради которых сотрётся 128 КБ, такой кристалл неудобен; под данные обычно отдают один из маленьких секторов в начале или пользуются эмуляцией EEPROM. Номер сектора по адресу и границы секторов разных семейств подскажет калькулятор секторов STM32.
Что следует из стирания по секторам
- Изменение одного байта — это чтение, стирание и перезапись сектора. Содержимое сектора сначала копируют в ОЗУ, меняют нужное, стирают сектор и пишут обратно. Если питание пропадёт между стиранием и записью, данные потеряются; на этом построены схемы с двумя копиями и журналом.
- Стирание медленное. По табл. 28 DS5319 страница 1 КБ у STM32F103 стирается 20–40 мс, а запись полуслова занимает около 52 мкс. У W25Q128JV стирание сектора 4 КБ — 45 мс типично и до 400 мс в худшем случае (разд. 9.6).
- Ресурс считают на сектор. STM32F103 гарантирует 10 000 циклов стирания, W25Q128JV — 100 000 циклов на сектор. Если стирать всё время один и тот же сектор, он исчерпается первым, поэтому нагрузку распределяют — это выравнивание износа.
- Контроллер проверяет стёртость. По PM0075 у STM32F1 запись в нестёртое полуслово пропускается с флагом PGERR; единственное исключение — запись 0x0000, которая всегда проходит.
Где в карте памяти STM32 лежат загрузчик, байты опций и пользовательские секторы, рассказано в статье о флеш-памяти и загрузчике STM32; как работает чтение во время стирания у кристаллов с двумя банками — в термине двухбанковая флеш-память.
Частые вопросы
Почему флеш-память нужно стирать перед записью?
Программирование умеет только переводить биты из 1 в 0, а вернуть единицы может лишь стирание, после которого все биты области равны 1 и байты читаются как FFh. У STM32F103 контроллер флеш-памяти даже проверяет это сам: по PM0075 перед записью полуслова он читает ячейку и, если там не 0xFFFF, пропускает запись и выставляет флаг PGERR.
Чем страница отличается от сектора?
Терминологией производителя, а не физикой. ST называет наименьшую стираемую область STM32F1 страницей (1 или 2 КБ), а у STM32F4 — сектором (16, 64 или 128 КБ). У внешней SPI-флеш Winbond W25Q страница — единица программирования 256 байт, а сектор — единица стирания 4 КБ. Поэтому в каждом даташите смотрите, что именно стирается одной командой.
Сколько времени занимает стирание сектора?
По даташитам: страница 1 КБ у STM32F103 — от 20 до 40 мс, сектор 4 КБ у W25Q128JV — 45 мс типично и до 400 мс в худшем случае, блок 64 КБ — 150 мс и до 2 с. По PM0075 и RM0090, у однобанковых STM32F1 и STM32F4 любое чтение флеш-памяти во время записи или стирания останавливает шину до конца операции, так что программа из флеш в это время не выполняется — длинные стирания планируют заранее. Исключение — двухбанковые кристаллы: у STM32F42x/43x с 1 и 2 МБ и у STM32F1 XL-density можно читать один банк, пока пишется или стирается другой (read-while-write, RM0090 и RM0008).
Источники
- STMicroelectronics. PM0075 STM32F10xxx Flash memory microcontrollers, Programming manual (Doc ID 17863 Rev 2, August 2012) — разд. 2.1: во время записи любое чтение флеш-памяти останавливает шину до конца операции, выборка кода и данных из флеш невозможна; разд. 2.3.3: стандартное программирование полусловами; контроллер FPEC сначала читает ячейку и проверяет, что она стёрта; если нет, запись пропускается и выставляется PGERR (исключение — запись 0x0000); разд. 2.3.4: стирание страницами или целиком (Mass Erase); FLASH_SR, бит PGERR: ячейка перед записью содержала не 0xFFFF
- STMicroelectronics. RM0008 Reference manual STM32F101xx, F102xx, F103xx, F105xx, F107xx, Rev 21 (February 2021) — разд. 3.3.3, табл. 4–8: low-density — 32 страницы по 1 КБ, medium-density — 128 страниц по 1 КБ, high-density — 256 страниц по 2 КБ, connectivity line — 128 страниц по 2 КБ, XL-density — 512 страниц по 2 КБ в двух банках
- STMicroelectronics. RM0090 Reference manual STM32F405/415, F407/417, F427/437, F429/439, Rev 22 — разд. 3.3, табл. 5: основная память 1 МБ — 4 сектора по 16 КБ (0x0800 0000–0x0800 FFFF), 1 сектор 64 КБ, 7 секторов по 128 КБ; разд. 3.6.2, табл. 13: стирание только сектором, банком или целиком, время стирания зависит от PSIZE; PSIZE x32 при 2,7–3,6 В, x64 с внешним VPP, x16 при 2,1–2,7 В, x8 при 1,8–2,1 В; разд. 3.6 (Rev 21, с. 84): чтение флеш во время записи или стирания останавливает шину, выборка кода невозможна, содержимое не гарантировано при сбросе во время операции
- STMicroelectronics. DS5319 STM32F103x8, STM32F103xB datasheet, Rev 20 (July 2025) — табл. 28: программирование полуслова 40 / 52,5 / 70 мкс (мин. / тип. / макс.), стирание страницы 1 КБ 20–40 мс; табл. 29: ресурс NEND не меньше 10 000 циклов
- Winbond. W25Q128JV 3V 128M-bit Serial Flash Memory with Dual/Quad SPI, Revision F, March 27, 2018 — разд. 1: 65 536 страниц по 256 байт, программирование от 1 до 256 байт, стирание группами по 16 страниц (сектор 4 КБ), 128 (блок 32 КБ), 256 (блок 64 КБ) или целиком; 4 096 секторов и 256 блоков; разд. 8.2.13: Page Program пишет только в стёртые (FFh) ячейки; разд. 9.6: tSE 45 / 400 мс, tBE1 120 / 1 600 мс, tBE2 150 / 2 000 мс, tCE 40 / 200 с (тип. / макс.)
Нашли ошибку?
Смотрите также
- Карта флеш-памяти STM32Секторы и страницы, адрес → сектор, что стирать, CubeProgrammer и HAL
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- NAND-флеш-памятьСтраницы и блоки NAND, плохие блоки, ECC и чем NAND отличается от NOR
- Выравнивание износаКак распределяют стирания по секторам флеш: ESP-IDF, littlefs, NAND
- Двухбанковая флеш-память (dual bank)Флеш-память из двух банков: чтение во время записи и обмен банков
- EEPROMЭнергонезависимая память для настроек и калибровки