Регистры FLASH STM32F0
Регистры FLASH STM32F0: такт ожидания и буфер предвыборки, ключи разблокировки, программирование и стирание страниц, флаги ошибок, байты опций, защита чтения и записи.
Флеш-память STM32F0 программируется полусловами по 16 бит: установите PG в FLASH_CR и запишите полуслово по адресу. Страница — 1 КБ у STM32F03x–F05x и 2 КБ у STM32F07x и F09x; стирание — бит PER, адрес страницы в FLASH_AR и бит STRT. Перед записью FLASH_CR разблокируют ключами 0x4567 0123 и 0xCDEF 89AB в FLASH_KEYR (RM0091, раздел 3.2).
При SYSCLK выше 24 МГц нужен один такт ожидания (LATENCY = 1). Регистр OBR показывает загруженные байты опций: уровень защиты чтения, режимы сторожа, nBOOT1 и пользовательские байты Data0 и Data1; WRPR — защиту страниц от записи.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| FLASH | 0x4002 2000 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| FLASH_ACR | 0x00 | Такты ожидания и буфер предвыборки | 0x0000 0000 |
| FLASH_KEYR | 0x04 | Ключ разблокировки FLASH_CR | 0xXXXX XXXX |
| FLASH_OPTKEYR | 0x08 | Ключ разблокировки байтов опций | 0xXXXX XXXX |
| FLASH_SR | 0x0C | Флаги занятости, окончания и ошибок | 0x0000 0000 |
| FLASH_CR | 0x10 | Программирование, стирание и блокировка | 0x0000 0080 |
| FLASH_AR | 0x14 | Адрес стираемой страницы | 0x0000 0000 |
| FLASH_OBR | 0x1C | Загруженные байты опций | 0xXXXX XX0X |
| FLASH_WRPR | 0x20 | Защита страниц от записи | 0xXXXX XXXX |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x00000000
0000 0000 0000 0000 0000 0000 0000 0000
FLASH->ACR = 0x00000000;FLASH_ACR — такты ожидания и буфер предвыборки
Смещение 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 |
| — | PRFTBS | PRFTBE | — | LATENCY | |||||||||||
- PRFTBS (бит 5) — Буфер предвыборки включён (только чтение).
- PRFTBE (бит 4) — Включение буфера предвыборки.
- LATENCY (бит 0) — Такт ожидания флеш-памяти: 0 — до 24 МГц, 1 — от 24 до 48 МГц.
LATENCY Значение 0 0 тактов ожидания: SYSCLK до 24 МГц 1 1 такт ожидания: SYSCLK от 24 до 48 МГц
FLASH_KEYR — ключ разблокировки FLASH_CR
Смещение 0x04, адрес 0x4002 2004, 32 бит, после сброса 0xXXXX XXXX. В коде: FLASH->KEYR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| FKEYR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| FKEYR | |||||||||||||||
- FKEYR (биты 31:0) — Ключ: запись 0x4567 0123, затем 0xCDEF 89AB снимает LOCK.
FLASH_OPTKEYR — ключ разблокировки байтов опций
Смещение 0x08, адрес 0x4002 2008, 32 бит, после сброса 0xXXXX XXXX. В коде: 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) — Ключ: запись 0x4567 0123, затем 0xCDEF 89AB разрешает запись байтов опций.
FLASH_SR — флаги занятости, окончания и ошибок
Смещение 0x0C, адрес 0x4002 200C, 32 бит, после сброса 0x0000 0000. В коде: FLASH->SR.
| 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 |
| — | EOP | WRPRTERR | — | PGERR | — | BSY | |||||||||
- EOP (бит 5) — Операция завершена; сбрасывается записью 1.
- WRPRTERR (бит 4) — Запись в защищённую страницу; сбрасывается записью 1.
- PGERR (бит 2) — Ошибка программирования: ячейка не стёрта; сбрасывается записью 1.
- BSY (бит 0) — Идёт операция с флеш-памятью.
FLASH_CR — программирование, стирание и блокировка
Смещение 0x10, адрес 0x4002 2010, 32 бит, после сброса 0x0000 0080. В коде: FLASH->CR.
| 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 |
| — | OBL_LAUNCH | EOPIE | — | ERRIE | OPTWRE | — | LOCK | STRT | OPTER | OPTPG | — | MER | PER | PG | |
- OBL_LAUNCH (бит 13) — Перезагрузить байты опций (вызывает системный сброс).
- EOPIE (бит 12) — Прерывание по окончании операции.
- ERRIE (бит 10) — Прерывание по ошибке.
- OPTWRE (бит 9) — Запись байтов опций разрешена (после OPTKEYR).
- LOCK (бит 7) — Блокировка FLASH_CR; снимается ключами FLASH_KEYR.
- STRT (бит 6) — Запуск стирания.
- OPTER (бит 5) — Стирание байтов опций.
- OPTPG (бит 4) — Программирование байтов опций.
- MER (бит 2) — Стирание всей флеш-памяти.
- PER (бит 1) — Стирание страницы.
- PG (бит 0) — Программирование.
FLASH_AR — адрес стираемой страницы
Смещение 0x14, адрес 0x4002 2014, 32 бит, после сброса 0x0000 0000. В коде: FLASH->AR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| FAR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| FAR | |||||||||||||||
- FAR (биты 31:0) — Адрес страницы для стирания (бит PER).
FLASH_OBR — загруженные байты опций
Смещение 0x1C, адрес 0x4002 201C, 32 бит, после сброса 0xXXXX XX0X. В коде: FLASH->OBR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| DATA1 | DATA0 | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| BOOT_SEL | RAM_PARITY_CHECK | VDDA_MONITOR | nBOOT1 | nBOOT0 | nRST_STDBY | nRST_STOP | IWDG_SW | — | RDPRT2 | RDPRT1 | OPTERR | ||||
- DATA1 (биты 31:24) — Пользовательский байт Data1 из байтов опций.
- DATA0 (биты 23:16) — Пользовательский байт Data0 из байтов опций.
- BOOT_SEL (бит 15) — Загрузка по биту nBOOT0 вместо вывода BOOT0 (только у STM32F042, STM32F048, STM32F091, STM32F098).
- RAM_PARITY_CHECK (бит 14) — Контроль чётности SRAM (0 — включён).
- VDDA_MONITOR (бит 13) — Контроль напряжения VDDA.
- nBOOT1 (бит 12) — Вместе с BOOT0 выбирает загрузку из SRAM или системной памяти.
- nBOOT0 (бит 11) — Значение BOOT0 при BOOT_SEL = 0 (только у STM32F042, STM32F048, STM32F091, STM32F098).
- nRST_STDBY (бит 10) — Сброс при входе в Standby (0) или нормальный вход.
- nRST_STOP (бит 9) — Сброс при входе в Stop (0) или нормальный вход.
- IWDG_SW (бит 8) — Сторож IWDG: программный (1) или аппаратный — включён после сброса (0).
- RDPRT2 (бит 2) — Защита чтения уровня 2 активна.
- RDPRT1 (бит 1) — Защита чтения уровня 1 активна.
- OPTERR (бит 0) — Ошибка загрузки байтов опций.
FLASH_WRPR — защита страниц от записи
Смещение 0x20, адрес 0x4002 2020, 32 бит, после сброса 0xXXXX XXXX. В коде: 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) — Защита страниц от записи: по биту на группу страниц, 0 — защищено.
Частые вопросы
Как записать полуслово во флеш-память STM32F0?
Разблокируйте: FLASH->KEYR = 0x45670123; FLASH->KEYR = 0xCDEF89AB. Затем FLASH->CR |= FLASH_CR_PG; *(volatile uint16_t *)addr = data; дождитесь сброса BSY, проверьте EOP и сбросьте PG. Ячейка должна быть стёрта (0xFFFF), иначе флаг PGERR.
Источники
- STMicroelectronics. RM0091: Reference manual (Rev 10) — раздел 3.5: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-f0 v2.3.8: заголовки CMSIS stm32f031x6.h, stm32f038xx.h, stm32f042x6.h, stm32f048xx.h, stm32f051x8.h, stm32f058xx.h, stm32f071xb.h, stm32f072xb.h, stm32f078xx.h, stm32f091xc.h, stm32f098xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32F0
- Все регистры STM32F0Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_CFGR, RCC_CIR, RCC_APB2RSTR, RCC_APB1RSTR, RCC_AHBENR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_CFGR1, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4, SYSCFG_CFGR2
- EXTI — внешние прерыванияEXTI_IMR, EXTI_EMR, EXTI_RTSR, EXTI_FTSR, EXTI_SWIER, EXTI_PR
- USART — последовательные порты USARTUSART_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
- DMA — прямой доступ к памятиDMA_ISR, DMA_IFCR, DMA_CSELR, DMA_CCR, DMA_CNDTR, DMA_CPAR
- ADC — аналого-цифровой преобразователь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
- DBGMCU — блок отладкиDBGMCU_IDCODE, DBGMCU_CR, DBGMCU_APB1_FZ, DBGMCU_APB2_FZ
- PWR — управление питаниемPWR_CR, PWR_CSR
- RTC — часы реального времениRTC_TR, RTC_DR, RTC_CR, RTC_ISR, RTC_PRER, RTC_WUTR
- DAC — цифро-аналоговый преобразователь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
Калькуляторы и статьи
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- Такты ожидания флеш-памяти STM32LATENCY в FLASH_ACR по частоте и питанию, таблица и код
- Карта флеш-памяти STM32Секторы и страницы, адрес → сектор, что стирать, CubeProgrammer и HAL
- STM32F0Cortex-M0, до 48 МГц: F030/F070, F031–F091, F042/F072, F0x8 — линейки и распиновки