Регистры GPIO STM32F0
Регистры портов GPIOA–GPIOF STM32F0: режим вывода, тип и скорость выхода, подтяжка, чтение входов и запись выходов, атомарные BSRR и BRR, блокировка настроек и выбор альтернативной функции AF0–AF7.
Порты STM32F0 устроены как у STM32F4: на вывод по два бита в MODER, OSPEEDR и PUPDR и один бит в OTYPER, номер альтернативной функции — четыре бита в AFR[0] или AFR[1]. Функций у вывода до восьми (AF0–AF7), их список — в таблице альтернативных функций даташита. Регистр BRR сохранился: запись 1 сбрасывает вывод, как старшая половина BSRR (RM0091, раздел 8.4).
Порты тактируются от шины AHB: биты GPIOAEN…GPIOFEN в RCC_AHBENR. После сброса все выводы — входы без подтяжки, кроме PA13 и PA14: это SWDIO и SWCLK, они в режиме альтернативной функции с подтяжками.
Скорость OSPEEDR задаёт крутизну фронтов, а не частоту ядра: на медленных сигналах низкая скорость снижает помехи и выбросы. Регистр блокировки LCKR есть только у портов A и B.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| GPIOA | 0x4800 0000 | всех |
| GPIOB | 0x4800 0400 | всех |
| GPIOC | 0x4800 0800 | всех |
| GPIOD | 0x4800 0C00 | STM32F051, STM32F058, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098 |
| GPIOE | 0x4800 1000 | STM32F071, STM32F072, STM32F078, STM32F091, STM32F098 |
| GPIOF | 0x4800 1400 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| GPIOx_MODER | 0x00 | Режим выводов | 0x2800 0000 (у порта A; у остальных — 0x0000 0000) |
| GPIOx_OTYPER | 0x04 | Тип выходов | 0x0000 0000 |
| GPIOx_OSPEEDR | 0x08 | Скорость выходов | 0x0C00 0000 (у порта A; у остальных — 0x0000 0000) |
| GPIOx_PUPDR | 0x0C | Подтяжка вверх и вниз | 0x2400 0000 (у порта A; у остальных — 0x0000 0000) |
| GPIOx_IDR | 0x10 | Входные данные порта | 0x0000 XXXX |
| GPIOx_ODR | 0x14 | Выходные данные порта | 0x0000 0000 |
| GPIOx_BSRR | 0x18 | Атомарная установка и сброс выходов | 0x0000 0000 |
| GPIOx_LCKR | 0x1C | Блокировка настроек выводов | 0x0000 0000 |
| GPIOx_AFRL | 0x20 | Альтернативные функции выводов 0–7 (AFRL) | 0x0000 0000 |
| GPIOx_AFRH | 0x24 | Альтернативные функции выводов 8–15 (AFRH) | 0x0000 0000 |
| GPIOx_BRR | 0x28 | Атомарный сброс выходов | 0x0000 0000 |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x28000000
0010 1000 0000 0000 0000 0000 0000 0000
GPIOA->MODER = 0x28000000;GPIOx_MODER — режим выводов
Смещение 0x00, 32 бит, после сброса 0x2800 0000 (у порта A; у остальных — 0x0000 0000). В коде: GPIOA->MODER.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| MODER15 | MODER14 | MODER13 | MODER12 | MODER11 | MODER10 | MODER9 | MODER8 | ||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| MODER7 | MODER6 | MODER5 | MODER4 | MODER3 | MODER2 | MODER1 | MODER0 | ||||||||
- MODER0–MODER15 (по 2 бита на каждый y, положение — на карте битов) — Режим вывода y: вход, выход, альтернативная функция или аналог.
MODERy Значение 00 Вход 01 Выход общего назначения 10 Альтернативная функция 11 Аналоговый режим
GPIOx_OTYPER — тип выходов
Смещение 0x04, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->OTYPER.
| 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 |
| OT15 | OT14 | OT13 | OT12 | OT11 | OT10 | OT9 | OT8 | OT7 | OT6 | OT5 | OT4 | OT3 | OT2 | OT1 | OT0 |
- OT0–OT15 (по биту на каждый y, положение — на карте битов) — Тип выхода вывода y: двухтактный или открытый сток.
OTy Значение 0 Двухтактный выход 1 Открытый сток
GPIOx_OSPEEDR — скорость выходов
Смещение 0x08, 32 бит, после сброса 0x0C00 0000 (у порта A; у остальных — 0x0000 0000). В коде: GPIOA->OSPEEDR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| OSPEEDR15 | OSPEEDR14 | OSPEEDR13 | OSPEEDR12 | OSPEEDR11 | OSPEEDR10 | OSPEEDR9 | OSPEEDR8 | ||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| OSPEEDR7 | OSPEEDR6 | OSPEEDR5 | OSPEEDR4 | OSPEEDR3 | OSPEEDR2 | OSPEEDR1 | OSPEEDR0 | ||||||||
- OSPEEDR0–OSPEEDR15 (по 2 бита на каждый y, положение — на карте битов) — Скорость (крутизна фронтов) выхода вывода y.
OSPEEDRy Значение 00 Низкая (до 2 МГц) 01 Средняя (до 10 МГц) 10 Низкая (код x0, как 00) 11 Высокая (до 50 МГц)
GPIOx_PUPDR — подтяжка вверх и вниз
Смещение 0x0C, 32 бит, после сброса 0x2400 0000 (у порта A; у остальных — 0x0000 0000). В коде: GPIOA->PUPDR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PUPDR15 | PUPDR14 | PUPDR13 | PUPDR12 | PUPDR11 | PUPDR10 | PUPDR9 | PUPDR8 | ||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PUPDR7 | PUPDR6 | PUPDR5 | PUPDR4 | PUPDR3 | PUPDR2 | PUPDR1 | PUPDR0 | ||||||||
- PUPDR0–PUPDR15 (по 2 бита на каждый y, положение — на карте битов) — Подтяжка вывода y.
PUPDRy Значение 00 Без подтяжки 01 Подтяжка вверх 10 Подтяжка вниз
GPIOx_IDR — входные данные порта
Смещение 0x10, 32 бит, после сброса 0x0000 XXXX. В коде: GPIOA->IDR.
| 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 |
| IDR15 | IDR14 | IDR13 | IDR12 | IDR11 | IDR10 | IDR9 | IDR8 | IDR7 | IDR6 | IDR5 | IDR4 | IDR3 | IDR2 | IDR1 | IDR0 |
- IDR0–IDR15 (по биту на каждый y, положение — на карте битов) — Уровень на входе вывода y (только чтение).
GPIOx_ODR — выходные данные порта
Смещение 0x14, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->ODR.
| 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 |
| ODR15 | ODR14 | ODR13 | ODR12 | ODR11 | ODR10 | ODR9 | ODR8 | ODR7 | ODR6 | ODR5 | ODR4 | ODR3 | ODR2 | ODR1 | ODR0 |
- ODR0–ODR15 (по биту на каждый y, положение — на карте битов) — Уровень на выходе вывода y.
GPIOx_BSRR — атомарная установка и сброс выходов
Смещение 0x18, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->BSRR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| BR15 | BR14 | BR13 | BR12 | BR11 | BR10 | BR9 | BR8 | BR7 | BR6 | BR5 | BR4 | BR3 | BR2 | BR1 | BR0 |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| BS15 | BS14 | BS13 | BS12 | BS11 | BS10 | BS9 | BS8 | BS7 | BS6 | BS5 | BS4 | BS3 | BS2 | BS1 | BS0 |
- BR2–BR15 (по биту на каждый y, положение — на карте битов) — Сброс выхода y: запись 1 сбрасывает бит ODR, 0 — без действия.
- BR1 (бит 17) — Сброс выхода 1: запись 1 сбрасывает бит ODR, 0 — без действия.
- BR0 (бит 16) — Сброс выхода 0: запись 1 сбрасывает бит ODR, 0 — без действия.
- BS2–BS15 (по биту на каждый y, положение — на карте битов) — Установка выхода y: запись 1 устанавливает бит ODR, 0 — без действия.
- BS1 (бит 1) — Установка выхода 1: запись 1 устанавливает бит ODR, 0 — без действия.
- BS0 (бит 0) — Установка выхода 0: запись 1 устанавливает бит ODR, 0 — без действия.
GPIOx_LCKR — блокировка настроек выводов
Смещение 0x1C, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->LCKR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | LCKK | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| LCK15 | LCK14 | LCK13 | LCK12 | LCK11 | LCK10 | LCK9 | LCK8 | LCK7 | LCK6 | LCK5 | LCK4 | LCK3 | LCK2 | LCK1 | LCK0 |
- LCKK (бит 16) — Ключ блокировки: последовательность записи 1, 0, 1 и чтения фиксирует биты LCK.
- LCK0–LCK15 (по биту на каждый y, положение — на карте битов) — Блокировка настроек вывода y до следующего сброса.
GPIOx_AFRL — альтернативные функции выводов 0–7 (AFRL)
Смещение 0x20, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->AFR[0].
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| AFSEL7 | AFSEL6 | AFSEL5 | AFSEL4 | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| AFSEL3 | AFSEL2 | AFSEL1 | AFSEL0 | ||||||||||||
- AFSEL7 (биты 31:28) — Номер альтернативной функции вывода 7 (AF0–AF7).
- AFSEL1–AFSEL6 (по 4 бита на каждый y, положение — на карте битов) — Номер альтернативной функции вывода y (AF0–AF7).
- AFSEL0 (биты 3:0) — Номер альтернативной функции вывода 0 (AF0–AF7).
GPIOx_AFRH — альтернативные функции выводов 8–15 (AFRH)
Смещение 0x24, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->AFR[1].
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| AFSEL15 | AFSEL14 | AFSEL13 | AFSEL12 | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| AFSEL11 | AFSEL10 | AFSEL9 | AFSEL8 | ||||||||||||
- AFSEL8–AFSEL15 (по 4 бита на каждый y, положение — на карте битов) — Номер альтернативной функции вывода y (AF0–AF7).
GPIOx_BRR — атомарный сброс выходов
Смещение 0x28, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->BRR.
| 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 |
| BR15 | BR14 | BR13 | BR12 | BR11 | BR10 | BR9 | BR8 | BR7 | BR6 | BR5 | BR4 | BR3 | BR2 | BR1 | BR0 |
- BR2–BR15 (по биту на каждый y, положение — на карте битов) — Сброс выхода y: запись 1 сбрасывает бит ODR, 0 — без действия.
- BR1 (бит 1) — Сброс выхода 1: запись 1 сбрасывает бит ODR, 0 — без действия.
- BR0 (бит 0) — Сброс выхода 0: запись 1 сбрасывает бит ODR, 0 — без действия.
Частые вопросы
Как настроить PA5 STM32F030 выходом?
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; затем GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER5) | GPIO_MODER_MODER5_0. Включать и выключать вывод — GPIOA->BSRR = GPIO_BSRR_BS_5 и GPIOA->BRR = GPIO_BRR_BR_5.
Почему вывод не переключается в альтернативную функцию?
Нужно и MODER = 10, и номер функции в AFRL (выводы 0–7) или AFRH (8–15). Номер ищите в таблице альтернативных функций даташита: например, USART1_TX на PA9 — это AF1.
Источники
- STMicroelectronics. RM0091: Reference manual (Rev 10) — раздел 8.4: описание регистров, назначение полей и значения после сброса
- 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
- 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
- FLASH — интерфейс флеш-памятиFLASH_ACR, FLASH_KEYR, FLASH_OPTKEYR, FLASH_SR, FLASH_CR, FLASH_AR
- 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