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

Регистры GPIO STM32F1

Регистры портов GPIOA…GPIOG STM32F1: режим и скорость каждого вывода в CRL и CRH, чтение входов, запись выходов, атомарная установка и сброс через BSRR и BRR, блокировка настроек.

У STM32F1 каждый порт — до 16 выводов, и у всех портов одинаковый набор из семи 32-битных регистров. Настройка вывода занимает 4 бита: два бита MODE задают направление и наибольшую скорость выхода, два бита CNF — тип входа или выхода. Выводы 0–7 настраиваются в регистре CRL, выводы 8–15 — в CRH.

После сброса все регистры настройки равны 0x4444 4444: каждый вывод — плавающий вход (MODE = 00, CNF = 01). Прежде чем обращаться к порту, нужно включить его тактирование битом IOPxEN в регистре RCC_APB2ENR, иначе запись в регистры порта не действует.

Читать вход — регистр IDR, менять выход — ODR. Для изменения отдельных выводов без чтения-изменения-записи служат BSRR (установка младшими 16 битами, сброс старшими) и BRR (только сброс): запись единицы действует на свой вывод, нули не меняют ничего. Регистры портов доступны только 32-битными словами (RM0008, раздел 9.2).

ЭкземплярБазовый адресЕсть у
GPIOA0x4001 0800всех
GPIOB0x4001 0C00всех
GPIOC0x4001 1000всех
GPIOD0x4001 1400всех
GPIOE0x4001 1800STM32F101xB/xE/xG, STM32F103xB/xE/xG, STM32F105, STM32F107
GPIOF0x4001 1C00STM32F101xE/xG, STM32F103xE/xG
GPIOG0x4001 2000STM32F101xE/xG, STM32F103xE/xG

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

РегистрСмещениеНазначениеПосле сброса
GPIOx_CRL0x00Настройка выводов 0–70x4444 4444
GPIOx_CRH0x04Настройка выводов 8–150x4444 4444
GPIOx_IDR0x08Входные данные порта0x0000 XXXX
GPIOx_ODR0x0CВыходные данные порта0x0000 0000
GPIOx_BSRR0x10Атомарная установка и сброс выходов0x0000 0000
GPIOx_BRR0x14Атомарный сброс выходов0x0000 0000
GPIOx_LCKR0x18Блокировка настроек выводов0x0000 0000

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

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

Значение: 0x44444444

0100 0100 0100 0100 0100 0100 0100 0100

GPIOA->CRL = 0x44444444;

GPIOx_CRL — настройка выводов 0–7

Смещение 0x00, 32 бит, после сброса 0x4444 4444. В коде: GPIOA->CRL.

31302928272625242322212019181716
CNF7MODE7CNF6MODE6CNF5MODE5CNF4MODE4
1514131211109876543210
CNF3MODE3CNF2MODE2CNF1MODE1CNF0MODE0
  • CNF0–CNF7 (по 2 бита на каждый y, положение — на карте битов) — Конфигурация вывода y: тип входа или выхода.
    CNFyЗначение
    00Вход: аналоговый режим. Выход: двухтактный
    01Вход: плавающий (после сброса). Выход: открытый сток
    10Вход: с подтяжкой, направление — бит ODR. Выход: альтернативная функция, двухтактный
    11Вход: зарезервировано. Выход: альтернативная функция, открытый сток
  • MODE0–MODE7 (по 2 бита на каждый y, положение — на карте битов) — Режим вывода y: вход или выход и наибольшая скорость выхода.
    MODEyЗначение
    00Вход (после сброса)
    01Выход, до 10 МГц
    10Выход, до 2 МГц
    11Выход, до 50 МГц

GPIOx_CRH — настройка выводов 8–15

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

31302928272625242322212019181716
CNF15MODE15CNF14MODE14CNF13MODE13CNF12MODE12
1514131211109876543210
CNF11MODE11CNF10MODE10CNF9MODE9CNF8MODE8
  • CNF8–CNF15 (по 2 бита на каждый y, положение — на карте битов) — Конфигурация вывода y: тип входа или выхода.
    CNFyЗначение
    00Вход: аналоговый режим. Выход: двухтактный
    01Вход: плавающий (после сброса). Выход: открытый сток
    10Вход: с подтяжкой, направление — бит ODR. Выход: альтернативная функция, двухтактный
    11Вход: зарезервировано. Выход: альтернативная функция, открытый сток
  • MODE8–MODE15 (по 2 бита на каждый y, положение — на карте битов) — Режим вывода y: вход или выход и наибольшая скорость выхода.
    MODEyЗначение
    00Вход (после сброса)
    01Выход, до 10 МГц
    10Выход, до 2 МГц
    11Выход, до 50 МГц

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

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

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

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

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

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

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

Смещение 0x10, 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_BRR — атомарный сброс выходов

Смещение 0x14, 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_LCKR — блокировка настроек выводов

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

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

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

Как настроить вывод PC13 на выход в STM32F103?

Включите тактирование порта C (RCC->APB2ENR |= RCC_APB2ENR_IOPCEN), затем в регистре GPIOC->CRH очистите четыре бита вывода 13 и запишите MODE13 = 10 (выход до 2 МГц) и CNF13 = 00 (двухтактный выход): GPIOC->CRH = (GPIOC->CRH & ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13)) | GPIO_CRH_MODE13_1.

Чем BSRR отличается от ODR?

Запись в ODR меняет все 16 выходов сразу, поэтому для изменения одного вывода её делают через чтение-изменение-запись, и прерывание между чтением и записью может испортить соседние выводы. В BSRR единица в младшей половине устанавливает свой вывод, в старшей — сбрасывает, нули ничего не меняют, поэтому изменение атомарно. Если для одного вывода записаны оба бита, по RM0008 приоритет у установки.

Как включить подтяжку вверх у входа STM32F1?

Отдельного регистра подтяжки у STM32F1 нет. Вывод настраивают входом с подтяжкой (MODE = 00, CNF = 10), а направление подтяжки задаёт бит регистра ODR: 1 — подтяжка к питанию, 0 — к земле.

Источники

  1. STMicroelectronics. RM0008: Reference manual (Rev 21) — раздел 9.2: описание регистров, назначение полей и значения после сброса
  2. STMicroelectronics. cmsis-device-f1 v4.3.5: заголовки CMSIS stm32f101x6.h, stm32f101xb.h, stm32f101xe.h, stm32f101xg.h, stm32f102x6.h, stm32f102xb.h, stm32f103x6.h, stm32f103xb.h, stm32f103xe.h, stm32f103xg.h, stm32f105xc.h, stm32f107xc.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0

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

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

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