STM32 Описание работы GPIO
В общем, всякий раз, когда мы изучаем новый язык программирования, мы привыкли сначала писать программу “Hello World”. Аналогично в микроконтроллере мы пробуем программу мигания светодиодом. Чтобы мигать светодиодом, нам нужно получить доступ к GPIO. Если вы программист, вы можете просто записать “1” на вывод GPIO, чтобы сделать его высоким, и написать “0“, чтобы сделать вывод gpio низким. Но знаете ли вы, как этот gpio работает внутри? и типы gpio?
Да, в этой статье мы объясним все эти концепции. Как инженер по встроенному ПО, вы должны освоить эти концепции, поскольку большая часть вашей работы будет связана с написанием исходного кода или кода драйвера, а как разработчик встроенных приложений вы должны знать эти концепции. Давайте начнем.
Что такое GPIO
GPIO или универсальный ввод-вывод – один из наиболее часто встречающихся терминов, с которыми вы, возможно, сталкивались.
GPIO – это сигнальный вывод на интегральной схеме или плате, который может использоваться для выполнения функций цифрового ввода или вывода. Поведение GPIO (ввод или вывод) контролируется во время выполнения прикладным программным обеспечением / встроенным программным обеспечением путем настройки нескольких регистров.
Типичные приложения включают считывание / запись значений с / на аналоговые или цифровые датчики / устройства, управление светодиодом, управление часами для связи I2C, генерацию триггеров для внешних компонентов, выдачу прерываний и т.д.
Все микроконтроллеры будут иметь несколько регистров для управления функциями gpio. Имена этих регистров будут различаться в зависимости от микроконтроллера. В этой статье мы не собираемся сосредотачиваться на регистрах конкретного микроконтроллера. Концепции, которые объясняются в этой статье, являются общими и могут быть применены к любому имеющемуся у вас микроконтроллеру.
Что такое – порт GPIO?
В микроконтроллере будет много выводов GPIO. Эти выводы сгруппированы по какому-либо имени. Таким образом, эта одна группа называется GPIO port. Проще говоря, коллекция GPIO называется GPIO port. Например, если взять микроконтроллер STM32F401VE , он имеет 5 портов GPIO (ПОРТ A, ПОРТ B, ПОРТ C, ПОРТ D, ПОРТ E). Каждый порт имеет 16 выводов GPIO. Подобно этому, другие микроконтроллеры будут иметь несколько портов GPIO.
Режимы GPIO
Как правило, GPIO может использоваться несколькими способами.
- Режим вывода GPIO
- Режим ввода GPIO
- Аналоговый режим
- Альтернативный функциональный режим
Режимы ввода и вывода будут классифицированы дополнительно. Но прежде чем рассматривать это, мы увидим базовый GPIO, работающий в режиме ввода и вывода.
Давайте узнаем, как работает режим ввода и вывода на уровне схемы. На приведенном ниже рисунке показана простая реализация вывода GPIO в микроконтроллере.
Каждый вывод GPIO состоит из двух буферов – входного буфера и выходного буфера, а также одной строки включения. Когда строка включения равна 0, выходной буфер активируется, а входной буфер деактивируется. Когда строка включения равна 1, выходной буфер деактивируется, а входной буфер активируется.
GPIO – в качестве выхода
Сначала мы увидим, как GPIO работает в режиме вывода. Если вы зададите для строки enable значение 0, это активирует выходной буфер и деактивирует входной буфер.
Выходной буфер подключен к двум КМОП-транзисторам. В технологии CMOS используются транзисторы как N-типа (NMOS), так и P-типа (PMOS), и она подключается, как показано на приведенной ниже схеме.
Высокий уровень на GPIO
На приведенном выше изображении T1 – это PMOS-транзистор, а T2 – NMOS-транзистор. Когда мы записываем 1 из нашего кода, первый инвертор принимает его за 0. Таким образом, будет активирован PMOS-транзистор (T1), а NMOS-транзистор (T2) будет деактивирован. Наконец, T1 возьмет Vcc и передаст его на вывод GPIO. Если мы подключим светодиод сейчас, он будет гореть. Приведенная ниже диаграмма объясняет концепцию, о которой мы сейчас говорили
Низкий уровень на GPIO
Когда мы записываем 0 из нашего кода, первый инвертор принимает его за 1. Таким образом, PMOS транзистор (T1) будет деактивирован, а NMOS транзистор (T2) будет активирован. Наконец, T2 возьмет Gnd и передаст его на вывод GPIO. Если мы подключим светодиод сейчас, он будет выключен. Приведенная ниже диаграмма объясняет концепцию, о которой мы сейчас говорили.
GPIO в качестве входа
Входной буфер задействован в режиме ввода. Если вы зададите значение строки enable равным 1, это деактивирует выходной буфер и активирует входной буфер. Входной буфер GPIO также имеет CMOS, где NMOS и PMOS подключены так же, как выходной буфер. Но здесь вентиль подключен к выводу GPIO, а сток подключен к процессору. Вы можете проверить приведенную ниже схему.
Когда внешнее устройство записывает 1 на вывод GPIO, первый инвертор принимает его за 0. Таким образом, PMOS транзистор (T1) будет активирован, а NMOS транзистор (T2) будет деактивирован. Наконец, T1 возьмет Vcc и передаст его процессору. Итак, мы получим 1 в нашем программном обеспечении. Когда внешнее устройство записывает 0 на вывод GPIO, первый инвертор принимает его за 1. Таким образом, PMOS транзистор (T1) будет деактивирован, а NMOS транзистор (T2) будет активирован. Наконец, T2 возьмет Gnd и передаст его процессору. Итак, в нашем программном обеспечении мы получим 0. Приведенная ниже диаграмма поможет вам понять эту концепцию.
Мы поняли, как GPIO работает в микроконтроллере. Теперь пришло время ознакомиться с различными типами режимов ввода и вывода.
Режимы ввода GPIO
GPIO используется для считывания электрического сигнала на выводе, когда он сконфигурирован как вход. Как правило, входы GPIO в основном конфигурируются одним из трех способов:
- Высокоимпедансный или плавающий
- Подтягивание
- Выпадающий
Высокоимпедансный
Высокоимпедансное или HI-Z-состояние GPIO – это не что иное, как сохранение плавающего вывода при отсутствии подключения ни к высокому (Vcc), ни к низкому (GND) уровням напряжения.
Это означает, что вывод остается открытым. Таким образом, это состояние также называется плавающим состоянием. Его состояние не определено, если оно не управляется внешним образом на высокий или низкий уровень.
Всякий раз, когда микроконтроллер включен, контакты GPIO по умолчанию находятся в этом режиме ввода состояния с высоким импедансом. Вы хотите настроить вывод как плавающий, только если знаете, что он будет управляться извне. В противном случае рекомендуется держать неиспользуемые контакты либо в поднятом, либо в опущенном состоянии, чтобы избежать утечки тока. Поскольку сохранение вывода в плавающем состоянии может привести к току утечки, что может привести к высокому энергопотреблению, поскольку плавающий вывод очень чувствителен к возникновению шума и может привести к току утечки.
На изображение ниже, вывод GPIO не подключен ни к Vcc, ни к GND.
Подтягивание вывода к единице
Чтобы избежать этого высокого импеданса или плавающего состояния, вводится подтягивающий резистор. В этом типе внутренний подтягивающий резистор подключается к контакту. Таким образом, состояние будет высоким, если не будет использован внешний понижающий резистор. В микроконтроллере будет определенный регистр для включения этого понижающего резистора. Вы можете ознакомиться со спецификацией вашего микроконтроллера. На приведенном ниже изображении показано, как подключается внутренний подтягивающий резистор.
Подтягивание вывода к нулю
В микроконтроллере будет определенный регистр для включения этого подтягивающего резистора к нулю. Вы можете ознакомиться со спецификацией вашего микроконтроллера. На приведенном ниже изображении показано, как подключается внутренний резистор.
Режимы выхода GPIO
GPIO используется для подачи электрического сигнала (высокого или низкого) на вывод, когда он настроен как выход. В основном существует два варианта конфигурации выходов GPIO:
- Двухтактный
- Открытый сток
Двухтактный
Это состояние является состоянием по умолчанию для режима вывода GPIO. Вывод может “повышать” уровень сигнала или “понижать” его с помощью транзистора PMOS или транзистора NMOS. Нет необходимости в подтягивающих или понижающих резисторах, поскольку эту работу выполняют PMOS- и NMOS-транзисторы. Эта концепция уже была объяснена в предыдущем разделе.
Открытый сток
В режиме вывода GPIO выходной буфер формируется с использованием PMOS- и NMOS-транзисторов. Если вы удалите PMOS-транзистор, то это будет режим вывода с открытым стоком. Смотрите изображение ниже. Там PMOS-транзистор был удален.
Когда вы установите NMOS на высокий уровень, он будет подавать GND. Вывод GPIO будет низким. Когда вы выключаете NMOS, GPIO не будет подключен ни к Vcc, ни к GND. Он будет находиться в плавающем состоянии. Таким образом, на выходе будет либо низкий, либо высокий импеданс (плавающий). Он может притянуть штырь к земле, но не может поднять его высоко. Для такого типа вывода в схему должен быть добавлен внешний подтягивающий резистор, который приведет к тому, что линия будет работать на высоком уровне, если не будет работать на низком уровне.
Название происходит от того факта, что сток MOSFET ни к чему не подключен внутренне. Если вы используете BJT вместо MOSFET, то это называется открытым коллектором.
Выходы с открытым стоком чаще всего используются в интерфейсах связи, где несколько устройств подключены к одной линии (например, I2C, однопроводной и т.д.). Когда все выходы устройств, подключенных к линии, находятся в состоянии Hi-Z, линия переводится на уровень логики 1 по умолчанию с помощью подтягивания. Любое устройство может подключить линию к логическому 0, используя выход с открытым стоком, и все устройства могут видеть этот уровень.
Аналоговый режим
Вы можете настроить вход как аналоговый. В этом режиме вывод подключается к внутреннему АЦП (аналого-цифровому преобразователю) и позволяет считывать значение, представляющее заданное напряжение на выводе. Значение зависит от разрешения АЦП, например, 12-разрядный АЦП может иметь значения от 0 до 4095. Это значение отображается на напряжение, которое находится в диапазоне от 0 В до (обычно) напряжения, на котором работает микроконтроллер (например, 3,3 В).
Когда GPIO настроен в аналоговом режиме, входные подтягивающие / понижающие резисторы отключены.
Обратите внимание, что не все графические процессоры в микроконтроллере могут быть сконфигурированы как аналоговый вход. Обратитесь к спецификации вашего микроконтроллера, чтобы узнать, какие из них могут быть сконфигурированы таким образом.
Альтернативный функциональный режим
Контакты GPIO способны обеспечивать альтернативную функцию помимо обычных трех режимов. Контакты мультиплексированы для обеспечения таких функциональных возможностей, как вывод USART Tx, вывод данных I2C и т.д. Для настройки альтернативных функций будет отдельный регистр. Пожалуйста, ознакомьтесь со спецификацией вашего микроконтроллера, чтобы узнать об этом больше.
Перевод материалов EmbeTronicX