GPIO
Теперь пришло время поговорить о вводе/выводе общего назначения, или GPIO. Итак, в этой главе мы поговорим о выводах цифрового ввода/вывода. Сначала мы рассмотрим, как GPIO обычно работает в микроконтроллерах. Затем мы увидим, как работает GPIO в микроконтроллере FE310. Мы познакомимся с его аппаратным обеспечением, ознакомившись с руководством по микроконтроллерам, и познакомимся с программным обеспечением в библиотеке встроенного ПО.
На самом деле, это будет глубокое погружение в библиотеку Freedom Metal. Мы будем вдаваться в определения некоторых функций снова и снова, пока не достигнем очень низкого уровня абстракции. Цель этого состоит в том, чтобы не оставлять вопросов относительно того, как работает библиотека.
После этого, мы создадим наши собственные макрофункции для операций, которые либо не были включены в библиотеку Freedom Metal, либо включены в библиотеку, но работают слишком медленно.
Наконец, мы создадим простое приложение GPIO с парой кнопок и светодиодом.
Итак, начнем.
О GPIO
Ввод/вывод общего назначения, или сокращенно GPIO, - это обобщающий термин, используемый для обозначения контактов цифрового ввода/вывода в микроконтроллерах, которые доступны программисту.
Как следует из названия, GPIO включает в себя входные и выходные контакты, но, что более важно, он также включает двунаправленные контакты. На самом деле, большинство выводов GPIO являются двунаправленными, всего с несколькими выводами только для ввода или только для вывода (и для этих случаев есть веская причина).
Большинство интерфейсов GPIO в микроконтроллерах позволяют нам настраивать функциональность выводов следующими способами:
Направление передачи данных
Для каждого двунаправленного вывода ввода-вывода в некотором регистре конфигурации, отображаемом в память, есть бит, который позволяет вам выбрать, будет ли вывод действовать как цифровой вход или как цифровой выход. Обычно очистка этого бита (запись в него 0) делает вывод входным, а установка этого бита (запись в него 1) делает вывод выходным. По соображениям безопасности, по умолчанию, используется значение input.
Стягивающие резисторы
Поскольку входные контакты часто подключаются к цифровым переключателям, использующим либо повышающий, либо понижающий резистор, производители микроконтроллеров обычно добавляют бит в регистры конфигурации, чтобы включить или отключить использование внутренних повышающих резисторов. Эта функция сэкономит вам один резистор, что положительно скажется на бюджете, пайке, пространстве на вашей печатной плате и так далее. Это хорошее применение девиза "Если вы можете сделать это с помощью программного обеспечения, делайте это с помощью программного обеспечения".
Выходная мощность привода
Если вы собираетесь отправлять свои выходные сигналы на другие цифровые устройства, подойдет выходная мощность по умолчанию, но иногда требуется использовать нагрузку с более высокими требованиями к току. Микроконтроллеры обычно поддерживают два режима выходной мощности: по умолчанию обычно ниже 5 мА, а режим высокой выходной мощности обычно может обеспечивать 20 мА или более. Как обычно, это настраивается с помощью бита в регистре конфигурации, где запись 1 включает режим повышенной надежности.
Поддержка прерываний
Контакты цифрового входа обычно способны генерировать прерывания. Для этого производители обычно предоставляют 2 бита на вывод в регистрах конфигурации GPIO: бит разрешения прерывания и бит флага прерывания. Мы поговорим об этом позже.
Выбор аналогового ввода-вывода
Для микроконтроллеров с аналоговым вводом-выводом аналоговые выводы часто являются теми же выводами GPIO. По этой причине регистры конфигурации GPIO предоставляют бит, позволяющий пользователю выбирать, использовать ли вывод в качестве аналогового или цифрового ввода-вывода, поскольку схема отличается. Аналоговый вход реализован с помощью аналого-цифрового преобразователя (АЦП), тогда как аналоговый выход реализован с помощью цифроаналогового преобразователя (ЦАП). Теперь, вот забавный факт: FE310 - очень необычный микроконтроллер в том смысле, что он не поддерживает аналоговый ввод-вывод.
Альтернативные функции
Микроконтроллеры спроектированы таким образом, чтобы обеспечить гибкость. Вот почему пины обычно многофункциональны. Например, в дополнение к функции GPIO по умолчанию, вывод может использоваться в качестве последовательной линии передачи, входа таймера или аналогового выхода. Из-за этого производители предоставляют средства для выбора того, какой внутренний блок подключать к каждому контакту. Это иногда называют мультиплексированием контактов, потому что это может быть сделано с помощью аналоговых или цифровых мультиплексоров. FE310 вызывает альтернативные функции, управляемые аппаратным обеспечением Функции ввода-вывода.
Принципиальная схема FE310 GPIO
Ниже приведена упрощенная принципиальная схема GPIO-контроллера FE310. Важно знать об этой схеме, так как это поможет вам понять, почему нам нужно взаимодействовать с каждым из задействованных регистров.
Пожалуйста, обратите внимание: не позволяйте оборудованию напугать вас. Это не так сложно, и вы все равно сможете использовать высокоуровневые программные средства для управления этим процессом. Просто сядьте поудобнее и терпеливо наблюдайте. Суть в том, что у вас будет доступ к библиотеке высокого уровня для настройки и использования всех модулей.
Для каждого вывода GPIO микроконтроллер FE310 имеет следующую схему (рис.3.1):
![Схема для каждого вывода GPIO в микроконтроллере FE310 (Взято с руководства пользователя FE310-G002 представлено с разрешения SiFive, Inc.)](/EDI/20_01_25_2/1737325222-1077/tutorial/1372/objects/4/files/03-01.jpg)
Рис. 3.1. Схема для каждого вывода GPIO в микроконтроллере FE310 (Взято с руководства пользователя FE310-G002 представлено с разрешения SiFive, Inc.)
Мы рассмотрим некоторые детали этой схемы. Физический контакт показан справа в виде перечеркнутого квадрата. Пин - это правый конец затемненного прямоугольника с пунктиром. Этот прямоугольник является блоком ввода/вывода пина. Этот блок не имеет памяти, только 5 входов и 1 выход в названных сигналах слева от него. Вот что делают эти сигналы:
IVAL: Входное значение (вывод)
Это единственный вывод блока ввода-вывода. Этот сигнал - это то, к чему вы получите доступ в качестве состояния пина, когда пин настроен как входной (IE=1). Этот сигнал подключается к триггеру D (не показан), который сопоставляется с некоторым адресом памяти с некоторым смещением в битах, к которому вы можете получить доступ с помощью программного обеспечения.
IE: Включить ввод (вход)
Когда на этот вход поступает логическое значение 1, состояние физического вывода реплицируется в сигнале IVAL. Это просто достигается с помощью элемента AND, который эффективно позволяет считывать состояние вывода в качестве входных данных. Когда на этот вход поступает логический 0, элемент AND постоянно выводит 0, эффективно заставляя сигнал IVAL игнорировать состояние вывода.
PUE: Включить подтягивание (вход)
Когда этот вход управляется логическим значением 1, переключатель справа замыкается, так что подтягивающий резистор электрически подключается к контакту. Подтягивающие резисторы предназначены для установки значения входного сигнала по умолчанию, когда вывод не приводится в действие (оставлен отсоединенным или плавающим). Подтягивающие резисторы используются с цифровыми переключателями активного разряда. Эти переключатели соединяют вывод с землей или оставляют его плавающим, как мы увидим чуть позже. Обратите внимание, что в FE310 не реализованы понижающие резисторы, являющиеся альтернативой переключателям с активным напряжением, и это нормально, потому что повышающие резисторы намного популярнее, чем понижающие. Когда на этот вход поступает значение 0 (состояние по умолчанию), подтягивающее устройство отсоединяется от контакта. Нам не всегда нужен стягивающий резистор, и при ненужном использовании он может привести к потере энергии.
OVAL: Выходное значение (вход)
Этот сигнал является логическим уровнем, который будет управлять выводом, когда он сконфигурирован как выходной.
OE: Включение вывода (вход)
Когда на этот вход поступает значение 1, сигнал OVAL реплицируется на выходе буфера. Это сигнал с высоким уровнем активности, такой же, как и все остальные. Не беспокойтесь о 2 кружочках на схеме для этого сигнала, они просто означают двойное отрицание (мы подтвердим это позже). Выходной сигнал этого буфера приводит в действие вывод изнутри микросхемы, что эффективно позволяет выводить цифровые сигналы. Из-за этого важно избегать ввода на вход OE значения 1, если вы вводите вывод снаружи (как если бы это был вход). Если вы включите выход и подключите вывод извне (это включает подключение вывода к напряжению питания или заземлению), вы можете повредить выходной драйвер или внешнюю схему. Суть в том, что вы включаете этот сигнал только в том случае, если хотите настроить вывод в качестве выходного сигнала. Когда на этот вход поступает значение 0, выходной буфер отключается. Технически буфер работает в высокоимпедансном состоянии, что очень похоже на электрическое отключение от контакта. Вы хотите отключить этот сигнал, чтобы настроить пин в качестве входного сигнала.