Перейти к содержанию

Регистры GPIO STM32F4

Регистры портов GPIOA…GPIOK STM32F4: режим, тип выхода, скорость и подтяжка в MODER, OTYPER, OSPEEDR и PUPDR, альтернативные функции AF0–AF15 в AFRL и AFRH, входы, выходы и атомарный BSRR.

У STM32F4 настройки вывода разнесены по отдельным регистрам: MODER выбирает вход, выход, альтернативную функцию или аналоговый режим, OTYPER — двухтактный выход или открытый сток, OSPEEDR — скорость выходного каскада, PUPDR — подтяжку вверх или вниз. Номер альтернативной функции (AF0–AF15) для выводов 0–7 задаёт регистр AFRL, для выводов 8–15 — AFRH; в CMSIS они доступны как AFR[0] и AFR[1].

После сброса почти все выводы — входы без подтяжки. Исключение — выводы отладчика: значения MODER, OSPEEDR и PUPDR для портов A и B после сброса не нулевые (RM0090, раздел 8.4), потому что PA13, PA14, PA15, PB3 и PB4 работают как JTAG и SWD. Тактирование порта включается битом GPIOxEN в регистре RCC_AHB1ENR.

Регистры GPIO у STM32F4 доступны байтами, полусловами и словами. Для атомарного изменения выходов служит BSRR: младшие 16 бит устанавливают выводы, старшие сбрасывают.

ЭкземплярБазовый адресЕсть у
GPIOA0x4002 0000всех
GPIOB0x4002 0400всех
GPIOC0x4002 0800всех
GPIOD0x4002 0C00всех
GPIOE0x4002 1000всех
GPIOF0x4002 1400всех
GPIOG0x4002 1800всех
GPIOH0x4002 1C00всех
GPIOI0x4002 2000всех
GPIOJ0x4002 2400STM32F427, STM32F429, STM32F437, STM32F439
GPIOK0x4002 2800STM32F427, STM32F429, STM32F437, STM32F439

Регистры блока

РегистрСмещениеНазначениеПосле сброса
GPIOx_MODER0x00Режим выводов0xA800 0000 (у порта A; у порта B — 0x0000 0280, у остальных — 0x0000 0000)
GPIOx_OTYPER0x04Тип выходов0x0000 0000
GPIOx_OSPEEDR0x08Скорость выходов0x0C00 0000 (у порта A; у порта B — 0x0000 00C0, у остальных — 0x0000 0000)
GPIOx_PUPDR0x0CПодтяжка вверх и вниз0x6400 0000 (у порта A; у порта B — 0x0000 0100, у остальных — 0x0000 0000)
GPIOx_IDR0x10Входные данные порта0x0000 XXXX (X — не определено)
GPIOx_ODR0x14Выходные данные порта0x0000 0000
GPIOx_BSRR0x18Атомарная установка и сброс выходов0x0000 0000
GPIOx_LCKR0x1CБлокировка настроек выводов0x0000 0000
GPIOx_AFRL0x20Альтернативные функции выводов 0–7 (AFRL)0x0000 0000
GPIOx_AFRH0x24Альтернативные функции выводов 8–15 (AFRH)0x0000 0000

Конструктор значения

Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.

Значение: 0xA8000000

1010 1000 0000 0000 0000 0000 0000 0000

GPIOA->MODER = 0xA8000000;

GPIOx_MODER — режим выводов

Смещение 0x00, 32 бит, после сброса 0xA800 0000 (у порта A; у порта B — 0x0000 0280, у остальных — 0x0000 0000). В коде: GPIOA->MODER.

31302928272625242322212019181716
MODER15MODER14MODER13MODER12MODER11MODER10MODER9MODER8
1514131211109876543210
MODER7MODER6MODER5MODER4MODER3MODER2MODER1MODER0
  • MODER0–MODER15 (по 2 бита на каждый y, положение — на карте битов) — Режим вывода y.
    MODERyЗначение
    00Вход (после сброса)
    01Выход общего назначения
    10Альтернативная функция
    11Аналоговый режим

GPIOx_OTYPER — тип выходов

Смещение 0x04, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->OTYPER.

31302928272625242322212019181716
—
1514131211109876543210
OT15OT14OT13OT12OT11OT10OT9OT8OT7OT6OT5OT4OT3OT2OT1OT0
  • OT0–OT15 (по биту на каждый y, положение — на карте битов) — Тип выхода вывода y.
    OTyЗначение
    0Двухтактный выход (после сброса)
    1Открытый сток

GPIOx_OSPEEDR — скорость выходов

Смещение 0x08, 32 бит, после сброса 0x0C00 0000 (у порта A; у порта B — 0x0000 00C0, у остальных — 0x0000 0000). В коде: GPIOA->OSPEEDR.

31302928272625242322212019181716
OSPEED15OSPEED14OSPEED13OSPEED12OSPEED11OSPEED10OSPEED9OSPEED8
1514131211109876543210
OSPEED7OSPEED6OSPEED5OSPEED4OSPEED3OSPEED2OSPEED1OSPEED0
  • OSPEED0–OSPEED15 (по 2 бита на каждый y, положение — на карте битов) — Скорость выхода вывода y.
    OSPEEDyЗначение
    00Низкая скорость
    01Средняя
    10Высокая
    11Очень высокая

GPIOx_PUPDR — подтяжка вверх и вниз

Смещение 0x0C, 32 бит, после сброса 0x6400 0000 (у порта A; у порта B — 0x0000 0100, у остальных — 0x0000 0000). В коде: GPIOA->PUPDR.

31302928272625242322212019181716
PUPD15PUPD14PUPD13PUPD12PUPD11PUPD10PUPD9PUPD8
1514131211109876543210
PUPD7PUPD6PUPD5PUPD4PUPD3PUPD2PUPD1PUPD0
  • PUPD0–PUPD15 (по 2 бита на каждый y, положение — на карте битов) — Подтяжка вывода y.
    PUPDyЗначение
    00Без подтяжки
    01Подтяжка вверх
    10Подтяжка вниз
    11Зарезервировано

GPIOx_IDR — входные данные порта

Смещение 0x10, 32 бит, после сброса 0x0000 XXXX (X — не определено). В коде: GPIOA->IDR.

31302928272625242322212019181716
—
1514131211109876543210
ID15ID14ID13ID12ID11ID10ID9ID8ID7ID6ID5ID4ID3ID2ID1ID0
  • ID0–ID15 (по биту на каждый y, положение — на карте битов) — Уровень на входе вывода y (только чтение).

GPIOx_ODR — выходные данные порта

Смещение 0x14, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->ODR.

31302928272625242322212019181716
—
1514131211109876543210
OD15OD14OD13OD12OD11OD10OD9OD8OD7OD6OD5OD4OD3OD2OD1OD0
  • OD0–OD15 (по биту на каждый y, положение — на карте битов) — Уровень на выходе вывода y.

GPIOx_BSRR — атомарная установка и сброс выходов

Смещение 0x18, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->BSRR.

31302928272625242322212019181716
BR15BR14BR13BR12BR11BR10BR9BR8BR7BR6BR5BR4BR3BR2BR1BR0
1514131211109876543210
BS15BS14BS13BS12BS11BS10BS9BS8BS7BS6BS5BS4BS3BS2BS1BS0
  • 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.

31302928272625242322212019181716
—LCKK
1514131211109876543210
LCK15LCK14LCK13LCK12LCK11LCK10LCK9LCK8LCK7LCK6LCK5LCK4LCK3LCK2LCK1LCK0
  • LCKK (бит 16) — Ключ блокировки: последовательность записи 1, 0, 1 и чтения фиксирует биты LCK.
  • LCK0–LCK15 (по биту на каждый y, положение — на карте битов) — Блокировка настроек вывода y до следующего сброса.

GPIOx_AFRL — альтернативные функции выводов 0–7 (AFRL)

Смещение 0x20, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->AFR[0].

31302928272625242322212019181716
AFSEL7AFSEL6AFSEL5AFSEL4
1514131211109876543210
AFSEL3AFSEL2AFSEL1AFSEL0
  • AFSEL1–AFSEL7 (по 4 бита на каждый y, положение — на карте битов) — Номер альтернативной функции вывода y (AF0–AF15).
  • AFSEL0 (биты 3:0) — Номер альтернативной функции вывода 0 (AF0–AF15).

GPIOx_AFRH — альтернативные функции выводов 8–15 (AFRH)

Смещение 0x24, 32 бит, после сброса 0x0000 0000. В коде: GPIOA->AFR[1].

31302928272625242322212019181716
AFSEL15AFSEL14AFSEL13AFSEL12
1514131211109876543210
AFSEL11AFSEL10AFSEL9AFSEL8
  • AFSEL15 (биты 31:28) — Номер альтернативной функции вывода 15 (AF0–AF15).
  • AFSEL8–AFSEL14 (по 4 бита на каждый y, положение — на карте битов) — Номер альтернативной функции вывода y (AF0–AF15).

Частые вопросы

Как настроить вывод PA5 на выход в STM32F4?

Включите тактирование: RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN. Затем запишите в поле MODER5 значение 01: GPIOA->MODER = (GPIOA->MODER & ~GPIO_MODER_MODER5) | GPIO_MODER_MODER5_0. По умолчанию выход двухтактный (OTYPER = 0) и самый медленный (OSPEEDR = 00) — для светодиода этого достаточно.

Как выбрать альтернативную функцию вывода?

Переведите вывод в режим альтернативной функции (MODER = 10) и запишите номер AF в 4 бита вывода в AFRL (выводы 0–7) или AFRH (8–15). Например, USART2_TX на PA2 — это AF7: GPIOA->AFR[0] |= 7 << GPIO_AFRL_AFSEL2_Pos. Номер AF для каждой функции — в таблице альтернативных функций даташита и на странице распиновки атласа.

Почему после сброса GPIOA->MODER равен 0xA800 0000?

Выводы PA13, PA14 и PA15 после сброса работают как SWDIO, SWCLK и JTDI — режим альтернативной функции (10). Если переписать MODER порта A целиком нулями, отладчик потеряет связь с микроконтроллером.

Источники

  1. STMicroelectronics. RM0090: Reference manual (Rev 22) — раздел 8.4: описание регистров, назначение полей и значения после сброса
  2. STMicroelectronics. cmsis-device-f4 v2.6.11: заголовки CMSIS stm32f405xx.h, stm32f407xx.h, stm32f415xx.h, stm32f417xx.h, stm32f427xx.h, stm32f429xx.h, stm32f437xx.h, stm32f439xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0

Нашли ошибку в регистрах?

Другие регистры STM32F4

Калькуляторы и статьи