У процессоров Blackfin имеется 4 порта GPIO, каждый по 16 бит: C, D, E, F. После включения питания все ножки процессора сами настраиваются в определенное состояние по умолчанию - некоторые как входы GPIO, некоторые как выводы периферийных устройств, которые находятся на кристалле. Кроме того, некоторые порты, сконфигурированные на выход, работают как открытый сток, а некоторые как двухтактный выход. Также некоторые разряды портов выведены наружу, а некоторые нет. Никакой системы, к сожалению, не наблюдается. Поэтому при проектировании электронного устройства на процессоре Blackfin очень важно правильно выбрать выводы GPIO кристалла, и правильно задать необходимые внешние подтягивающие резисторы (pull-up или pull-down), поскольку собственных встроенных резисторов у Blackifin нет, и функционал ножек зависит не только от модели процессора, но и от разряда и имени порта. В этой статье рассмотрен функционал ножек процессора в контексте порта F ввода/вывода общего назначения (сокращенно GPIO) на примере ADSP-BF538 - перевод соответствующих разделов даташита [1].
Примечание: везде, где в тексте упоминается BF538, имеется в виду как модель ADSP-BF538 без внутренней FLASH-памяти, так и ADSP-BF538F с встроенной в кристалл внутренней FLASH-памятью.
[GPIO Port F]
У процессора Blackfin есть 16 ножек GPIO на порте F, т. е. PF[15:0]. Каждый порт индивидуально можно сконфигурировать либо как вход, либо как выход с использованием регистра программирования направления порта (GPIO port F direction register, PORTFIO_DIR). Когда вывод порта сконфигурирован как выход, то его состояние (лог. уровень на выходе - 0 или 1) определяется записью регистров GPIO port F set (PORTFIO_SET), GPIO port F clear (PORTFIO_CLEAR) и GPIO port F toggle (PORTFIO_TOGGLE). Независимо от того, как настроен порт - как вход или как выход, чтение этих регистров вернет состояние порта - по битовой маске можно определить лог. уровень на каждом разряде порта.
Примечание: состоянием регистров (и соответственно ножками процессора) можно управлять даже в отладчике (JTAG), поскольку регистры отображаются на адресное простанство процессора как обычные ячейки памяти (Memory Mapped Register, сокращенно MMR). Для управления регистрами порта F во время отладки откройте окно "General Purpose I/O Port F" (меню Register -> Peripherals -> GPIO -> Port F).
Порт F по умолчанию работает как GPIO, а на портах C, D, E по умолчанию работают функции периферийных устройств. Все выводы порта F двухтактные (т. е. имеют ключ на +VDDEXT, так и на GND), некоторые выводы портов C, D, E имеют открытый сток. Кроме того, только на порту F есть возможность генерировать прерывания в зависимости от лог. уровня на выводе порта. Еще одно важное отличие - разрешение GPIO и управление для портов C, D, E никак не связано с записью и чтением какого-либо регистра периферии.
Каждый вывод PFx можно настроить для генерации прерывания. Когда PFx сконфигурирован как вход, прерывание может быть сгенерировано в соответствии с состоянием лог. уровня на входе вывода порта (либо лог. 1, либо лог. 0), а также по выбранному перепаду уровня (0 -> 1 или 1 -> 0) или сразу по обоим перепадам (и 0 -> 1, и 1 -> 0). Это настраивается регистром полярности (PORTFIO_POLAR), регистром выбора перепада для прерывания (PORTFIO_EDGE) и регистром разрешения выбора сразу двух перепадов для прерывания (PORTFIO_BOTH). Полярность каждого входа настраивается управлением битами регистра PORTFIO_POLAR. Когда входной буфер вывода порта PFn разрешен, и порт PFn сконфигурирован как выход, то если прерывания на этом выводе разрешены, то прерывание будет срабатывать при установке вывода PFn.
Процессор предоставляет 2 независимых канала прерываний для выводов PFx, идентичные по функциональности каналы GPIO interrupt A и GPIO interrupt B. Каждый канал прерывания имеет связанные с ним 4 регистра маски, a GPIO interrupt mask data register (PORTFIO_MASKx), GPIO interrupt mask set register (PORTFIO_MASKx_SET), GPIO interrupt mask clear register (PORTFIO_MASKx_CLEAR), и GPIO interrupt mask toggle register (PORTFIO_MASKx_TOGGLE).
Каждому выводу PFx соответствует бит в этих 8 регистрах. Запись 1 в бит регистра PORTFIO_MASKx_SET разрешает генерацию прерывания для соответствующего вывода PFx, в то время как запись 1 в бит регистра PORTFIO_MASKx_CLEAR запрещает генерацию прерывания для этого вывода PFx.
Маскирование прерывания может быть переключено записью 1 в бит регистра PORTFIO_MASKx_TOGGLE. Дополнительно биты маски могут быть напрямую записаны в регистр PORTFIO_MASKx. Этот гибкий механизм позволяет настроить генерацию GPIO interrupt A, GPIO interrupt B, а также оба прерывания и A, и B, либо отсутствие прерываний.
Когда вывод PFx не используется в системе, входной буфер может быть запрещен - эта возможность позволяет не применять внешние подтягивающие резисторы (pull-up или pull-down) на выводах неиспользуемых портов. По умолчанию все входные буферы запрещены. Они могут быть разрешены записью битов в регистр разрешения входного буфера (GPIO port F input enable register, PORTFIO_INEN).
Некоторые выводы PFx мультиплексированы на использование периферийных устройств процессора - parallel peripheral interface (PPI), таймеры и serial peripheral interface (SPI0) - т. е. вывод процессора может работать либо как GPIO, либо как аппаратный вывод периферийного устройства. В таблице 14-1 показаны программируемые выводы GPIO и на какие периферийные устройства они мультиплексированы.
Таблица 14-1. Назначение и функционал выводов порта F, где GPIO используют общие с периферийными устройствами выводы процессора.
PFx
Периферийные устройства, которые используют вывод PFx
PPI
SPI0
Таймеры 0, 1, 2
PF0
~SPIOSS (вход выборки подчиненного устройства)
PF1
~SPIOSEL1
Выход для выборки подчиненного устройства
TACLK (входной тактовый сигнал)
PF2
~SPI0SEL2
PF3
PPI_FS3 (синхросигнал фрейма 3)
~SPI0SEL3
PF4
PPI15
I/O
~SPI0SEL4
PF5
PPI14
~SPI0SEL5
PF6
PPI13
~SPI0SEL6
PF7
PPI12
~SPI0SEL5
PF8
PPI11
PF9
PPI10
PF10
PPI9
PF11
PPI8
PF12
PPI7
PF13
PPI6
PF14
PPI5
PF15
PPI4
В таблице 14-2 показано, как использовать функцию периферийного устройства, которая привязана к выводам PFx.
Таблица 14-2. Как настроить использование функции периферийного устройства на выводах PFx.
PFx
Периферийные устройства, которые используют вывод PFx
PPI
SPI0
Таймеры 0, 1, 2
PF0
PSSE=1 (бит регистра SPI0_CTL)
PF1
FLS1=1 (бит регистра SPI0_FLG)
CLK_SEL=1 (бит регистра TIMERx_CONFIG)
PF2
FLS2=1 (бит регистра SPI0_FLG)
PF3
В регистре PPI_CTL: если PORT_DIR=1, то запишите 01 в PORT_CFG. Если PORT_DIR = 0, то запишите 10 в PORT_CFG.
FLS3=1 (бит регистра SPI0_FLG)
PF4
Запишите b#111 в DLEN регистра PPI_CTL
FLS4=1 (бит регистра SPI0_FLG)
PF5
Запишите b#110 в DLEN регистра PPI_CTL
FLS5=1 (бит регистра SPI0_FLG)
PF6
Запишите b#101 в DLEN регистра PPI_CTL
FLS6=1 (бит регистра SPI0_FLG)
PF7
Запишите b#100 в DLEN регистра PPI_CTL
FLS7=1 (бит регистра SPI0_FLG)
PF8
Запишите b#011 в DLEN регистра PPI_CTL
PF9
Запишите b#010 в DLEN регистра PPI_CTL
PF10
Запишите b#001 в DLEN регистра PPI_CTL
PF11
Запишите b#000 в DLEN регистра PPI_CTL
PF12
Всегда разрешен, если разрешен PPI
PF13
PF14
PF15
Дополнительную информацию см. [1], разделы 11 "Parallel Peripheral Interface", 10 "SPI Compatible Port Controllers" и 16 "Timers".
[Регистры GPIO Port F (MMR)]
Регистры GPIO port F доступны в общем глобальном пространстве адресов процессора, поэтому их называют "регистрами, привязанными к памяти" (memory-mapped registers, сокращенно MMR). Адреса GPIO MMR даны в Приложении B. Доступ ядра к регистрам конфигурации GPIO configuration осуществляется через системную шину процессора.
Регистр управления направлением порта ввода/вывода F (GPIO port F direction register, PORTFIO_DIR) работает и на чтение, и на запись. Каждый бит регистра соответствует какому-то выводу PFx. Лог. 1 конфигурирует вывод порта PFx как выход, переводя лог. уровень на выходе в соответствии с значением соответствующего бита в регистре PORTFIO. Лог. 0 конфигурирует вывод PFx как вход. После сброса в этом регистре находится значение 0x0000, т. е. после сброса все выводы PFx работают как входы.
Когда используете вывод PFx как вход, не забудьте, что нужно также разрешить у этого вывода входной буфер - установите соответствующий бит в регистре PORTFIO_INEN.
Рис. 14-1. GPIO Port F Direction Register.
[Обзор регистров значения GPIO Port F]
У процессора BF538 есть 4 регистра значения GPIO:
• GPIO data register (PORTFIO) - регистр данных. • GPIO set register (PORTFIO_SET) - регистр установки в лог. 1. • GPIO clear register (PORTFIO_CLEAR) - регистр сброса в лог. 0. • GPIO toggle register (PORTFIO_TOGGLE) - регистр переключение выхода в противоположное состояние.
Эти регистры используются для следующих целей (каждый вывод PFx представлен отдельным битом в этих 4 регистрах):
• Чтобы определить лог. уровень на выводах PFx, настроенных как входы. • Чтобы задать выходной лог. уровень выводов PFx, настроенных как выходы. • Очистки прерываний, сгенерированных выводами PFx.
Чтение любого из регистров PORTFIO, PORTFIO_SET, PORTFIO_CLEAR или PORTFIO_TOGGLE возвратит значение выводов PFx. Возвращенное значение покажет установленное состояние выводов PFx, когда они настроены как выходы, и состояние внешнего сигнала, когда выводы PFx сконфигурированы как входы (в зависимости от настроек полярности для каждого вывода). После сброса прочитанное значение из PORTFIO, PORTFIO_SET, PORTFIO_CLEAR или PORTFIO_TOGGLE будет равно 0x0000 - не зависимо от того, какой лог. уровень на входе, не смотря на то, что эти выводы работают по умолчанию как входы. Причина в том, что входные буферы порта F по умолчанию не разрешены. См. таблицу 14-3 в качестве руководства по интерпретации прочитанного значения из этих регистров в зависимости от установок регистров PORTFIO_POLAR, PORTFIO_EDGE и PORTFIO_BOTH.
Таблица 14-3. Как оценивать значение, считанное из регистров PORTFIO, PORTFIO_SET, PORTFIO_CLEAR или PORTFIO_TOGGLE.
PORTFIO_POLAR
PORTFIO_EDGE
PORTFIO_BOTH
Что произойдет от настройки
0
0
X
Вывод, на котором низкий уровень, читается как лог. 0; вывод, на котором высокий уровень, читается как лог. 1.
0
1
0
Если произошел перепад 0 -> 1, то вывод будет читаться как лог. 1, иначе будет читаться как 0.
1
0
X
Инверсия: вывод, на котором низкий уровень, читается как лог. 1; вывод, на котором высокий уровень, читается как лог. 0.
1
1
0
Если произошел перепад 1 -> 0, то вывод будет читаться как лог. 1, иначе будет читаться как 0.
X
1
1
Если произошел любой перепад (учитываются и нарастание, и спад уровня), то вывод будет читаться как 1, иначе будет читаться как 0.
Для выводов, которые настроены на чувствительность к перепаду (edge-sensitive), чтение всегда будет возвращать 1 в случае обнаружения перепада. Т. е. появление перепада запоминается в этом бите как лог. 1, и эта лог. 1 останется в до тех пор, пока не будет сброшена программно. Для выводов, которые сконфигурированы на чувствительность к уровню (level-sensitive), состояние выводов проверяется в каждом цикле, так что читаемая величина будет отражать реальное текущее состояние сигнала на входе порта.
Регистр данных, GPIO data register (PORTFIO), биты которого показаны на рис. 14-2, напрямую задают состояние всех выводов PFx. Т. е. если записать этот регистр, выходное состояние портов поменяется (у тех выводов портов, которые настроены как выходы). Если прочитать регистр PORTFIO, то прочитанное значение вернет состояние выводов PFx.
Регистры GPIO set (PORTFIO_SET), GPIO clear (PORTFIO_CLEAR) и GPIO toggle (PORTFIO_TOGGLE) используются для следующих целей:
• Установка, очистка и переключение в противоположное состояние каждого выходного вывода PFx. • Очистка запомненного состояния прерывания, которое захвачено от каждого вывода PFx.
Этот механизм используется для того, чтобы избежать потенциальных проблем традиционных принципов работы с регистрами типа "read-modify-write". Чтение любого из этих регистров вернет состояние выводов GPIO.
14-3. GPIO Port F Set Register.
14-4. GPIO Port F Clear Register.
14-5. GPIO Port F Toggle Register.
В качестве пояснения, как работать с этими регистрами, предположим, что PF0 сконфигурирован как выход (PORTFIO_DIR = 0x0001). Запись 0x0001 в регистр PORTFIO_SET приведет к появлению лог. 1 на выводе PF0 без изменения состояния на остальных выводах PFx. Запись 0x0001 в регистр PORTFIO_CLEAR переведет PF0 в лог. 0 без изменения состояния на других выводах PFx. Запись 0x0001 в регистр PORTFIO_TOGGLE поменяет состояние на выводе PF0 на противоположное (с 0 на 1 или с 1 на 0 - в зависимости от текущего состояния вывода).
Запись 0 в регистры PORTFIO_SET, PORTFIO_CLEAR или PORTFIO_TOGGLE не дает никакого эффекта, т. е. игнорируется.
Чтение регистра PORTFIO_SET или PORTFIO_CLEAR вернет:
• 0 для выводов, сконфигурированных как выходы и переведенных в состояние лог. 0. • 1 для выводов, сконфигурированных как выходы (в том числе и PF0 в нашем примере) и переведенных в состояние лог. 1. • Состояние входного логического сигнала, поданного на выводы PFx, сконфигурированные как входы.
Прочитанный входной уровень базируется на настройках регистров PORTFIO_POLAR и PORTFIO_EDGE, и зависит от лог. уровня на каждом выводе.
[Обзор регистров маски прерываний GPIO F]
Процессор BF538 поддерживает 2 источника прерываний для каждого вывода GPIO: GPIO interrupt A и GPIO interrupt B. Эти прерывания конфигурируются набором регистров масок прерываний GPIO (PORTFIO_MASKA, PORTFIO_MASKA_CLEAR, PORTFIO_MASKA_SET, PORTFIO_MASKA_TOGGLE, PORTFIO_MASKB, PORTFIO_MASKB_CLEAR, PORTFIO_MASKB_SET и PORTFIO_MASKB_TOGGLE), реализованные как комплементарные пары регистров write-1-to-set, write-1-to-clear и write-1-to-toggle (записать 1 для установки, для очистки, для переключения).
Оба прерывания GPIO interrupt A и GPIO interrupt B поддерживаются 4 выделенными регистрами:
• Регистры данных маски прерываний GPIO (PORTFIO_MASKA и PORTFIO_MASKB). • Регистры маски установки прерываний GPIO (PORTFIO_MASKA_SET и PORTFIO_MASKB_SET). • Регистры маски очистки прерываний GPIO (PORTFIO_MASKA_CLEAR и PORTFIO_MASKB_CLEAR). • Регистры переключения прерываний GPIO (PORTFIO_MASKA_TOGGLE и PORTFIO_MASKB_TOGGLE).
Эта реализация предоставляет возможность разрешить или запретить выводу PFx работать как прерывание процессора без необходимости иметь операцию доступа типа read-modify-write - либо путем указания маски битов для нужного действия (установка, сброс, переключение), или прямой записью в регистр данных маски.
Оба эти термина связаны с необходимостью управлять состоянием только одного бита за одну операцию. Поскольку биты, соответствующие выводам портов, объединены в слово разрядностью 16 бит, то традиционным способом поменять состояние только одного бита можно только с помощью последовательности операций прочитать, поменять прочитанное значение и записать. Это как раз и называется операцией read-modify-write.
Проблема с операцией read-modify-write состоит в том, что с традиционным доступом к регистрам такое управление битами трудно сделать атомарным. Вот тут как раз и приходит на помощь принцип управления битами write-1-to-действие (записать лог. 1, чтобы выполнить действие) - благодаря наличию отдельного регистра для каждого действия (сброс, установка, переключение) появляется возможность атомарно управлять значением любого отдельного бита (или набора битов) за одно быстрое действие.
Каждый вывод PFx представлен определенным битом в каждом из 8 регистров масок прерываний. Если регистр PORTFIO_MASKx предназначен для прямой установки всех 16 бит прерываний GPIO F, то регистры управления действиями PORTFIO_MASKx_SET, PORTFIO_MASKx_CLEAR, PORTFIO_MASKx_TOGGLE предназначены для определенной операции с нужным набором бит (набор выбирается маской единиц). В таблице 14-4 показан эффект от записи 1 в бит регистров PORTFIO_MASKx_SET, PORTFIO_MASKx_CLEAR, PORTFIO_MASKx_TOGGLE.
Таблица 14-4. Эффект от записи лог. 1 в бит.
Регистр
Что произойдет при записи 1 в бит регистра
PORTFIO_MASKx_SET
Разрешает прерывание для GPIO PFx.
PORTFIO_MASKx_CLEAR
Запрещает прерывание для GPIO PFx.
PORTFIO_MASKx_TOGGLE
Меняет состояние генерации прерывания для GPIO PFx.
Чтение любого из регистров PORTFIO_MASKx, PORTFIO_MASKx_SET, PORTFIO_MASKx_CLEAR или PORTFIO_MASKx_TOGGLE возвратит текущее значение регистра PORTFIO_MASKx.
Прерывания GPIO interrupt A и GPIO interrupt B работают независимо друг от друга. Например, запись 1 в бит регистра PORTFIO_MASKA_SET не влияет на работу GPIO interrupt B. Это позволяет PFx генерировать GPIO interrupt A, GPIO interrupt B, оба прерывания GPIO interrupt A и B, либо не генерировать прерывания вовсе.
Обратите внимание, что прерывание GPIO генерируется по принципу логического ИЛИ от всех незамаскированных прерываний выводов PFx для этого прерывания. Например, если PF0 и PF1 оба разрешены для GPIO interrupt A, то прерывание GPIO interrupt A будет срабатывать, когда будут менять состояние или PF0, или PF1. Когда используются прерывания либо по спаду, либо по нарастанию лог. уровня, условие прерывания должно быть всякий раз очищено в ISR путем записи лог. 1 в соответствующий бит регистра PORTFIO_CLEAR.
После сброса все прерывания замаскированы (запрещены).
Процесс генерации прерывания GPIO Port F. На рис. 14-6 показан процесс, по которому GPIO interrupt A или GPIO interrupt B генерирует событие ядра (вместо x на диаграмме может быть подставлено A или B). Обратите внимание, что алгоритм показан только для одного программируемого вывода GPIO, "GPIOn". Однако прерывание GPIO генерируется операцией OR от всех незамаскированных выводов PFx для этого прерывания. Например, если для GPIO interrupt A не замаскированы только PF0 and PF1, то это прерывание будет генерироваться либо от PF0, либо от PF1.
Рис. 14-6. Алгоритм генерации прерывания GPIO Port F.
Примечание: эта схема одинаковая и для GPIO interrupt A, и для GPIO interrupt B (вместо x на диаграмме можно подставить A или B).
Регистр полярности GPIO (GPIO polarity register, PORTFIO_POLAR), показанный на рис. 14-15, используется для конфигурирования полярности входа GPIO. Чтобы выбрать активный уровень лог. 1 или фронт нарастания, сбросьте нужные биты в этом регистре в 0. Чтобы выбрать активный уровень лог. 0 или срез спада, установите нужные биты в этом регистре в 1.
Этот регистр не оказывает никакого влияния на выводы PFx, которые сконфигурированы как выходы. После сброса этот регистр очищается, следовательно по умолчанию задана активная положительная полярность (активный уровень лог. 1, активный перепад от 0 к 1).
Регистр настройки вида сигнала для прерывания GPIO (GPIO interrupt sensitivity register, PORTFIO_EDGE), показанный на рис. 14-16, используется для конфигурирования каждого вывода GPIO на срабатывания прерывания либо от логического уровня (level-sensitive), либо от перепада (фронта или спада) входного сигнала (edge-sensitive). Когда используется режим edge-sensitive, схема детектирования перепада используется для аппаратного запоминания перепада, что предотвращает от потери очень коротких импульсов (которые сравнимы с периодом системной тактовой частоты или меньше его). Этот регистр не оказывает никакого влияния на выводы PFx, сконфигурированные как выходы.
После сброса содержимое этого регистра очищено, что означает срабатывание прерывания по уровню (level sensitivity).
Рис. 14-16. GPIO Port F Interrupt Sensitivity Register.
На рис. 14-17 показан регистр установки срабатывания прерывания по обоим перепадам сигнала на входе GPIO (GPIO set on both edges register, PORTFIO_BOTH), который используется для разрешения прерывания сразу и по нарастанию, и по спаду входного сигнала.
Когда определенный вывод PFx установлен на чувствительность к перепаду сигнала (edge-sensitive, это настраивается в регистре PORTFIO_EDGE), установка соответствующего бита в PORTFIO_BOTH приведет к тому, что прерывание будет генерироваться как для нарастания, так и для спада сигнала. Этот регистр не дает никакого эффекта на выводах PFx, которые настроены на level-sensitive прерывания, или настроены как выходы.
Рис. 14-17. GPIO Port F Set on Both Edges Register.
Регистр разрешения входов The GPIO input enable register (PORTFIO_INEN), показанный на рис. 14-18, используется для того, чтобы разрешить входные буферы для любого вывода GPIO, который используется как вход. Если оставить входной буфер не разрешенным, то не нужны внешние подтягивающие резисторы (pull-up или pull-down) когда какие-то отдельные выводы PFx не используются в системе. По умолчанию все входные буферы запрещены.
Если вывод PFx используется как вход, то должен быть также установлен соответствующий ему бит в регистре PORTFIO_INEN. Иначе изменения на выводах GPIO не будут распознаваться процессором.
Рис. 14-18. GPIO Port F Input Enable Register.
[Быстродействие / пропускная способность]
Выводы PFx синхронизированы с системной тактовой частотой (SCLK). Когда выводы сконфигурированы как выходы, программируемые GPIO могут менять свое состояние на каждом перепаде системной тактовой частоты (не путайте с частотой ядра CCLK!).
Когда выводы сконфигурированы как входы, то общий дизайн системы должен учитывать потенциальные задержки из-за разницы между частотой ядра (CCLK) и системными тактами (SCLK). Изменения в состоянии выводов PFx имеют задержку в 3 такта SCLK до того, как это может быть детектировано процессором. Когда сконфигурировано прерывание по уровню (level-sensitive interrupt), то есть минимальная задержка в 4 такта SCLK между моментом установки GPIO и моментом, когда сработало прерывание. Когда сконфигурировано прерывание по изменению уровня (edge-sensitive interrupt), в задержку добавляется еще один такт SCLK, в результате общая задержка получается 5 тактов SCLK от момента перепада сигнала на входе до момента срабатывания прерывания.
Регистры процессора Blackfin, отображенные на адресное пространство памяти (memory-mapped registers, MMR) находятся в диапазоне адресов 0xFFE00000 .. 0xFFFFFFFF.
Ко всем MMR ядра доступ должен осуществляться как 32-битное чтение или запись.
В этом приложении перечислены адреса MMR ядра их имена. Чтобы получить больше информации про MMR, см. столбец "Подробнее в разделе".
Регистры GPIO port C, D, E (0xFFC0 1500 – 0xFFC0 15FF)
Таблица B-13. Регистры GPIO Port C.
Адрес MMR
Имя регистра
См. секцию
0xFFC0 1500
PORTCIO_FER
Регистр PORTxIO_FER
0xFFC0 1550
PORTCIO_DIR
Регистр PORTxIO_DIR
0xFFC0 1560
PORTCIO_INEN
Регистр PORTxIO_INEN
0xFFC0 1510
PORTCIO
Регистр PORTxIO
0xFFC0 1520
PORTCIO_CLEAR
Регистры PORTxIO_SET, PORTxIO_CLEAR и PORTxIO_TOGGLE
0xFFC0 1530
PORTCIO_SET
0xFFC0 1540
PORTCIO_TOGGLE
Таблица B-14. Регистры GPIO Port D.
Адрес MMR
Имя регистра
См. секцию
0xFFC0 1504
PORTDIO_FER
Регистр PORTxIO_FER
0xFFC0 1554
PORTDIO_DIR
Регистр PORTxIO_DIR
0xFFC0 1564
PORTDIO_INEN
Регистр PORTxIO_INEN
0xFFC0 1514
PORTDIO
Регистр PORTxIO
0xFFC0 1524
PORTDIO_CLEAR
Регистры PORTxIO_SET, PORTxIO_CLEAR и PORTxIO_TOGGLE
0xFFC0 1534
PORTDIO_SET
0xFFC0 1544
PORTDIO_TOGGLE
Таблица B-15. Регистры GPIO Port E.
Адрес MMR
Имя регистра
См. секцию
0xFFC0 1508
PORTEIO_FER
Регистр PORTxIO_FER
0xFFC0 1558
PORTEIO_DIR
Регистр PORTxIO_DIR
0xFFC0 1568
PORTEIO_INEN
Регистр PORTxIO_INEN
0xFFC0 1518
PORTEIO
Регистр PORTxIO
0xFFC0 1528
PORTEIO_CLEAR
Регистры PORTxIO_SET, PORTxIO_CLEAR и PORTxIO_TOGGLE
0xFFC0 1538
PORTEIO_SET
0xFFC0 1548
PORTEIO_TOGGLE
Регистры GPIO port F (0xFFC0 0700 – 0xFFC0 07FF)
Table B-16. Регистры GPIO Port F.
Адрес MMR
Имя регистра
См. секцию
0xFFC0 0700
PORTFIO_FLAG_D
Регистр PORTFIO
0xFFC0 0704
PORTEIO_FLAG_CLEAR
Регистры PORTFIO_SET, PORTFIO_CLEAR и PORTFIO_TOGGLE
0xFFC0 0708
PORTFIO_FLAG_SET
0xFFC0 070C
PORTFIO_FLAG_TOGGLE
0xFFC0 0710
PORTFIO_MASKA
Обзор регистров маски прерываний GPIO F
0xFFC0 0714
PORTFIO_MASKA_CLEAR
0xFFC0 0718
PORTFIO_MASKA_SET
0xFFC0 071C
PORTFIO_MASKA_TOGGLE
0xFFC0 0720
PORTFIO_MASKB
0xFFC0 0724
PORTFIO_MASKB_CLEAR
0xFFC0 0728
PORTFIO_MASKB_SET
0xFFC0 072C
PORTFIO_MASKB_TOGGLE
0xFFC0 0730
PORTFIO_DIR
Регистр PORTFIO_DIR
0xFFC0 0734
PORTFIO_POLAR
Регистр PORTFIO_POLAR
0xFFC0 0738
PORTFIO_EDGE
Регистр PORTFIO_EDGE
0xFFC0 073C
PORTFIO_BOTH
Регистр PORTFIO_BOTH
0xFFC0 0740
PORTFIO_INEN
Регистр PORTFIO_INEN
[Программируемые флаги]
Двунаправленный 16-битный порт F (PF15 .. PF0) имеет дополнительный функционал, в отличие от остальных портов C, D и E. Каждая ножка порта F может индивидуально управляться через так называемую систему управления флагами и состоянием, причем к изменению уровня может быть привязана обработка прерывания. Поэтому ножки порта F называются в руководстве Analog Devices "флагами", что вносит некоторую путаницу. Таким образом, регистры порта F и портов C, D и E называются по разному:
Flag direction control register - так называется регистр настройки направления работы (вход или выход) для порта F. Flag control and status register - так называется регистр состояния и управления состоянием порта F. GPIO direction control registers - так называются регистры настройки направления работы (вход или выход) для портов C, D и E. GPIO control and status registers - так называются регистры состояния и управления состоянием для портов C, D и E.
Кроме того, у порта F есть еще 2 дополнительных регистра, связанных с обработкой прерываний:
Flag interrupt mask registers – два регистра маски прерываний позволяют для каждой отдельной ножки PFx функционировать как источник прерывания для процессора. Подобно двум регистрам управления флагами, которые используются для установки и очистки отдельных значений флагов, один регистр маски прерываний флагов установленными битами разрешает функцию прерывания, и другой регистр маски флагов прерываний очисткой бит запрещает функцию прерывания. Ножки портов PFx, определенные для работы в режиме входа, могут быть сконфигурированы для генерации аппаратных прерываний, в то время как выходы портов PFx могут переключаться программно, вызывая срабатывание программных прерываний.
Flag interrupt sensitivity registers – два регистра флагов чувствительности прерывания, определяют для каждой ножки порта PFx, как должно срабатывать прерывание - либо по перепаду, либо по уровню, и если задано срабатывать по перепаду, то задают, по какому перепаду должно срабатывать прерывание - по нарастанию, по спаду или по обоим перепадам сигнала. Один регистр выбирает тип чувствительности, и другой регистр выбирает, какой из перепадов действует для срабатывания прерывания.
Для программируемых флагов Analog Devices написала специальный драйвер, это так называемая служба программируемых программируемых флагов [3]. По сути это просто библиотека, облегчающая портирование кода с одного процессора Blackfin на другой.