Информационный портал технической поддержки Центра проектирования интегральных микросхем |
GPIO - General Purpose Input Output - это выводы микроконтроллера, которые можно настраивать под свои цели.
Порты ввода-вывода общего назначения могут:
использоваться просто как порты на выход и вход, например, логических "0" и "1";
иметь дополнительные, например, аналоговые функции для работы с АЦП;
использоваться аппаратно для реализации различных интерфейсов взаимодействия, например UART, SPI и т.д.
Количество портов в каждом процессоре разное, как и распределение по ним дополнительных функций. Информацию по данному вопросу необходимо смотреть в спецификации в разделе "Порты ввода вывода MDP_PORTx"
Работа порта рассмотрена в статье Схемотехника портов GPIO.
Функции SPL реализуют настройку и управление портами через именованные поля, структуры и значения. Каждый параметр настройки имеет свое отдельное поле в структуре, в большинстве своем имеет перечислимый тип значения этого поля и краткое описание в комментариях. Это очень удобно и позволяет избежать ошибок при работе. Кроме этого, одна и та же функция SPL реализует одинаковое поведение для всех поддерживаемых SPL процессоров. То есть поля в регистрах или сами регистры, их адреса могут отличаться от процессора к процессору, но функция, вызванная с одинаковым аргументом, выполнит одинаковое действие. Таким образом реализуется стандартное поведение функций при различии реализации в железе.
Минусом использования SPL является большой размер программы (прошивки) и сниженное быстродействие. При этом сводится к минимуму возможность совершить ошибку. Поэтому для освоения программирования рекомендуется начинать работу с функциями SPL, добиваться работоспособности проекта, а затем модифицировать критические куски кода к регистровому исполнению.
Настройку порта рассмотрим на примере использования порта PORT_D вывод pin_7, сокращенно PD7. Этот вывод используется в программе Hello World - светодиод.
// Включаем тактирование порта D
RST_CLK_PCLKcmd (RST_CLK_PCLK_PORTD, ENABLE);
Первым действием всегда включается тактирование. Подробнее - Тактирование микроконтроллера.
// Инициализируем структуру конфигурации вывода(-ов) порта значениями по умолчанию
PORT_StructInit(&GPIOInitStruct);
Функция PORT_StructInit заполняет структуру конфигурации порта значениями по умолчанию:
void PORT_StructInit(PORT_InitTypeDef* PORT_InitStruct)
{
/* Reset PORT initialization structure parameters values */
PORT_InitStruct->PORT_Pin = PORT_Pin_All;
PORT_InitStruct->PORT_OE = PORT_OE_IN;
PORT_InitStruct->PORT_PULL_UP = PORT_PULL_UP_OFF;
PORT_InitStruct->PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
PORT_InitStruct->PORT_PD_SHM = PORT_PD_SHM_OFF;
PORT_InitStruct->PORT_PD = PORT_PD_DRIVER;
PORT_InitStruct->PORT_GFEN = PORT_GFEN_OFF;
PORT_InitStruct->PORT_FUNC = PORT_FUNC_PORT;
PORT_InitStruct->PORT_SPEED = PORT_OUTPUT_OFF;
PORT_InitStruct->PORT_MODE = PORT_MODE_ANALOG;
}
PORT_Pin - это маска выбора выводов, для которых будет применена данная конфигурация. Возможны варианты PORT_Pin_0 .. PORT_Pin_15, PORT_Pin_All и всевозможные варианты масок из этих значений. Например, для применения конфигурации к выводам 0 и 1 используется PORT_Pin = PORT_Pin_0 | PORT_Pin_1.
В процессоре К1986ВЕ92QI есть 6 портов ввода вывода (A, B, C, D, E, F). Обычно каждый порт имеет по 16 выводов, которые можно настроить по отдельности. Но количество выводов у микросхемы может быть сокращено в целях экономии, например, у данного микроконтроллеры в корпусе LQFP64 К1986ВЕ92QI порт А имеет только выводы PA0 - PA7. Название вывода берется из названия порта и номера вывода.
PORT_OE - поле настраивает порт на вывод данных или на вход. Возможные варианты:
PORT_OE_OUT - работа на выход, считывание;
PORT_OE_IN - работа на вход, запись.
Параметры PORT_PULL_UP и PORT_PULL_DOWN задают подтяжку вывода к линии питания или земли. Обычно это используется, когда вывод используется как вход. Сопротивление резистора подтяжки составляет порядка ~50КОм, точное значение необходимо уточнять в спецификации на микроконтроллер.
Возможные варианты значений для PORT_PULL_UP - это PORT_PULL_UP_OFF и PORT_PULL_UP_ON, а для PORT_PULL_DOWN - соответственно PORT_PULL_DOWN_OFF и PORT_PULL_DOWN_ON. Важно не путать эти значения, нельзя например сделать так
PORT_PULL_DOWN = PORT_PULL_UP_OFF.
Очень часто значения являются определенными битовыми масками, которые в итоге должны расположиться по нужному смещению в регистре. Поэтому PORT_PULL_UP_OFF не равно PORT_PULL_DOWN_OFF, и важно их не путать.
Параметр PORT_PD_SHM включает - выключает использование триггера Шмитта. Этот триггер имеет гистерезис и при некотором отклонении напряжения dU от заданного логического уровня на входе сохраняет текущее логическое значение на выходе. Например, если ножка настроена на вход и напряжение на ней равно напряжению питания, то микроконтроллер трактует это как наличие логической "1" на входе. Если в какой-то момент на линии появится помеха, или наводка такая, что напряжение на входе просядет меньше чем на dU, то микропроцессор будет по прежнему трактовать это как логическая "1". С логическим нулем ситуация аналогичная.
Это поле может принимать следующие значения, при PORT_PD_SHM_OFF dU = 200 мВ, а при PORT_PD_SHM_On = 400 мВ.
Параметр PORT_PD определяет подключение вывода как управляемый драйвер PORT_PD_DRIVER, либо как открытый сток - PORT_PD_OPEN.
PORT_PD_DRIVER - обычный режим работы, еще его называют тяни-толкай (push-pull). Это режим с двумя устойчивыми состояниями "0" и "1". Когда записывается "1", то вывод через полевые транзисторы подключается к цепи питания и отключается от земли. Таким образом на выходе появляется напряжение питания. Когда записывается в порт логический "0", то отключается питание и подключается земля, так формируется 0 на выводе.
В режиме PORT_PD_OPEN вывод отключается от транзистора коммутирующего его с цепью питания, то есть мы может только просаживать внешнюю линию на 0, а при записи 1 это "просаживание" отключается. В таком режиме подразумевается, что используется внешняя подтяжка к питанию, как это происходит например на шине I2C.
Режим работы входного фильтра PORT_GFEN_OFF - выключен и PORT_GFEN_ON. Фильтрация импульсов до 10 нс.
Параметр PORT_MODE определяет, в каком режиме будет работать вывод микроконтроллера - в аналоговом PORT_MODE_ANALOG или в цифровом PORT_MODE_DIGITAL.
Аналоговый режим используется, например, когда через вывод заводится аналоговый сигнал для оцифровки внутренним АЦП. При выводе аналогового сигнала от встроенного ЦАП используется такой же режим.
Назначение выводов при использовании в аналоговом режиме следует смотреть в спецификации раздел "Порты ввода - вывода".
Параметр PORT_FUNC задает функцию, которую будет исполнять порт в цифровом режиме. Есть четыре варианта значений этого параметра. Основная функция - это PORT_FUNC_PORT: вывод используется как стандартный порт ввода-вывода. В этом режиме программист самостоятельно пишет и читает состояние вывода микроконтроллера. В остальных режимах - PORT_FUNC_MAIN, PORT_FUNC_ALTER, PORT_FUNC_OVERRID - вывод используется в аппаратно реализованных алгоритмах, например, UART, SPI и прочих.
Как будет использоваться вывод при задании определенной функции необходимо смотреть в спецификации раздел "Порты ввода - вывода". Например, для К1986ВЕ92QI вывод РЕ7 в функции MAIN является 23-й линией шины адреса, в функции ALTER - линией TXD в аппаратной реализации CAN, в функции OVERRID - линией третьего таймера, отрицательного третьего канала.
Вывод | Analog | DIGITAL | |||
---|---|---|---|---|---|
PORT | MAIN | ALTER | OVERRID | ||
РЕ7 | - | РЕ7 | ADDR23 | CAN2_TX | TMR3_CH3N |
В аналоговом режиме данный порт не имеет применения.
Если для разных выводов выбрать одну и ту же функцию, например, TMR2_CH2, то реально будет задействован только один вывод, причём выбор активного осуществляется в порядке приоритета по названию порта, т.е. сначала порт А, далее порт B и т.д.
Параметр PORT_SPEED определяет время переключения логических состояний, по существу, длительность фронтов. Возможные варианты:
При быстрых фронтах возрастает потребление микроконтроллера, но зато можно увеличить скорость работы с подключенной периферией. Для мигания светодиодом скорость не важна и лучше использовать вариант с PORT_SPEED_SLOW.
Работа порта рассмотрена в Схемотехника портов GPIO.
SPL делает настройку портов более читаемой и защищает от случайных ошибок. В конечном итоге функции SPL задают параметры в регистры настроек выводов портов. Эти регистры представлены на следующей картинке, описание же находится в Схемотехника портов GPIO.
Рисунок 1 - Устройство портов ввода-вывода
В связи с тем, что регистр PORT_RXTX по чтению возвращает состояние на выводах порта, а не ранее записанное значение, в блоках некоторых МК реализованы отдельные регистры для установки и сброса выходного значения SETTX (регистр установки выходного регистра порта), CLRTX (регистр сброса выходного регистр) и RDTX (возвращает чтение выходного регистра). Логика работы данных регистров приведена на рисунке 2, на уровне SPL их использование предусмотрено.
Рисунок 2 - Логика работы регистров RXTX, SETTX, CLRTX, RDTX при работе на выход
Сайт: | https://support.milandr.ru |
E-mail: | support@milandr.ru |
Телефон: | +7 495 221-13-55 |