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

Как записать байт в data EEPROM STM32L0?

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

У STM32L0 рядом с флеш-памятью программ есть отдельная data EEPROM — её можно писать по байту, без стирания страниц, как обычную EEPROM. Этим STM32L0 отличается от STM32F103, где энергонезависимые настройки приходится хранить во флеш-памяти программ (ответ «Есть ли у STM32F103 EEPROM»).

Где она лежит

Категория STM32L0Объём data EEPROMАдреса
1 (L011, L021)512 байт0x0808 0000 – 0x0808 01FF
2 (L031, L041)1 КБ0x0808 0000 – 0x0808 03FF
3 (L051)2 КБ0x0808 0000 – 0x0808 07FF
5 (L071, L081)до 6 КБ, два банка0x0808 0000 – 0x0808 17FF

Последовательность записи

// Write one byte to data EEPROM (RM0377, 3.3.4)
static void eeprom_write_u8(uint32_t offset, uint8_t value)
{
    if (FLASH->PECR & FLASH_PECR_PELOCK) {
        FLASH->PEKEYR = 0x89ABCDEFU;   // PEKEY1
        FLASH->PEKEYR = 0x02030405U;   // PEKEY2
    }
    *(volatile uint8_t *)(DATA_EEPROM_BASE + offset) = value;
    while (FLASH->SR & FLASH_SR_BSY) { }   // 3.2 or 6.4 ms
    FLASH->PECR |= FLASH_PECR_PELOCK;      // lock again
}

Ключи записывают строго подряд: между ними нельзя обращаться к другим регистрам интерфейса памяти, иначе по RM0377 возникнет HardFault. Проверка PELOCK перед записью ключей защищает от повторной разблокировки.

Время и ресурс

Одна запись занимает 3,2 мс, а если нужно стирание — 6,4 мс. На это время обращения к памяти тормозятся, поэтому большие блоки пишут вне критичных по времени участков. Ресурс расходуется пословно, и это стоит учитывать в счётчиках, которые обновляются часто: общие правила для флеш-памяти и EEPROM собраны в ответе «Сколько раз можно перезаписать флеш-память микроконтроллера». Объёмы по линейкам — на странице STM32L0.

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

Почему разблокировка вызвала HardFault?

По RM0377 HardFault и блокировка FLASH_PECR до сброса возникают при неверном первом или втором ключе, при попытке записать в PEKEYR третье значение и при записи в другой регистр интерфейса памяти между ключами. Так бывает, если код разблокировки вызывается второй раз, когда память уже открыта: проверьте PELOCK перед записью ключей.

Нужно ли стирать ячейку перед записью?

Нет: контроллер сам выполняет стирание, если оно нужно, и запись тогда длится 6,4 мс вместо 3,2 мс. Бит FIX в FLASH_PECR заставляет всегда делать и стирание, и запись — время становится постоянным, что удобно для расчёта таймингов.

Сколько раз можно перезаписать ячейку data EEPROM?

Число циклов записи указано в даташите конкретного STM32L0, а RM0377 уточняет важную деталь: ресурс расходуется по словам. Запись одного байта изнашивает только то слово, в котором он лежит, поэтому журналы и счётчики распределяют по разным словам.

Источники

  1. STMicroelectronics. RM0377 Reference manual: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs, Rev 10 — разд. 3.2: запись data EEPROM словом, полусловом или байтом, ресурс стирания и записи — на одно слово; разд. 3.3.1: data EEPROM с 0x0808 0000 — 512 байт у категории 1, 1 КБ, 2 КБ, у категории 5 до 6 КБ в двух банках; разд. 3.3.4: после сброса PELOCK = 1, разблокировка — PEKEY1 = 0x89ABCDEF, затем PEKEY2 = 0x02030405 в FLASH_PEKEYR; неверный ключ, третья запись или запись другого регистра между ключами — HardFault и блокировка до сброса; повторная блокировка битом PELOCK; там же: запись слова или его части — контроллер сам стирает при необходимости, Tprog = 3,2 мс, со стиранием 2 × Tprog = 6,4 мс, бит FIX задаёт всегда стирание и запись; WRPERR при PELOCK = 1 или защите чтения
  2. STMicroelectronics. cmsis-device-l0, Include/stm32l053xx.h (commit 7b7ae8c) — DATA_EEPROM_BASE = 0x08080000; FLASH->PEKEYR (смещение 0x0C), FLASH->PECR (смещение 0x04): PELOCK — бит 0, FIX — бит 8; FLASH_SR: BSY — бит 0, EOP — бит 1

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