STM32.GPIO Описание регистров

Для конфигурирования портов и работы с ними на каждый порт выделено по семь регистров:

  • GPIOx_CRL, GPIOx_CRH – задают режимы работы каждого бита порта;
  • GPIOx_IDR – регистр, позволяющий читать физическое состояние выводов порта x;
  • GPIOx_ODR — позволяет записать данные непосредственно в порт;
  • GPIOx_BSRR — для сброса и установки отдельных битов порта;
  • GPIOx_BRR   — для сброса битов порта;
  • GPIOx_LCKR — для блокировки выбранной конфигурации

где х — это имя порта (A,B,C,D,E,F или G).

 

Рассмотрим подробнее особенности каждого регистра.

GPIOx_CRL, GPIOx_CRH  - 32-х разрядные регистры, задающие режим работы каждого вывода порта.

Структура   GPIOx_CRL следующая:

И, соответственно, регистр GPIOx_CRH имеет следующую структуру:

Проанализируем их структуру.

Для того, чтобы задать режим одного вывода, необходимо четыре разряда (немного дальше мы их рассмотрим подробнее)

Так как порт имеет 16 разрядов, для конфигурации порта необходимо 64 разряда (16 х 4)

Регистры микроконтроллера имею разрядность равную 32, поэтому для всего порта необходимо два конфигурационных регистра   -  GPIOx_CRL  и GPIOx_CRH.

Регистр   GPIOx_CRL   конфигурирует первую половину выводов порта (разряды 0…7).

Регистр   GPIOx_CRH   конфигурирует вторую половину выводов порта (разряды 8…15).

Какова структура этих регистров?

Для конфигурирования одного вывода порта необходимо 4 разряда.

Назначение этих разрядов следующее:

  • биты 0,1 (MODE) определяют направление вывода и скорость обмена в режиме выхода;
  • биты 2,3 (CNF) задают конфигурацию выходного каскада.

Разряды MODE могут иметь следующее значение:

  • MODE [1,0]=00 — вывод сконфигурирован как вход;
  • MODE [1,0]=01 — вывод сконфигурирован как выход, максимальная скорость переключения — 10 MHz;
  • MODE [1,0]=10 — вывод сконфигурирован как выход, максимальная скорость переключения — 2 MHz;
  • MODE [1,0]=11 — вывод сконфигурирован как выход, максимальная скорость переключения — 50 MHz;

Если вывод сконфигурирован как вход, назначение разрядов CNF следующее:

  • CNF[1,0]=00 — аналоговый вход;
  • CNF[1,0]=01 — цифровой вход в третьем состоянии;
  • CNF[1,0]=10 — цифровой вход с подтягивающим резистором ;
  • CNF[1,0]=11 — зарезервировано

Если вывод сконфигурирован как выход, назначение разрядов CNF следующее:

  •  CNF[1,0]=00 — двухтактный выход общего назначения;
  •  CNF[1,0]=01 — выход общего назначения с открытым стоком;
  •  CNF[1,0]=10 — двухтактный выход с альтернативной функцией;
  •  CNF[1,0]=11 — выход с альтернативной функцией с открытым стоком

Следующим идет регистр  GPIOx_IDR.

Он предназначен для чтения физического состояния порта. Этот регистр имеет 16 разрядов,

каждый из которых соответствует выводу порта.

Прочитав этот регистр, можем проанализировать состояние любого вывода порта.

Регистр GPIOx_ODR  предназначен для непосредственной записи в порт. Он также 16-ти разрядный.

Следующий регистр    -  GPIOx_BSRR. Он предназначен для атомарного управления выходами.

Он имеет следующую структуру:

Как видно, этот регистр 32-х разрядный. Первые 16 разрядов используются для установки выходов порта, а

старшие 16 разрядов — для сброса, т.е. можно манипулировать отдельными разрядами порта.

Как им пользоваться?

Если записать «1″ в разряд BS0, вывод №0 порта будет установлен.

Если записать «1″ в разряд BR0, вывод №0 порта будет сброшен.

А что будет, ели одновременно записывать единицу в  BS0 и  BR0 ?

Разработчики учли это — приоритет имеет BSx.

А зачем вообще нужен этот регистр?  Почему нельзя ограничиться регистром  GPIOx_ODR ?

Конечно, он обеспечивает запись данных в порт.

Но представим такую ситуацию: необходимо изменить не весь порт, а только один его разряд.

Для этого необходимо прочитать  GPIOx_ODR, модифицировать его, и записать обратно.

На это уйдет три команды, а это и память контроллера и (что очень важно) время.

Поэтому атомарный доступ очень нужен.

Регистр GPIOx_BRR  похож на предыдущий — он для работы с отдельными битами порта.

Но он 16-ти разрядный, и предназначен только для сброса выводов порта.

Чесно говоря, я не до конца понимаю зачем он нужен. Ведь сбросить можно с помощью   регистра GPIOx_BSRR.

 

Ну и наконец регистр GPIOx_LCKR —  блокировка выбранной конфигурации.

Выглядит он следующим образом:

Чтобы защитить настройку выбранного разряда порта,  необходимо установить соответствующий бит LCK.

Сразу после этого  выполнить  последовательную запись в разряд LCKK  1 — 0 — 1.

На этом обзор регистров закончен. Следующая статья посвящена конфигурированию портов и примерам работы с ними.

О первоисточнике можете узнать тут