Регистры FLASH STM32L0
Регистры интерфейса памяти NVM STM32L0x1: такт ожидания и режимы чтения, программирование и стирание флеш-памяти и EEPROM данных, ключи разблокировки, флаги состояния и ошибок, байты опций и защита секторов.
У STM32L0 в одной памяти NVM флеш-память программ, EEPROM данных и байты опций. Такт ожидания один (LATENCY): он нужен выше 16 МГц в диапазоне 1 и выше 8 МГц в диапазоне 2 (RM0377, таблица 14). Запись разблокируется по ступеням: ключи PEKEY в FLASH_PEKEYR снимают PELOCK, затем PRGKEY или OPTKEY снимают PRGLOCK или OPTLOCK.
EEPROM пишется словами, полусловами и байтами без отдельного стирания (бит FIX задаёт фиксированное время с предварительным стиранием), флеш-память — словами или половинами страниц по 64 байта. Байты опций в FLASH_OPTR задают защиту чтения, порог BOR, режим сторожа и сброс при входе в Stop и Standby.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| FLASH | 0x4002 2000 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| FLASH_ACR | 0x00 | Такты ожидания, предвыборка и режимы памяти NVM | 0x0000 0000 |
| FLASH_PECR | 0x04 | Программирование и стирание флеш-памяти и EEPROM | 0x0000 0007 |
| FLASH_PDKEYR | 0x08 | Ключ выхода памяти NVM из режима power-down | 0x0000 0000 |
| FLASH_PEKEYR | 0x0C | Ключ разблокировки FLASH_PECR и EEPROM | 0x0000 0000 |
| FLASH_PRGKEYR | 0x10 | Ключ разблокировки флеш-памяти программ | 0x0000 0000 |
| FLASH_OPTKEYR | 0x14 | Ключ разблокировки байтов опций | 0x0000 0000 |
| FLASH_SR | 0x18 | Состояние и ошибки памяти NVM | 0x0000 000C |
| FLASH_OPTR | 0x1C | Байты опций: защита чтения, BOR и сторож | 0xX0XX 0XXX (X — по байтам опций; с завода — 0x8070 00AA) |
| FLASH_WRPROT1 | 0x20 | Защита секторов от записи, секторы 0–15 | 0xXXXX XXXX (X — по байтам опций; с завода — 0x0000 0000) |
| FLASH_WRPROT2 | 0x80 | Защита секторов от записи, секторы 16–31 | 0x0000 XXXX (X — по байтам опций; с завода — 0x0000 0000) |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x00000000
0000 0000 0000 0000 0000 0000 0000 0000
FLASH->ACR = 0x00000000;FLASH_ACR — такты ожидания, предвыборка и режимы памяти NVM
Смещение 0x00, адрес 0x4002 2000, 32 бит, после сброса 0x0000 0000. В коде: FLASH->ACR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | PRE_READ | DISAB_BUF | RUN_PD | SLEEP_PD | — | PRFTEN | LATENCY | ||||||||
- PRE_READ (бит 6) — Упреждающее чтение данных: интерфейс читает следующее слово заранее.
- DISAB_BUF (бит 5) — Отключение буферов чтения: каждое чтение идёт в память NVM.
- RUN_PD (бит 4) — Память NVM в режиме power-down в режиме Run (запись — после ключей FLASH_PDKEYR).
- SLEEP_PD (бит 3) — Память NVM в режиме power-down в режиме Sleep.
- PRFTEN (бит 1) — Предвыборка: интерфейс заранее читает следующее слово программы.
- LATENCY (бит 0) — Такт ожидания при чтении памяти NVM: 0 или 1.
LATENCY Значение 0 0 тактов ожидания 1 1 такт ожидания
FLASH_PECR — программирование и стирание флеш-памяти и EEPROM
Смещение 0x04, адрес 0x4002 2004, 32 бит, после сброса 0x0000 0007. В коде: FLASH->PECR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | OBL_LAUNCH | ERRIE | EOPIE | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PARALLBANK | — | FPRG | ERASE | FIX | — | DATA | PROG | OPTLOCK | PRGLOCK | PELOCK | |||||
- OBL_LAUNCH (бит 18) — Запись 1 перезагружает байты опций и вызывает системный сброс.
- ERRIE (бит 17) — Прерывание по ошибке записи или стирания.
- EOPIE (бит 16) — Прерывание по окончании записи или стирания.
- PARALLBANK (бит 15) — Параллельная запись половин страниц в оба банка (у устройств с двумя банками) (только у STM32L071, STM32L081).
- FPRG (бит 10) — Запись половины страницы за одну операцию (вместе с PROG).
- ERASE (бит 9) — Стирание страницы или слова (вместе с PROG или DATA).
- FIX (бит 8) — Фиксированное время записи в EEPROM: всегда со стиранием перед записью.
- DATA (бит 4) — Операция над данными EEPROM.
- PROG (бит 3) — Операция над флеш-памятью программ.
- OPTLOCK (бит 2) — Байты опций заблокированы (разблокировка — ключами FLASH_OPTKEYR).
- PRGLOCK (бит 1) — Флеш-память программ заблокирована (разблокировка — ключами FLASH_PRGKEYR).
- PELOCK (бит 0) — FLASH_PECR и EEPROM заблокированы (разблокировка — ключами FLASH_PEKEYR).
FLASH_PDKEYR — ключ выхода памяти NVM из режима power-down
Смещение 0x08, адрес 0x4002 2008, 32 бит, после сброса 0x0000 0000. В коде: FLASH->PDKEYR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PDKEYR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PDKEYR | |||||||||||||||
- PDKEYR (биты 31:0) — Ключи 0x0415 2637 и 0xFAFB FCFD разрешают запись бита RUN_PD.
FLASH_PEKEYR — ключ разблокировки FLASH_PECR и EEPROM
Смещение 0x0C, адрес 0x4002 200C, 32 бит, после сброса 0x0000 0000. В коде: FLASH->PEKEYR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PEKEYR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PEKEYR | |||||||||||||||
- PEKEYR (биты 31:0) — Ключи 0x89AB CDEF и 0x0203 0405 снимают PELOCK.
FLASH_PRGKEYR — ключ разблокировки флеш-памяти программ
Смещение 0x10, адрес 0x4002 2010, 32 бит, после сброса 0x0000 0000. В коде: FLASH->PRGKEYR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PRGKEYR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PRGKEYR | |||||||||||||||
- PRGKEYR (биты 31:0) — Ключи 0x8C9D AEBF и 0x1314 1516 снимают PRGLOCK (после PELOCK).
FLASH_OPTKEYR — ключ разблокировки байтов опций
Смещение 0x14, адрес 0x4002 2014, 32 бит, после сброса 0x0000 0000. В коде: FLASH->OPTKEYR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| OPTKEYR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| OPTKEYR | |||||||||||||||
- OPTKEYR (биты 31:0) — Ключи 0xFBEA D9C8 и 0x2425 2627 снимают OPTLOCK (после PELOCK).
FLASH_SR — состояние и ошибки памяти NVM
Смещение 0x18, адрес 0x4002 2018, 32 бит, после сброса 0x0000 000C. В коде: FLASH->SR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | FWWERR | NOTZEROERR | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | RDERR | — | OPTVERR | SIZERR | PGAERR | WRPERR | — | READY | HVOFF | EOP | BSY | ||||
- FWWERR (бит 17) — Запись или стирание прервано выборкой команды (сбрасывается записью 1).
- NOTZEROERR (бит 16) — Запись в нестёртую область (сбрасывается записью 1).
- RDERR (бит 13) — Чтение защищённой области PCROP (сбрасывается записью 1).
- OPTVERR (бит 11) — Ошибка байтов опций при загрузке (сбрасывается записью 1).
- SIZERR (бит 10) — Ошибка размера данных (сбрасывается записью 1).
- PGAERR (бит 9) — Ошибка выравнивания при записи (сбрасывается записью 1).
- WRPERR (бит 8) — Запись в защищённую область (сбрасывается записью 1).
- READY (бит 3) — Память NVM готова после выхода из режима пониженного потребления.
- HVOFF (бит 2) — Высокое напряжение программирования снято: операция записи или стирания не идёт.
- EOP (бит 1) — Запись или стирание закончено (сбрасывается записью 1).
- BSY (бит 0) — Идёт запись или стирание.
FLASH_OPTR — байты опций: защита чтения, BOR и сторож
Смещение 0x1C, адрес 0x4002 201C, 32 бит, после сброса 0xX0XX 0XXX (X — по байтам опций; с завода — 0x8070 00AA). В коде: FLASH->OPTR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| BOOT1 | — | BFB2 | nRST_STDBY | nRST_STOP | IWDG_SW | BOR_LEV | |||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | WPRMOD | RDPROT | |||||||||||||
- BOOT1 (бит 31) — Бит опций nBOOT1: вместе с выводом BOOT0 выбирает загрузку.
- BFB2 (бит 23) — Загрузка из системной памяти, которая затем переходит в банк 2 при его валидности (только у STM32L071, STM32L081).
- nRST_STDBY (бит 22) — 0 — сброс при входе в Standby, 1 — без сброса.
- nRST_STOP (бит 21) — 0 — сброс при входе в Stop, 1 — без сброса.
- IWDG_SW (бит 20) — Сторож IWDG: 0 — аппаратный (запускается сам), 1 — программный.
- BOR_LEV (биты 19:16) — Порог сброса по снижению питания BOR.
BOR_LEV Значение 0000 BOR выключен: сброс около 1,5 В (0xxx) 1000 Уровень 1: около 1,8 В 1001 Уровень 2: около 2,0 В 1010 Уровень 3: около 2,5 В 1011 Уровень 4: около 2,7 В 1100 Уровень 5: около 3,0 В - WPRMOD (бит 8) — Режим битов защиты секторов: защита записи или защита чтения кода (PCROP).
- RDPROT (биты 7:0) — Уровень защиты чтения: 0xAA — уровень 0, 0xCC — уровень 2, иначе — уровень 1.
FLASH_WRPROT1 — защита секторов от записи, секторы 0–15
Смещение 0x20, адрес 0x4002 2020, 32 бит, после сброса 0xXXXX XXXX (X — по байтам опций; с завода — 0x0000 0000). В коде: FLASH->WRPR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| WRP | |||||||||||||||
- WRP (биты 15:0) — Защита от записи секторов по 4 КБ, бит на сектор (смысл бита задаёт WPRMOD/SPRMOD).
FLASH_WRPROT2 — защита секторов от записи, секторы 16–31
Смещение 0x80, адрес 0x4002 2080, 32 бит, после сброса 0x0000 XXXX (X — по байтам опций; с завода — 0x0000 0000); регистр есть только у STM32L071, STM32L081. В коде: FLASH->WRPR2.
Регистр данных: значение занимает его целиком.
Частые вопросы
Как записать байт в EEPROM STM32L0?
Снимите PELOCK: запишите в FLASH->PEKEYR 0x89AB CDEF и затем 0x0203 0405. После этого просто запишите байт по адресу EEPROM (с 0x0808 0000) и дождитесь сброса BSY в FLASH_SR. В конце снова заблокируйте запись битом PELOCK.
Зачем RM0377 советует писать NZDISABLE?
Флеш-память проверяет, что слово стёрто перед записью, и ставит флаг NOTZEROERR. В RM0377 бит NZDISABLE (бит 23 FLASH_PECR) отключает это уведомление; заголовки CMSIS помещают его в бит 22, поэтому на странице он не показан.
Источники
- STMicroelectronics. RM0377: Reference manual (Rev 10) — раздел 3.7: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-l0 v1.9.4: заголовки CMSIS stm32l011xx.h, stm32l021xx.h, stm32l031xx.h, stm32l041xx.h, stm32l051xx.h, stm32l071xx.h, stm32l081xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32L0
- Все регистры STM32L0Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_ICSCR, RCC_CFGR, RCC_CIER, RCC_CIFR, RCC_CICR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_CFGR1, SYSCFG_CFGR2, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4
- EXTI — контроллер внешних прерываний и событийEXTI_IMR, EXTI_EMR, EXTI_RTSR, EXTI_FTSR, EXTI_SWIER, EXTI_PR
- USART — последовательные порты USART и LPUARTUSART_CR1, USART_CR2, USART_CR3, USART_BRR, USART_GTPR, USART_RTOR
- SPI — интерфейсы SPI и I2SSPI_CR1, SPI_CR2, SPI_SR, SPI_DR, SPI_CRCPR, SPI_RXCRCR
- I2C — интерфейс I2CI2C_CR1, I2C_CR2, I2C_OAR1, I2C_OAR2, I2C_TIMINGR, I2C_TIMEOUTR
- TIM — таймеры общего назначения и базовыеTIMx_CR1, TIMx_CR2, TIMx_SMCR, TIMx_DIER, TIMx_SR, TIMx_EGR
- LPTIM — малопотребляющий таймерLPTIM_ISR, LPTIM_ICR, LPTIM_IER, LPTIM_CFGR, LPTIM_CR, LPTIM_CMP
- DMA — контроллер прямого доступа к памятиDMA_ISR, DMA_IFCR, DMA_CCR, DMA_CNDTR, DMA_CPAR, DMA_CMAR
- АЦП — аналого-цифровой преобразовательADC_ISR, ADC_IER, ADC_CR, ADC_CFGR1, ADC_CFGR2, ADC_SMPR
- IWDG — независимый сторожевой таймерIWDG_KR, IWDG_PR, IWDG_RLR, IWDG_SR, IWDG_WINR
- WWDG — оконный сторожевой таймерWWDG_CR, WWDG_CFR, WWDG_SR
- CRC — блок вычисления CRCCRC_DR, CRC_IDR, CRC_CR, CRC_INIT, CRC_POL
- DBG — поддержка отладкиDBGMCU_IDCODE, DBG_CR, DBG_APB1_FZ, DBG_APB2_FZ
- PWR — управление питаниемPWR_CR, PWR_CSR
- RTC — часы реального времениRTC_TR, RTC_DR, RTC_CR, RTC_ISR, RTC_PRER, RTC_WUTR