Фильтр по тематике

Современные 32-разрядные ARM-микроконтроллеры серии STM32: порты общего назначения GPIO

В статье приведено описание портов общего назначения GPIO, 32-разрядных ARM-микроконтроллеров серии STM32 компании STMicroelectronics. Рассмотрены архитектура портов, состав и назначение регистров конфигурирования, а также примеры программ инициализации.

01.09.2013 238 0
Современные 32-разрядные ARM-микроконтроллеры серии STM32: порты общего назначения GPIO

Введение

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

Порты ввода-вывода имеются практически в любом микроконтроллере независимо от его архитектуры. Не являются исключением и микроконтроллеры STM32 компании STMicroelectronics [1], имеющие в зависимости от модели до семи портов.

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

Все порты ввода-вывода STM32 являются 16-разрядными и называются GPIO, от General Purpose Input/Output (входы/выходы общего назначения). Порты обозначаются буквами латинского алфавита от A до G , т.е. имеют названия PORTA, PORTB, PORTC, PORTD, PORTE, PORTF и PORTG.

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

Настройка порта на вывод требует задания частоты тактирования, определяющей его максимальное быстродействие и тип выхода. Максимальное быстродействие может принимать значения: 2, 10 или 50 МГц.

Ниже перечислены возможные типы выхода:

  • двухтактный выход;
  • выход с открытым стоком;
  • двухтактный выход с альтернативной функцией;
  • выход с открытым стоком и альтернативной функцией.

Последние два режима применяются для выводов, которые используют какой-либо функциональный блок периферийного устройства, например SPI, I2C, USART, DAC и т.п. Интересной и полезной особенностью портов является возможность чтения состояния порта, настроенного как выход с открытым стоком. Это позволяет программе осуществлять чтение данных с двунаправленной линии связи без переконфигурирования порта. Такая операция часто востребована для организации программного интерфейса I2C и 1-Wire.


На рисунке приведена структурная схема одного канала порта ввода-вывода, иллюстрирующая вышеизложенное описание. С помощью транзисторов P-MOS и N-MOS выход порта может принимать значения высокого потенциала в качестве логической единицы или нулевого потенциала в качестве логического нуля. Если порт сконфигурирован как выход с открытым стоком, то для управления состоянием линии используется только нижний транзистор N-MOS, а верхний транзистор P-MOS находится в отключенном состоянии.

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

Важными элементами порта являются защитные диоды, функция которых – защищать входы контроллера от перенапряжений. Поскольку микроконтроллер питается от номинального напряжения 3,3 В, на его входы подаются сигналы с уровнями, не превышающими это напряжение. Однако некоторые входы микроконтроллера можно подключать к сигналам с 5 В логикой. Такие входы называются толерантными и имеют буквенное обозначение FT. Для подключения сигнала с 5 В логикой к нетолерантному входу необходимо использовать согласующее устройство, которое в простейшем случае представляет собой резистор, имеющий сопротивление 1 кОм.

Отличительной особенностью портов микроконтроллера STM32 является возможность программной блокировки настройки порта. Такая блокировка позволяет запретить изменение конфигурации порта программным образом и может быть снята только после аппаратного сброса. Данная блокировка служит в качестве дополнительной защиты каналов портов и подключенных к нему устройств, предотвращая выход из строя при сбоях от помех. В результате такого сбоя может произойти самопроизвольное изменение конфигурации вывода, при котором порт настроится на выход и вступит в конфликт с подключенным к нему выходом внешнего устройства. Для исключения подобных случаев и используется программная блокировка.

Регистры портов GPIO

Для конфигурирования портов и работы с ними микроконтроллер имеет по семь регистров для каждого порта. Эти регистры имеют следующие названия и назначение:

  • CRL и CRH – регистры, задающие режим работы младшей и старшей половины порта;
  • ODR – регистр для записи данных непосредственно в порт;
  • IDR – регистр для чтения физического состояния выводов порта;
  • BSRR – регистр установки и сброса разрядов порта;
  • BRR – регистр сброса разрядов порта;
  • LCKR – регистр для блокировки установленной конфигурации.

Рассмотрим подробнее каждый из этих регистров.

Регистры CRL и CRH представляют собой 32-разрядные регистры, задающие режим работы каждого вывода порта. Назначение всех разрядов для регистров CRL и CRH представлено в таблице 1 и таблице 2 соответственно.



Как видно из таблиц, для каждого из каналов порта имеется два двухразрядных поля CNFx[1:0] и MODEx[1:0]. Поле CNF определяет тип работы линии, а поле MODE – направление обмена по линии. Все биты этих полей доступны для чтения и записи.

Поле MODE[1:0] может принимать следующие значения:

  • 00 – канал порта работает на ввод (такое состояние устанавливается после сброса);
  • 01 – канал порта работает на выход с максимальной частотой переключения 10 МГц;
  • 10 – канал порта работает на выход с максимальной частотой переключения 20 МГц;
  • 11 – канал порта работает на выход с максимальной частотой переключения 50 МГц.

При работе на вход, когда MODE[1:0]=0, поле CNF[1:0] устанавливает следующие состояния каналов порта:

  • 00 – аналоговый вход;
  • 01 – дискретный вход в третьем состоянии (такое состояние устанавливается после сброса);
  • 10 – дискретный вход с подтягивающим резистором к питанию или общей цепи в зависимости от состояния соответствующего разряда регистра BSRR;
  • 11 – зарезервировано для будущих применений.

При работе канала порта на выход, когда поле MODE[1:0] отлично от 0, поле CNF[1:0] позволяет устанавливать следующие состояния каналов порта:

  • 00 – цифровой симметричный выход;
  • 01 – цифровой выход с открытым стоком;
  • 10 – цифровой симметричный выход с альтернативной функцией;
  • 11 – цифровой выход с альтернативной функцией и открытым стоком.

Регистр ODR представляют собой 32-разрядный регистр, предназначенный для записи данных непосредственно в порт. Однако в этом регистре используются только младшие 16 бит. Старшие биты, с 16-го по 31-й зарезервированы. Назначение разрядов регистра ODR представлено в таблице 3.


При записи в регистр ODR какого-либо значения, оно устанавливается на выходах соответствующего порта. Биты этого регистра доступны как для записи, так и для чтения.

Регистр IDR также является 32-разрядным регистром и служит для чтения физического состояния каналов порта, настроенных на вход. Аналогично регистру вывода ODR, в регистре ввода IDR используется только 16 младших бит из 32. Назначение разрядов регистра IDR представлено в таблице 4.


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

32-разрядный регистр BSRR предназначен для сброса и установки отдельных каналов порта, настроенных на вывод. Назначение разрядов регистра BSRR представлено в таблице 5.


Данный регистр позволяет менять состояние конкретных каналов порта без изменения остальных каналов. Запись единицы в один из старших разрядов этого регистра сбрасывает соответствующий выход канала порта, а запись единицы в младшие разряды устанавливает высокий уровень сигнала на соответствующем канале порта.

Запись в регистр производится в формате 32-разрядного слова, при этом нулевые биты никакого действия не оказывают. Все разряды данного регистра доступны только для записи. Для исключения неоднозначности при одновременной записи единиц в разряды BS и BR приоритетными будут разряды BS, т.е. выходы каналов установятся в высокий уровень.

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

Кроме того, с помощью этого регистра можно задать, какой из подтягивающих резисторов будет использоваться в случае настройки канала порта на ввод. Единичное состояние соответствующего разряда регистра подключит вход канала через подтягивающий резистор к плюсовому источнику питания, а нулевое состояние – к общей цепи.

Регистр BRR представляет собой 32-разрядный регистр, предназначенный лишь для сброса в нулевое состояние каналов порта, настроенных на вывод. Аналогично регистру вывода ODR, в регистре ввода IDR используется только 16 младших бит из 32. Назначение разрядов регистра IDR представлено в таблице 6.


Так же как и для регистра BSRR, запись в регистр BRR нулевых бит никакого действия не оказывает. Все разряды данного регистра доступны только для записи.

Данный регистр, в отличие от регистра BSRR, позволяет осуществлять сброс каналов порта без смещения на 16 разрядов. Во многих случаях это облегчает труд программистов.

Наконец, последний регистр LCKR, представляющий собой 32-разрядный регистр, предназначен для блокировки установленной конфигурации. В регистре блокировки LCKR используется 17 младших разрядов из 32, остальные разряды зарезервированы. Назначение всех разрядов регистра LCKR представлено в таблице 7.


Разряды от 0 до 15-го регистра LCKR определяют каналы порта, а разряд 16 с именем LCKK предназначен для осуществления самой операции блокировки конфигурации. Все задействованные биты данного регистра доступны для записи и чтения.

Процедура блокировки осуществляется следующим образом:

  • установить бит LCK, соответствующий блокируемому каналу, в единичное состояние;
  • выполнить последовательно запись в разряд LCKK значения 1, затем 0 и снова 1;
  • прочесть регистр LCKR;
  • повторно прочесть регистр LCKR.

Все операции должны быть выполнены последовательно друг за другом. После чего запись в конфигурационные регистры портов CRL и CRH будет заблокирована. Разблокировать её можно будет только аппаратным сбросом.

Более подробное описание назначения регистров GPIO можно найти в источнике [2].

Программная инициализация

Перед началом работы любого порта GPIO STM32 его необходимо настроить. Для этого требуется разрешить тактирование порта, задать его максимальную тактовую частоту и установить режим работы. Включать тактирование порта необходимо, поскольку после сброса оно автоматически отключается для того, чтобы снизить потребление тока и предотвратить нагрев микроконтроллера. Кстати сказать, тактирование изначально отключено не только для всех портов, но и для многих других функциональных блоков.

Ниже приведен пример настройки порта GPIOA на языке Си в режим цифрового симметричного выхода:

// Разрешить тактирование порта GPIOA
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// Конфигурирование канала 0
порта GPIOA на вывод
GPIOA->CRL &= ~GPIO_CRL_MODE0; // Очистить разряды MODE
GPIOA->CRL |= GPIO_CRL_MODE0_0; // Задать частоту 10 МГц
GPIOA->CRL &= ~GPIO_CRL_CNF0; // Обнулить разряды CNF, установив режим симметричного выхода

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

GPIOA->CRL |= GPIO_CRL_CNF0_0; // Установить режим выхода с открытым стоком

Поскольку микроконтроллеры ARM Cortex содержат большое количество функциональных блоков и, соответственно, регистров для их инициализации, разработчиками программного обеспечения были созданы специальные структуры данных и библиотеки, предназначенные для облегчения труда программистов. К их числу относится библиотека CMSIS (Cortex Microcontroller Software Interface Standard), которая представляет собой единый стандарт описаний ресурсов микроконтроллеров ARM Cortex.

Программы для ARM-микроконтроллеров, написанные на языке программирования Си, активно используют разнообразные структуры данных и определений из этих библиотек. Это позволяет легко переносить программы, написанные для одного типа микроконтроллера, на другой, поскольку вместо конкретных значений адресов регистров и числовых констант для инициализации используются символьные имена и указатели на них. Такие имена заранее определены в библиотечных файлах для конкретных моделей АРМ-микроконтроллеров и эквивалентны конкретным числовым значениям.

В приведённом выше примере как раз используются такие элементы. Например, запись RCC->APB2ENR представляет собой обращение к регистру APB2ENR из группы регистров тактирования и контроля RCC, а RCC_APB2ENR_IOPAEN является символьной записью значения управляющего бита порта PORTA в регистре APB2ENR. В числовом виде RCC_APB2ENR_IOPAEN выглядит как 0x00000004.

Символьные имена для всех портов STM32, включая приведённые выше, содержатся в файле stm32f10x.h среды разработки Keil.

Перед установкой конфигурации порта поля регистра для нужного нам канала очищаются с помощью обнуления всех разрядов этих полей. Для установки конфигурации порта используется оператор «|» логической функции «ИЛИ», который позволяет установить нужные разряды в поле регистра или оператор «&» логической функции «И» для обнуления конкретных разрядов регистра.

При необходимости одновременной настройки нескольких каналов порта можно использовать объединение нескольких значений с помощью оператора «ИЛИ». Например, задать частоту 10 МГц для PORTA.0 и PORTA.1 можно так:

GPIOA->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE1_0

После выполнения всех этих действий настройку порта можно считать законченной.

Описанную выше настройку также можно произвести с помощью следующих двух строк:

RCC->APB2ENR |= 0x00000004; // Разрешить тактирование порта GPIOA
GPIOA->CRL = 0x00000001; // PORTA.0 в режим симметричного выхода с частотой 10 МГц

Однако такая запись труднее поддаётся анализу и в ней легче совершить ошибку.

Запись данных в регистр любого порта производится классическим способом, с помощью операции присвоения:

GPIOA->ODR=0x0001; // Записать в PORTA значение 0x0001

Для установки или сброса нескольких каналов порта можно использовать регистр BSRR, например, так:

GPIOA->BSRR=0x00020001; // Установить канал 0 и сбросить канал 1 порта А

Аналогичную процедуру можно выполнить с помощью предопределённых констант:

GPIOA->BSRR=GPIO_BSRR_BS0 | GPIO_BSRR_BR1;

Для настройки этого же порта на аналоговый вход применяются следующие операторы:

// Конфигурирование канала 0 порта GPIOA как аналоговый вход
GPIOA->CRL &= ~GPIO_CRL_MODE0; // Очистить разряды MODE регистра CRL
GPIOA->CRL &= ~GPIO_CRL_CNF0; // Очистить разряды CNF регистра CRL

Чтобы настроить порт на дискретный вход, следует добавить оператор:

GPIOA->CRL |= GPIO_CRL_CNF0_0; // Дискретный вход без подтяжки к шине питания

Наконец, чтобы подтянуть этот вход к шине питания, используются операторы:

GPIOA->BSRR = GPIO_BSRR_BS0; // Подтянуть вход к плюсовому потенциалу

или

GPIOA->BSRR = GPIO_BSRR_BR0; // Подтянуть вход к нулевому потенциалу

Чтение данных порта или состояния конкретного канала производится с помощью регистра IDR. Вот несколько примеров чтения данных:

x= GPIOA->IDR; // Присвоить переменной x данные из порта А
if (GPIOA->IDR & GPIO_IDR_IDR0) x=1; // Если канал 0 порта А
не сброшен, то x=1

С помощью таких простых операторов можно построить любую сложную программу, которая сможет анализировать состояние внешних устройств и управлять ими.

Существуют и другие способы обращения к регистрам STM32, например с применением библиотек отладочного комплекта STM32VLDISCOVERY.

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

Литература

  1. https://www.st.com
  2. http://www.st.com/web/en/resource/technical/document/reference_manual/CD00246267.pdf

© СТА-ПРЕСС

Если вам понравился материал, кликните значок — вы поможете нам узнать, каким статьям и новостям следует отдавать предпочтение. Если вы хотите обсудить материал —не стесняйтесь оставлять свои комментарии : возможно, они будут полезны другим нашим читателям!

01.09.2013 238 0
Комментарии
Рекомендуем
Эффективное количество бит цифровых осциллографов: влияние на результаты измерений и экспериментальное определение для приборов VESNA

Эффективное количество бит цифровых осциллографов: влияние на результаты измерений и экспериментальное определение для приборов VESNA

В статье рассмотрены особенности измерения эффективного числа бит (ENOB) для цифровых осциллографов. Представлен анализ ENOB как характеристики аналого-цифрового преобразования, отмечены ключевые причины искажений сигналов при аналого-цифровом преобразовании. Проанализированы особенности определения эффективного количества бит цифровых осциллографов на основе прямых измерений, обоснован наиболее простой способ определения ENOB на базе сопоставления среднеквадратичного напряжения на выходе генератора синусоидального сигнала и аналогичного значения, измеренного осциллографом. Для осциллографов серий OVA3, OVS3, OVU2 нового для российского рынка бренда VESNA проведены экспериментальные оценки эффективного количества бит.
05.06.2026 СЭ №5/2026 87 0
Параллельное соединение однотипных модулей электропитания для резервирования с активным принудительным распределением тока нагрузки

Параллельное соединение однотипных модулей электропитания для резервирования с активным принудительным распределением тока нагрузки

В статье кратко рассмотрены основные проблемы, возникающие при параллельном соединении модулей электропитания для увеличения мощности и резервирования в современных распределённых системах электропитания для сложных радиотехнических, компьютеризированных и телекоммуникационных комплексов. Рассмотрен метод равномерного распределения тока нагрузки и синхронизации высокой частоты преобразования включённых параллельно однотипных модулей DC/DC-преобразователей напряжения Brick (2-го поколения) компании Wibbow c применением двунаправленного цифрового интерфейса между модулями, обеспечивающий несложное надёжное параллельное соединение для повышения выходной мощности и резервирования.
04.06.2026 СЭ №5/2026 140 0
Технология Press Fit – надёжные непаяные соединения: применение в высокоскоростном соединителе  СКП445 (российский аналог MULTIGIG RT2)

Технология Press Fit – надёжные непаяные соединения: применение в высокоскоростном соединителе СКП445 (российский аналог MULTIGIG RT2)

В работе выполнено комплексное исследование технологии механической запрессовки контактов (Press Fit), рассматриваемой в качестве альтернативы классическим методам пайки. Проанализированы физические механизмы образования газонепроницаемого сопряжения, способы предотвращения фреттинг-износа, специфические требования к металлизации посадочных мест печатных плат. На основании результатов сертификационных испытаний согласно стандартам IEC 60352-5 и IEC 60068-2 выполнено сопоставление эксплуатационной надёжности соединений Press Fit и паяных аналогов при воздействии экстремальных климатических и механических факторов. Отдельное внимание уделено геометрии комплаентных зон (область контакта) и свойствам гальванических покрытий. Практическая значимость работы продемонстрирована на примере внедрения технологии в высокоскоростной соединитель СКП445 – отечественную разработку, обеспечивающую передачу данных на скоростях до 10 Гбит/с.
03.06.2026 СЭ №5/2026 134 0
Проектирование и оптимизация резонансного преобразователя для систем беспроводной передачи энергии 

Проектирование и оптимизация резонансного преобразователя для систем беспроводной передачи энергии 

Электрические транспортные средства, будь то воздушные или наземные, требуют источник электрической энергии. Одним из возможных источников питания является перезаряжаемая аккумуляторная батарея. Зарядка бортовой батареи транспортного средства осуществляется либо посредством зарядного кабеля, либо с использованием технологии беспроводной передачи энергии (Wireless Power Transfer, WPT, БПЭ). Базовая технология БПЭ – магнитно-связанный резонанс. Резонансная частота и передаваемая мощность зависят от взаимного расположения передающей и приёмной обмоток. В данной статье рассматривается резонансный преобразователь мощности для системы беспроводной зарядки малых беспилотных летательных аппаратов (БПЛА). Анализируются вопросы изменения передаваемой мощности и резонансных частот в зависимости от относительного положения передающей и приёмной катушек. Статья была впервые представлена на конференции PCIM Asia 2024 [1]. Текст был переведён и дополнен авторами для журнала «Современная электроника».
02.06.2026 СЭ №5/2026 421 0

Реклама. ООО «Формика Ивент»  ИНН 7709889632  erid = 2SDnjdV94YS
Реклама. ООО «Формика Ивент»  ИНН 7709889632  erid = 2SDnjdsNsmc
  Подписывайтесь на наш канал в Telegram и читайте новости раньше всех! Подписаться