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 используют общие с периферийными устройствами выводы процессора.
В таблице 14-2 показано, как использовать функцию периферийного устройства, которая привязана к выводам PFx. Таблица 14-2. Как настроить использование функции периферийного устройства на выводах PFx.
Дополнительную информацию см. [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) - регистр данных. Эти регистры используются для следующих целей (каждый вывод PFx представлен отдельным битом в этих 4 регистрах): • Чтобы определить лог. уровень на выводах 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.
Для выводов, которые настроены на чувствительность к перепаду (edge-sensitive), чтение всегда будет возвращать 1 в случае обнаружения перепада. Т. е. появление перепада запоминается в этом бите как лог. 1, и эта лог. 1 останется в до тех пор, пока не будет сброшена программно. Для выводов, которые сконфигурированы на чувствительность к уровню (level-sensitive), состояние выводов проверяется в каждом цикле, так что читаемая величина будет отражать реальное текущее состояние сигнала на входе порта. Регистр данных, GPIO data register (PORTFIO), биты которого показаны на рис. 14-2, напрямую задают состояние всех выводов PFx. Т. е. если записать этот регистр, выходное состояние портов поменяется (у тех выводов портов, которые настроены как выходы). Если прочитать регистр PORTFIO, то прочитанное значение вернет состояние выводов PFx. Рис. 14-2. GPIO Port F Data Register. Регистры GPIO set (PORTFIO_SET), GPIO clear (PORTFIO_CLEAR) и GPIO toggle (PORTFIO_TOGGLE) используются для следующих целей: • Установка, очистка и переключение в противоположное состояние каждого выходного вывода 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. Прочитанный входной уровень базируется на настройках регистров 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). Эта реализация предоставляет возможность разрешить или запретить выводу 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 в бит.
Чтение любого из регистров 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). На рисунках от 14-7 до 14-10 показаны регистры для поддержки GPIO interrupt A. Рис. 14-7. GPIO Port F Mask Interrupt A Data Register (PORTFIO_MASKA). Рис. 14-8. GPIO Port F Mask Interrupt A Set Register (PORTFIO_MASKA_SET). Рис. 14-9. GPIO Port F Mask Interrupt A Clear Register (PORTFIO_MASKA_CLEAR). Рис. 14-10. GPIO Port F Mask Interrupt A Toggle Register (PORTFIO_MASKA_TOGGLE). На рисунках от 14-11 до 14-14 показаны регистры для поддержки GPIO interrupt B. Рис. 14-11. GPIO Port F Mask Interrupt B Data Register (PORTFIO_MASKB). Рис. 14-12. GPIO Port F Mask Interrupt B Set Register (PORTFIO_MASKB_SET). Рис. 14-13. GPIO Port F Mask Interrupt B Clear Register (PORTFIO_MASKB_CLEAR). Рис. 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). Рис. 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). Рис. 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.
Таблица B-14. Регистры GPIO Port D.
Таблица B-15. Регистры GPIO Port E.
Регистры GPIO port F (0xFFC0 0700 – 0xFFC0 07FF) Table B-16. Регистры GPIO Port F.
[Программируемые флаги] Двунаправленный 16-битный порт F (PF15 .. PF0) имеет дополнительный функционал, в отличие от остальных портов C, D и E. Каждая ножка порта F может индивидуально управляться через так называемую систему управления флагами и состоянием, причем к изменению уровня может быть привязана обработка прерывания. Поэтому ножки порта F называются в руководстве Analog Devices "флагами", что вносит некоторую путаницу. Таким образом, регистры порта F и портов C, D и E называются по разному: Flag direction control register - так называется регистр настройки направления работы (вход или выход) для порта F. Кроме того, у порта 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. |