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

Есть ли у STM32F103 EEPROM?

Обновлено Редакция GAW

В STM32F103 нет отдельной памяти данных EEPROM, как у ATmega328P: в составе только флеш-память программ 64 или 128 КБ и ОЗУ 20 КБ. Настройки, которые должны пережить выключение, хранят одним из трёх способов.

СпособОбъёмРесурс записиКогда подходит
Страница флеш-памяти1 КБ на страницу10 000 стиранийнастройки, калибровки
Резервные регистры20 байтэто регистры, а не флеш-памятьсчётчики, флаги; нужна батарейка на VBAT
Внешняя EEPROM по I2C32 КБ у 24LC256по даташиту микросхемычастая запись, большие журналы

Флеш-память вместо EEPROM

У STM32F103 средней плотности флеш-память разбита на страницы по 1 КБ — у версии со 128 КБ их 128. Писать можно 16-битными словами, а стирать — только страницу целиком, за 20–40 мс. Всё это время процессор не может читать флеш-память: по руководству PM0075 шина останавливается, поэтому код из флеш и прерывания ждут конца стирания. Обычно под данные отдают последнюю страницу и следят, чтобы программа её не занимала. Адреса и номера страниц для каждого семейства покажет калькулятор секторов флеш-памяти STM32.

Чтобы не стирать страницу при каждом изменении, данные дописывают в неё записями «номер параметра + значение», а при чтении берут последнюю запись с нужным номером. Если запись занимает 4 байта, в странице 1 КБ их помещается

10244=256,\frac{1024}{4} = 256,

и одно стирание приходится на 256 изменений. Если питание пропадёт во время стирания, страница окажется испорченной, поэтому в ST AN2594 данные хранят на двух страницах: у каждой в заголовке записано состояние — стёрта, принимает данные или действительна, — и после включения программа берёт действительную. Так устроены библиотеки эмуляции EEPROM на флеш-памяти.

Если нужна настоящая EEPROM

У других семейств она есть: например, у STM32L0 рядом с флеш-памятью стоит отдельная data EEPROM. Для STM32F103 остаются внешняя микросхема — например, EEPROM 24LC256 с шиной I²C — или аккуратная работа с флеш-памятью, которую описывает статья «Flash и загрузчик STM32».

Похожие вопросы

Почему нельзя просто перезаписать одну ячейку флеш-памяти?

Флеш-память STM32F1 пишется 16-битными словами, а стирается только целыми страницами по 1 КБ. Чтобы изменить уже записанное значение, страницу приходится стирать целиком, а это 20–40 мс и один цикл из ресурса 10 000.

Сколько данных можно хранить в резервных регистрах?

У STM32F103x8 и STM32F103xB десять 16-битных резервных регистров — 20 байт. Они сохраняются, пока есть питание на VDD или батарейка на VBAT, и подходят для пары счётчиков или флагов, но не для больших настроек.

Сколько страниц флеш-памяти у STM32F103C8?

У STM32F103C8 64 КБ флеш-памяти средней плотности, то есть 64 страницы по 1 КБ; у STM32F103CB со 128 КБ — 128 страниц. Под данные обычно отдают последнюю страницу.

Источники

  1. STMicroelectronics. DS5319 Rev 20. STM32F103x8, STM32F103xB datasheet — память: 64 или 128 КБ флеш и 20 КБ SRAM, EEPROM в составе нет; табл. 28 — стирание страницы 1 КБ 20–40 мс, запись 16-битного слова 40–70 мкс; табл. 29 — ресурс не менее 10 тыс. циклов; 2.3.14 — десять 16-битных резервных регистров, 20 байт данных пользователя, сохраняются при питании от VBAT
  2. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — 3.3.3 — флеш-память программируется по 16 бит; у medium-density устройств основная память — 128 страниц по 1 КБ, у high-density — страницы по 2 КБ
  3. STMicroelectronics. PM0075 (Doc ID 17863 Rev 2). STM32F10xxx Flash memory microcontrollers, programming manual — раздел Overview — попытка читать флеш-память во время записи или стирания останавливает шину: выборка кода и данных из флеш невозможна, пока операция не закончится; запись выполняется только в стёртое слово, иначе она пропускается с флагом PGERR
  4. STMicroelectronics. AN2594 (Doc ID 13718 Rev 3). EEPROM emulation in STM32F10x microcontrollers — 1.2 — запись во флеш прерывается сбросом процессора и пропаданием питания; 2.1 — эмуляция на двух страницах одного размера, состояние страницы в заголовке: ERASED, RECEIVE_DATA, VALID_PAGE; переменная — 16-битный адрес и 16-битное значение, 256 записей на странице 1 КБ; EE_Init восстанавливает данные, если питание пропало во время обновления, стирания или переноса страницы

Нашли ошибку?