MyTetra Share
Делитесь знаниями!
Регистры настройки портов ввода-вывода GPIOA, GPIOB и т. д. в STM32
Время создания: 24.04.2022 00:57
Текстовые метки: stm32, ввод, вывод, регистр, порт, настройка, GPIOA, GPIOB, CMSIS, библиотека
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/1650751075dr9r2h238r/text.html на raw.github.com

Чтобы уметь правильно управлять портами ввода-вывода, надо изучить регистры контроллера, которые отвечают за настройку и управление текущим состоянием данной периферии. Часто embeddet-программисты не раз использовали биты настройки портов, но зачастую никогда полностью данные регистры не изучали. Поэтому нужно восполнить этот пробел.

Все нижеперечисленные сведения справедливы для младших моделей микроконтроллеров STM32, например для STM32F103C8T6 (BluePill).


Регистры управления портами ввода-вывода

Для каждого порта ввода-вывода, имеющегося в контроллере, существует по 7 регистров.

В библиотеке CMSIS эти регистры сгруппированы в такую структуру:


// General Purpose I/O

typedef struct

{

__IO uint32_t CRL;

__IO uint32_t CRH;

__IO uint32_t IDR;

__IO uint32_t ODR;

__IO uint32_t BSRR;

__IO uint32_t BRR;

__IO uint32_t LCKR;

} GPIO_TypeDef;



Особенности инициализации


Обычно, для настроек работы той или иной ножки микроконтроллера достаточно сбросить режим в ноль а потом настроить ножку на нужный режим, и выбранный пин будет работать так, как задумал программист. Однако есть несколько ножек, которым такой подход будет недостаточным, и они по-умолчанию заняты оборудованием, которое нужно отключить перед тем как настраивать их работу в своих целях.


Вот их список:


  • PA13 - JTMS / SWDIO
  • PA14 - JTCK / SWCLK
  • PA15 - JTDI PA15
  • PB3 - JTDO / TRACESWO
  • PB4 - NJTRST
  • PC14 - OSC32 In (практически невозможно переконфигурировать)
  • PC15 - OSC32 Out (практически невозможно переконфигурировать)


Если ножка не работает как ожидается, стоит свериться с этим списком или даташитом и доработать код. Возможно, поможет следующая статья: Как освободить ножки PB3, PB4, PA15 на STM32 BluePill через CMSIS.


Регистры CRL и CRH

Первые два регистра являются частями регистровой пары настройки ножек портов (Config Register Low и Config Register High).

Так как ножек у портов всего 16 и для каждой ножки создано 4 бита настройки, то получается, что нам требуется всего 64 бита, вот и получилось два 32-х битных регистра — младший и старший.

Первый регистр — младший, который отвечает за настройку ножек портов от 0 до 7

 

 

Второй регистр — старший, который отвечает за настройку ножек портов от 8 до 15

 

 

Теперь рассмотрим назначение битов битовых полей данных регистров для отдельно взятой ножки (далее x - это буква порта A, B, ... E, а y - номер ножки).


MODEy[1:0] (Port x mode bits): битовое поле настройки режима работы ножки y порта x.

  • 00: Режим входа (состояние после сброса)
  • 01: Режим выхода, максимальная скорость 10 MHz.
  • 10: Режим выхода, максимальная скорость 2 MHz.
  • 11: Режим выхода, максимальная скорость 50 MHz.

 

CNFy[1:0] (Port x configuration bits): битовое поле настройки ножки y порта x.

В случае использования ножки на вход:

  • 00: Аналоговый режим
  • 01: Плавающий вход (состояние после сброса) без подтяжки
  • 10: Вход с подтягиванием резистора или к плюсу или к общей шине (завит от состояния бита в регистре ODR)
  • 11: не используется

В случае использования ножки на выход:

  • 00: Обычный двухтактный выход
  • 01: Выход с открытым коллектором
  • 10: Альтернативная функция, двухтактный выход
  • 11: Альтернативная функция, выход с открытым коллектором.


Регистр IDR

Следующий регистр — регистр входных данных (Input Data Register)

 

 

Каждый бит данного регистра содержит состояние соответствующей ножки порта. Доступен только для чтения.


Регистр ODR

Следующий регистр — регистр выходных данных (Output Data Register)

 

 

В режиме выхода ножки порта с помощью сброса или установки бита, соответствующего данной ножке, мы меняем её состояние. Биты доступны как на чтение так и на запись. Поэтому мы также можем узнать текущее состояние ножки, настроенной на выход.

В режиме входа ножки мы устанавливаем направление подтяжки резистора

0 — резистор подтянут к общему проводу,

1 — резистор подтянут к шине питания.


Регистр BSRR

Следующий регистр — специальный 32-битный регистр атомарной установки или сброса ножек порта (Bit Set/Reset Register)

 

 

Данный регистр интересен тем, что мы можем сразу устанавливать или сбрасывать отдельные ножки порта в одну операцию. С помощью описанного ранее регистра ODR мы сначала его полностью читаем, если нам нужно не тронуть уровень других ножек, затем устанавливаем бит в считанном слове, а затем результат обратно записываем в регистр. Этот процесс занимает некоторое количество машинных тактов, число которых которые можно сократить. Сделать это можно с помощью регистров BSRR и BRR.

Старшая половина регистра BSRR (именуемая BR, Bit Reset) отвечает за сброс ножек, младшая (именуемая BS, Bit Set) — за установку. Ноль в записываемом значении регистра не имеет эффекта, поэтому уровни ножек, биты которых установлены в ноль не тронутся, а значения ножек, биты которых установлены в 1 либо сбросятся либо установятся в зависимости от того в каком полуслове они будут находиться.

Другими словами, битовое поле BRy (старшая половина регистра), где y — номер ножки порта, работает следующим образом

  • 0 — нет эффекта
  • 1 — сброс ножки порта в низкий уровень.

А битовое поле BSy, где также y — номер ножки порта, работает следующим образом

  • 0 — нет эффекта
  • 1 — установка на ножке порта высокого уровня.

Небольшая тонкость: бит установки BSx имеет приоритет над битом сброса BRx в BSRR, поэтому эти две строчки эквивалентны:


GPIOA->BSRR = GPIO_BSRR_BR0 | GPIO_BSRR_BS0;

GPIOA->BSRR = GPIO_BSRR_BS0;



Регистр BRR

Следующий регистр — регистр сброса ножек порта (Bit Reset Register)

 

 

Данный регистр работает аналогично предыдущему, но здесь только биты сброса ножек.


Регистр LCKR

Следующий регистр — регистр защиты конфигурации порта (Lock Register)

 

 

Биты данного регистра предназначены для защиты ножек портов от изменения. Если мы хотим защитить какие-то ножки от записи, то мы записываем в соответствующие им биты данного регистра, находящиеся в младшем его полуслове, единицы, остальные биты оставляем в нулях. Затем при помощи специальной комбинации над битом 16 — LCKK мы производим применение блокировки. Данная последовательность следующая: записываем в данный бит 1, затем 0, затем опять 1, затем данный бит считываем дважды, первый раз должен считаться 1, второй — 0. Если всё так, то значит мы защитили нужные ножки.


Важное примечание

Стоит сказать, что у микроконтроллеров высших моделей (F4, F7 и т.д.) регистры для настройки портов другие. Например, при работе с CMSIS с контроллером STM32F407VG, установленный на плате Discovery 4, то там регистры будут другие. Надо всегда помнить, что переносимость кода на CMSIS на другие контроллеры не всегда имеет место.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования