ADSP-BF538: управление портами GPIO F Печать
Добавил(а) microsin   

У процессоров 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.

ADSP BF538 PORTFIO DIR

Рис. 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.

ADSP BF538 PORTFIO

Рис. 14-2. GPIO Port F Data Register.

Регистры GPIO set (PORTFIO_SET), GPIO clear (PORTFIO_CLEAR) и GPIO toggle (PORTFIO_TOGGLE) используются для следующих целей:

• Установка, очистка и переключение в противоположное состояние каждого выходного вывода PFx.
• Очистка запомненного состояния прерывания, которое захвачено от каждого вывода PFx.

Этот механизм используется для того, чтобы избежать потенциальных проблем традиционных принципов работы с регистрами типа "read-modify-write". Чтение любого из этих регистров вернет состояние выводов GPIO.

ADSP BF538 PORTFIO SET

14-3. GPIO Port F Set Register.

ADSP BF538 PORTFIO CLEAR

14-4. GPIO Port F Clear Register.

ADSP BF538 PORTFIO TOGGLE

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.

ADSP BF538 GPIO Port F Interrupt Generation

Рис. 14-6. Алгоритм генерации прерывания GPIO Port F.

Примечание: эта схема одинаковая и для GPIO interrupt A, и для GPIO interrupt B (вместо x на диаграмме можно подставить A или B).

На рисунках от 14-7 до 14-10 показаны регистры для поддержки GPIO interrupt A.

ADSP BF538 PORTFIO MASKA

Рис. 14-7. GPIO Port F Mask Interrupt A Data Register (PORTFIO_MASKA).

ADSP BF538 PORTFIO MASKA SET

Рис. 14-8. GPIO Port F Mask Interrupt A Set Register (PORTFIO_MASKA_SET).

ADSP BF538 PORTFIO MASKA CLEAR

Рис. 14-9. GPIO Port F Mask Interrupt A Clear Register (PORTFIO_MASKA_CLEAR).

ADSP BF538 PORTFIO MASKA TOGGLE

Рис. 14-10. GPIO Port F Mask Interrupt A Toggle Register (PORTFIO_MASKA_TOGGLE).

На рисунках от 14-11 до 14-14 показаны регистры для поддержки GPIO interrupt B.

ADSP BF538 PORTFIO MASKB

Рис. 14-11. GPIO Port F Mask Interrupt B Data Register (PORTFIO_MASKB).

ADSP BF538 PORTFIO MASKB SET

Рис. 14-12. GPIO Port F Mask Interrupt B Set Register (PORTFIO_MASKB_SET).

ADSP BF538 PORTFIO MASKB CLEAR

Рис. 14-13. GPIO Port F Mask Interrupt B Clear Register (PORTFIO_MASKB_CLEAR).

ADSP BF538 PORTFIO MASKB TOGGLE

Рис. 14-14. GPIO Port F Mask Interrupt B Toggle Register (PORTFIO_MASKB_TOGGLE).

Регистр полярности GPIO (GPIO polarity register, PORTFIO_POLAR), показанный на рис. 14-15, используется для конфигурирования полярности входа GPIO. Чтобы выбрать активный уровень лог. 1 или фронт нарастания, сбросьте нужные биты в этом регистре в 0. Чтобы выбрать активный уровень лог. 0 или срез спада, установите нужные биты в этом регистре в 1.

Этот регистр не оказывает никакого влияния на выводы PFx, которые сконфигурированы как выходы. После сброса этот регистр очищается, следовательно по умолчанию задана активная положительная полярность (активный уровень лог. 1, активный перепад от 0 к 1).

ADSP BF538 PORTFIO POLAR

Рис. 14-15. GPIO Port F Polarity Register.

Регистр настройки вида сигнала для прерывания GPIO (GPIO interrupt sensitivity register, PORTFIO_EDGE), показанный на рис. 14-16, используется для конфигурирования каждого вывода GPIO на срабатывания прерывания либо от логического уровня (level-sensitive), либо от перепада (фронта или спада) входного сигнала (edge-sensitive). Когда используется режим edge-sensitive, схема детектирования перепада используется для аппаратного запоминания перепада, что предотвращает от потери очень коротких импульсов (которые сравнимы с периодом системной тактовой частоты или меньше его). Этот регистр не оказывает никакого влияния на выводы PFx, сконфигурированные как выходы.

После сброса содержимое этого регистра очищено, что означает срабатывание прерывания по уровню (level sensitivity).

ADSP BF538 PORTFIO EDGE

Рис. 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 прерывания, или настроены как выходы.

ADSP BF538 PORTFIO BOTH

Рис. 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 не будут распознаваться процессором.

ADSP BF538 PORTFIO INEN

Рис. 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 на другой.

[Ссылки]

1. ADSP-BF538/ADSP-BF538F Blackfin® Processor Hardware Reference site:analog.com.
2. ADSP-BF538: управление портами GPIO C, D, E.
3. VDK: служба программируемых флагов.