Как записать байт в 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 уточняет важную деталь: ресурс расходуется по словам. Запись одного байта изнашивает только то слово, в котором он лежит, поэтому журналы и счётчики распределяют по разным словам.
Источники
- 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 или защите чтения
- 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
Нашли ошибку?
Смотрите также
- STM32L0Cortex-M0+, до 32 МГц, малое потребление: L010, L0x1, L0x2 с USB, L0x3 с ЖКИ — линейки и распиновки
- EEPROMЭнергонезависимая память для настроек и калибровки
- Есть ли у STM32F103 EEPROM?Нет: флеш-страница, резервные регистры или внешняя EEPROM
- HardFaultИсключение Cortex-M при необработанной ошибке
- Сколько раз можно перепрошить микроконтроллер?10 000 циклов флеш-памяти, 100 000 у EEPROM