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

Регистры GPIO STM32L4

Регистры портов GPIOA–GPIOI STM32L4: режим вывода, тип и скорость выхода, подтяжка, чтение входов и запись выходов, атомарные BSRR и BRR, блокировка настроек, альтернативные функции AF0–AF15 и подключение выводов к АЦП в ASCR.

После сброса выводы STM32L4 — в аналоговом режиме (MODER = 11), кроме выводов отладки PA13, PA14, PA15, PB3 и PB4: так меньше потребление. На вывод — по два бита в MODER, OSPEEDR и PUPDR, бит в OTYPER и четыре бита номера функции AF0–AF15 в AFR (RM0351, раздел 8.5).

Своё у STM32L4 — регистр ASCR: у STM32L47x/L48x вывод подключается к входу АЦП только при ASCy = 1 вместе с аналоговым режимом. Порты тактируются от шины AHB2, биты GPIOAEN…GPIOIEN в RCC_AHB2ENR; порт I есть у STM32L49x/L4Ax.

ЭкземплярБазовый адресЕсть у
GPIOA0x4800 0000всех
GPIOB0x4800 0400всех
GPIOC0x4800 0800всех
GPIOD0x4800 0C00всех
GPIOE0x4800 1000всех
GPIOF0x4800 1400всех
GPIOG0x4800 1800всех
GPIOH0x4800 1C00всех
GPIOI0x4800 2000STM32L496, STM32L4A6

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

РегистрСмещениеНазначениеПосле сброса
GPIOx_MODER0x00Режим выводов0xABFF FFFF (у порта A; у порта B — 0xFFFF FEBF, у остальных — 0xFFFF FFFF)
GPIOx_OTYPER0x04Тип выходов0x0000 0000
GPIOx_OSPEEDR0x08Скорость выходов0x0C00 0000 (у порта A; у остальных — 0x0000 0000)
GPIOx_PUPDR0x0CПодтяжка вверх и вниз0x6400 0000 (у порта A; у порта B — 0x0000 0100, у остальных — 0x0000 0000)
GPIOx_IDR0x10Входные данные порта0x0000 XXXX
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
GPIOx_BRR0x28Атомарный сброс выходов0x0000 0000
GPIOx_ASCR0x2CПодключение выводов к аналоговым входам АЦП0x0000 0000

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

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

Значение: 0xABFFFFFF

1010 1011 1111 1111 1111 1111 1111 1111

GPIOA->MODER = 0xABFFFFFF;

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

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

31302928272625242322212019181716
MODE15MODE14MODE13MODE12MODE11MODE10MODE9MODE8
1514131211109876543210
MODE7MODE6MODE5MODE4MODE3MODE2MODE1MODE0
  • MODE0–MODE15 (по 2 бита на каждый y, положение — на карте битов) — Режим вывода y: вход, выход, альтернативная функция или аналог.
    MODEyЗначение
    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; у остальных — 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Подтяжка вниз

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

Смещение 0x10, 32 бит, после сброса 0x0000 XXXX. В коде: 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).

GPIOx_BRR — атомарный сброс выходов

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

31302928272625242322212019181716
—
1514131211109876543210
BR15BR14BR13BR12BR11BR10BR9BR8BR7BR6BR5BR4BR3BR2BR1BR0
  • BR2–BR15 (по биту на каждый y, положение — на карте битов) — Сброс выхода y: запись 1 сбрасывает бит ODR, 0 — без действия.
  • BR1 (бит 1) — Сброс выхода 1: запись 1 сбрасывает бит ODR, 0 — без действия.
  • BR0 (бит 0) — Сброс выхода 0: запись 1 сбрасывает бит ODR, 0 — без действия.

GPIOx_ASCR — подключение выводов к аналоговым входам АЦП

Смещение 0x2C, 32 бит, после сброса 0x0000 0000; регистр есть только у STM32L471, STM32L475, STM32L476, STM32L485, STM32L486. В коде: GPIOA->ASCR.

31302928272625242322212019181716
—
1514131211109876543210
ASC15ASC14ASC13ASC12ASC11ASC10ASC9ASC8ASC7ASC6ASC5ASC4ASC3ASC2ASC1ASC0
  • ASC0–ASC15 (по биту на каждый y, положение — на карте битов) — Подключение вывода y к аналоговому входу АЦП (вместе с MODE = 11).
  • ASC11 (бит 11) — Подключение вывода 11 к аналоговому входу АЦП (вместе с MODE = 11).

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

Почему АЦП STM32L476 показывает ноль на канале с вывода?

У STM32L47x/L48x кроме MODER = 11 нужно замкнуть аналоговый ключ: GPIOx->ASCR |= (1 << n). Без этого вывод не подключён к входу АЦП.

Почему вход читается нулём сразу после сброса?

Вывод в аналоговом режиме, триггер Шмитта выключен. Переведите его во вход: GPIOx->MODER &= ~(3UL << (2 * n)).

Источники

  1. STMicroelectronics. RM0351: Reference manual (Rev 11) — раздел 8.5: описание регистров, назначение полей и значения после сброса
  2. 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

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