Регистры FLASH STM32L4
Регистры FLASH STM32L4: такты ожидания, кэши инструкций и данных, выключение в Low-power run, ключи разблокировки, программирование двойными словами и быстрое программирование, стирание страниц и банков, байты опций, защита PCROP и WRP.
Флеш-память STM32L4 — два банка с ECC, программирование двойными словами по 64 бита, быстрое программирование строки из 32 двойных слов (FSTPG), стирание страниц по 2 КБ. Такты ожидания в Range 1: 0 до 16 МГц, 4 до 80 МГц. Ключи 0x4567 0123 и 0xCDEF 89AB в KEYR снимают LOCK (RM0351, раздел 3.7).
Байты опций в FLASH_OPTR: защита чтения RDP, порог BOR, режимы сторожей, сброс при входе в Stop, Standby и Shutdown, загрузка из банка 2 (BFB2), у объёмов 256 КБ — двухбанковый режим DUALBANK, стирание и чётность SRAM2. На каждый банк — область PCROP и две области защиты от записи.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| FLASH | 0x4002 2000 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| FLASH_ACR | 0x00 | Такты ожидания, кэши и предвыборка, режимы пониженного потребления | 0x0000 0600 |
| FLASH_PDKEYR | 0x04 | Ключ выключения флеш-памяти в режиме Run | 0x0000 0000 |
| FLASH_KEYR | 0x08 | Ключ разблокировки FLASH_CR | 0x0000 0000 |
| FLASH_OPTKEYR | 0x0C | Ключ разблокировки байтов опций | 0x0000 0000 |
| FLASH_SR | 0x10 | Флаги занятости, окончания и ошибок | 0x0000 0000 |
| FLASH_CR | 0x14 | Программирование, стирание и блокировка | 0xC000 0000 |
| FLASH_ECCR | 0x18 | Ошибки ECC | 0x0000 0000 |
| FLASH_OPTR | 0x20 | Байты опций: защита чтения, BOR, сторожа, загрузка | 0xXXXX XXXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)) |
| FLASH_PCROP1SR | 0x24 | Начало области PCROP банка 1 | 0xFFFF XXXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)) |
| FLASH_PCROP1ER | 0x28 | Конец области PCROP банка 1 | 0xXFFF XXXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)) |
| FLASH_WRP1AR | 0x2C | Область A защиты от записи, банк 1 | 0xFFXX FFXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)) |
| FLASH_WRP1BR | 0x30 | Область B защиты от записи, банк 1 | 0xFFXX FFXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)) |
| FLASH_PCROP2SR | 0x44 | Начало области PCROP банка 2 | 0xFFFF XXXX |
| FLASH_PCROP2ER | 0x48 | Конец области PCROP банка 2 | 0xFFFF XXXX |
| FLASH_WRP2AR | 0x4C | Область A защиты от записи, банк 2 | 0xFFXX FFXX |
| FLASH_WRP2BR | 0x50 | Область B защиты от записи, банк 2 | 0xFFXX FFXX |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x00000600
0000 0000 0000 0000 0000 0110 0000 0000
FLASH->ACR = 0x00000600;FLASH_ACR — такты ожидания, кэши и предвыборка, режимы пониженного потребления
Смещение 0x00, адрес 0x4002 2000, 32 бит, после сброса 0x0000 0600. В коде: 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 |
| — | SLEEP_PD | RUN_PD | DCRST | ICRST | DCEN | ICEN | PRFTEN | — | LATENCY | ||||||
- SLEEP_PD (бит 14) — Выключение флеш-памяти в режимах Sleep и Low-power sleep.
- RUN_PD (бит 13) — Выключение флеш-памяти в режиме Low-power run (после ключей FLASH_PDKEYR).
- DCRST (бит 12) — Сброс кэша данных; только при выключенном кэше.
- ICRST (бит 11) — Сброс кэша инструкций; только при выключенном кэше.
- DCEN (бит 10) — Включение кэша данных.
- ICEN (бит 9) — Включение кэша инструкций.
- PRFTEN (бит 8) — Включение буфера предвыборки.
- LATENCY (биты 2:0) — Такты ожидания флеш-памяти: 0…4 — по частоте HCLK и диапазону напряжения (до 80 МГц — 4 такта).
LATENCY Значение Макрос CMSIS 000 0 тактов ожидания FLASH_ACR_LATENCY_0WS 001 1 такт ожидания FLASH_ACR_LATENCY_1WS 010 2 такта ожидания FLASH_ACR_LATENCY_2WS 011 3 такта ожидания FLASH_ACR_LATENCY_3WS 100 4 такта ожидания FLASH_ACR_LATENCY_4WS
FLASH_PDKEYR — ключ выключения флеш-памяти в режиме Run
Смещение 0x04, адрес 0x4002 2004, 32 бит, после сброса 0x0000 0000. В коде: FLASH->PDKEYR.
Регистр данных: значение занимает его целиком.
FLASH_KEYR — ключ разблокировки FLASH_CR
Смещение 0x08, адрес 0x4002 2008, 32 бит, после сброса 0x0000 0000. В коде: FLASH->KEYR.
Регистр данных: значение занимает его целиком.
FLASH_OPTKEYR — ключ разблокировки байтов опций
Смещение 0x0C, адрес 0x4002 200C, 32 бит, после сброса 0x0000 0000. В коде: FLASH->OPTKEYR.
Регистр данных: значение занимает его целиком.
FLASH_SR — флаги занятости, окончания и ошибок
Смещение 0x10, адрес 0x4002 2010, 32 бит, после сброса 0x0000 0000. В коде: FLASH->SR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | BSY | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| OPTVERR | RDERR | — | FASTERR | MISERR | PGSERR | SIZERR | PGAERR | WRPERR | PROGERR | — | OPERR | EOP | |||
- BSY (бит 16) — Идёт операция с флеш-памятью.
- OPTVERR (бит 15) — Байты опций не прошли проверку при загрузке.
- RDERR (бит 14) — Чтение защищённой области PCROP.
- FASTERR (бит 9) — Прерывание быстрого программирования.
- MISERR (бит 8) — Нарушена последовательность быстрого программирования.
- PGSERR (бит 7) — Ошибка последовательности программирования.
- SIZERR (бит 6) — Запись не двойным словом.
- PGAERR (бит 5) — Ошибка выравнивания: двойное слово не по границе 8 байт.
- WRPERR (бит 4) — Запись в защищённую область; сбрасывается записью 1.
- PROGERR (бит 3) — Программирование ячейки, которая не стёрта; сбрасывается записью 1.
- OPERR (бит 1) — Ошибка операции; сбрасывается записью 1.
- EOP (бит 0) — Операция завершена; сбрасывается записью 1.
FLASH_CR — программирование, стирание и блокировка
Смещение 0x14, адрес 0x4002 2014, 32 бит, после сброса 0xC000 0000. В коде: FLASH->CR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| LOCK | OPTLOCK | — | OBL_LAUNCH | RDERRIE | ERRIE | EOPIE | — | FSTPG | OPTSTRT | STRT | |||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| MER2 | — | BKER | PNB | MER1 | PER | PG | |||||||||
- LOCK (бит 31) — Блокировка FLASH_CR; снимается ключами FLASH_KEYR.
- OPTLOCK (бит 30) — Блокировка байтов опций; снимается ключами FLASH_OPTKEYR.
- OBL_LAUNCH (бит 27) — Перезагрузить байты опций (вызывает сброс).
- RDERRIE (бит 26) — Прерывание по ошибке чтения PCROP.
- ERRIE (бит 25) — Прерывание по ошибке.
- EOPIE (бит 24) — Прерывание по окончании операции.
- FSTPG (бит 18) — Быстрое программирование строки из 32 двойных слов.
- OPTSTRT (бит 17) — Запуск записи байтов опций.
- STRT (бит 16) — Запуск стирания.
- MER2 (бит 15) — Стирание всей флеш-памяти банка 2.
- MER1 (бит 2) — Стирание всей флеш-памяти банка 1.
- BKER (бит 11) — Банк стираемой страницы.
- PNB (биты 10:3) — Номер стираемой страницы (страница — 2 КБ).
- PER (бит 1) — Стирание страницы.
- PG (бит 0) — Программирование.
FLASH_ECCR — ошибки ECC
Смещение 0x18, адрес 0x4002 2018, 32 бит, после сброса 0x0000 0000. В коде: FLASH->ECCR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| ECCD | ECCC | — | ECCIE | — | SYSF_ECC | BK_ECC | ADDR_ECC | ||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ADDR_ECC | |||||||||||||||
- ECCD (бит 31) — Двойная ошибка ECC (неисправимая); сбрасывается записью 1.
- ECCC (бит 30) — Одиночная ошибка ECC исправлена; сбрасывается записью 1.
- ECCIE (бит 24) — Прерывание по исправленной ошибке ECC.
- SYSF_ECC (бит 20) — Ошибка ECC в системной памяти.
- BK_ECC (бит 19) — Банк с ошибкой ECC.
- ADDR_ECC (биты 18:0) — Адрес двойного слова с ошибкой ECC.
FLASH_OPTR — байты опций: защита чтения, BOR, сторожа, загрузка
Смещение 0x20, адрес 0x4002 2020, 32 бит, после сброса 0xXXXX XXXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)). В коде: FLASH->OPTR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | nBOOT0 | nSWBOOT0 | SRAM2_RST | SRAM2_PE | nBOOT1 | — | DUALBANK | BFB2 | WWDG_SW | IWDG_STDBY | IWDG_STOP | IWDG_SW | |||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | nRST_SHDW | nRST_STDBY | nRST_STOP | — | BOR_LEV | RDP | |||||||||
- nBOOT0 (бит 27) — Значение BOOT0 при nSWBOOT0 = 0 (только у STM32L496, STM32L4A6).
- nSWBOOT0 (бит 26) — Источник BOOT0: бит nBOOT0 (0) или вывод BOOT0 (1) (только у STM32L496, STM32L4A6).
- SRAM2_RST (бит 25) — Стирание SRAM2 при системном сбросе (0 — стирается).
- SRAM2_PE (бит 24) — Контроль чётности SRAM2 (0 — включён).
- nBOOT1 (бит 23) — Вместе с BOOT0 выбирает загрузку из SRAM или системной памяти.
- DUALBANK (бит 21) — Двухбанковый режим для объёмов 256 КБ (STM32L47x/L48x/L49x).
- BFB2 (бит 20) — Загрузка из банка 2.
- WWDG_SW (бит 19) — Сторож WWDG: программный или аппаратный.
- IWDG_STDBY (бит 18) — Остановка IWDG в Standby.
- IWDG_STOP (бит 17) — Остановка IWDG в Stop.
- IWDG_SW (бит 16) — Сторож IWDG: программный (1) или аппаратный — включён после сброса (0).
- nRST_SHDW (бит 14) — Сброс при входе в Shutdown (0) или нормальный вход.
- nRST_STDBY (бит 13) — Сброс при входе в Standby (0) или нормальный вход.
- nRST_STOP (бит 12) — Сброс при входе в Stop (0) или нормальный вход.
- BOR_LEV (биты 10:8) — Порог сброса по снижению напряжения BOR: 0…4.
- RDP (биты 7:0) — Защита чтения: 0xAA — уровень 0, 0xCC — уровень 2 (необратимо), другое — уровень 1.
FLASH_PCROP1SR — начало области PCROP банка 1
Смещение 0x24, адрес 0x4002 2024, 32 бит, после сброса 0xFFFF XXXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)). В коде: FLASH->PCROP1SR.
| 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 |
| PCROP1_STRT | |||||||||||||||
- PCROP1_STRT (биты 15:0) — Начало области PCROP банка 1, в двойных словах.
FLASH_PCROP1ER — конец области PCROP банка 1
Смещение 0x28, адрес 0x4002 2028, 32 бит, после сброса 0xXFFF XXXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)). В коде: FLASH->PCROP1ER.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PCROP_RDP | — | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PCROP1_END | |||||||||||||||
- PCROP_RDP (бит 31) — Стирать области PCROP при снижении уровня защиты чтения с 1 до 0.
- PCROP1_END (биты 15:0) — Конец области PCROP банка 1 (включительно).
FLASH_WRP1AR — область A защиты от записи, банк 1
Смещение 0x2C, адрес 0x4002 202C, 32 бит, после сброса 0xFFXX FFXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)). В коде: FLASH->WRP1AR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | WRP1A_END | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | WRP1A_STRT | ||||||||||||||
- WRP1A_END (биты 23:16) — Последняя страница области A защиты от записи банка 1.
- WRP1A_STRT (биты 7:0) — Первая страница области A защиты от записи банка 1.
FLASH_WRP1BR — область B защиты от записи, банк 1
Смещение 0x30, адрес 0x4002 2030, 32 бит, после сброса 0xFFXX FFXX (X — биты, загруженные из флеш-памяти при загрузке байтов опций (OBL)). В коде: FLASH->WRP1BR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | WRP1B_END | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | WRP1B_STRT | ||||||||||||||
- WRP1B_END (биты 23:16) — Последняя страница области B защиты от записи банка 1.
- WRP1B_STRT (биты 7:0) — Первая страница области B защиты от записи банка 1.
FLASH_PCROP2SR — начало области PCROP банка 2
Смещение 0x44, адрес 0x4002 2044, 32 бит, после сброса 0xFFFF XXXX. В коде: FLASH->PCROP2SR.
| 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 |
| PCROP2_STRT | |||||||||||||||
- PCROP2_STRT (биты 15:0) — Начало области PCROP банка 2, в двойных словах.
FLASH_PCROP2ER — конец области PCROP банка 2
Смещение 0x48, адрес 0x4002 2048, 32 бит, после сброса 0xFFFF XXXX. В коде: FLASH->PCROP2ER.
| 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 |
| PCROP2_END | |||||||||||||||
- PCROP2_END (биты 15:0) — Конец области PCROP банка 2 (включительно).
FLASH_WRP2AR — область A защиты от записи, банк 2
Смещение 0x4C, адрес 0x4002 204C, 32 бит, после сброса 0xFFXX FFXX. В коде: FLASH->WRP2AR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | WRP2A_END | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | WRP2A_STRT | ||||||||||||||
- WRP2A_END (биты 23:16) — Последняя страница области A защиты от записи банка 2.
- WRP2A_STRT (биты 7:0) — Первая страница области A защиты от записи банка 2.
FLASH_WRP2BR — область B защиты от записи, банк 2
Смещение 0x50, адрес 0x4002 2050, 32 бит, после сброса 0xFFXX FFXX. В коде: FLASH->WRP2BR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | WRP2B_END | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | WRP2B_STRT | ||||||||||||||
- WRP2B_END (биты 23:16) — Последняя страница области B защиты от записи банка 2.
- WRP2B_STRT (биты 7:0) — Первая страница области B защиты от записи банка 2.
Частые вопросы
Сколько тактов ожидания нужно на 80 МГц?
LATENCY = 4 в диапазоне Range 1. В Range 2 (до 26 МГц) — до 3 тактов ожидания. Кэши ICEN и DCEN и предвыборка PRFTEN заметно ускоряют код при ненулевой задержке.
Как записать данные во флеш-память STM32L4?
Разблокируйте CR, сбросьте флаги ошибок в SR, установите PG и запишите два слова подряд по адресу, кратному 8, дождитесь BSY = 0 и EOP. Записать по уже записанному двойному слову нельзя — сначала сотрите страницу.
Источники
- STMicroelectronics. RM0351: Reference manual (Rev 11) — раздел 3.7: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-l4 v1.7.5: заголовки CMSIS stm32l471xx.h, stm32l475xx.h, stm32l476xx.h, stm32l485xx.h, stm32l486xx.h, stm32l496xx.h, stm32l4a6xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32L4
- Все регистры STM32L4Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_ICSCR, RCC_CFGR, RCC_PLLCFGR, RCC_PLLSAI1CFGR, RCC_PLLSAI2CFGR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_MEMRMP, SYSCFG_CFGR1, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4
- EXTI — внешние прерыванияEXTI_IMR1, EXTI_EMR1, EXTI_RTSR1, EXTI_FTSR1, EXTI_SWIER1, EXTI_PR1
- USART — последовательные порты USART и LPUARTUSART_CR1, USART_CR2, USART_CR3, USART_BRR, USART_GTPR, USART_RTOR
- SPI — интерфейсы SPISPI_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_CFGR, ADC_CFGR2, ADC_SMPR1
- 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
- DBGMCU — отладкаDBGMCU_IDCODE, DBGMCU_CR, DBGMCU_APB1FZR1, DBGMCU_APB1FZR2, DBGMCU_APB2FZR
- PWR — управление питаниемPWR_CR1, PWR_CR2, PWR_CR3, PWR_CR4, PWR_SR1, PWR_SR2
- RTC — часы реального времениRTC_TR, RTC_DR, RTC_CR, RTC_ISR, RTC_PRER, RTC_WUTR
- ЦАП — цифро-аналоговый преобразовательDAC_CR, DAC_SWTRIGR, DAC_DHR12R1, DAC_DHR12L1, DAC_DHR8R1, DAC_DHR12R2
- CAN — контроллер CANCAN_MCR, CAN_MSR, CAN_TSR, CAN_RF0R, CAN_RF1R, CAN_IER